/ Hex Artifact Content
Login

Artifact aca377f4091263a1103cf409340130bcafd87939:


0000: 2f 2a 0a 2a 2a 20 32 30 31 31 2d 30 38 2d 31 34  /*.** 2011-08-14
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 50 41 47 45 20 46 4f 52 4d 41  **.** PAGE FORMA
0180: 54 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 6d  T:.**.**   The m
0190: 61 78 69 6d 75 6d 20 70 61 67 65 20 73 69 7a 65  aximum page size
01a0: 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e   is 65536 bytes.
01b0: 0a 2a 2a 0a 2a 2a 20 20 20 53 69 6e 63 65 20 61  .**.**   Since a
01c0: 6c 6c 20 72 65 63 6f 72 64 73 20 61 72 65 20 65  ll records are e
01d0: 71 75 61 6c 20 74 6f 20 6f 72 20 6c 61 72 67 65  qual to or large
01e0: 72 20 74 68 61 6e 20 32 20 62 79 74 65 73 20 69  r than 2 bytes i
01f0: 6e 20 73 69 7a 65 2c 20 61 6e 64 20 0a 2a 2a 20  n size, and .** 
0200: 20 20 73 6f 6d 65 20 73 70 61 63 65 20 77 69 74    some space wit
0210: 68 69 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hin the page is 
0220: 63 6f 6e 73 75 6d 65 64 20 62 79 20 74 68 65 20  consumed by the 
0230: 70 61 67 65 20 66 6f 6f 74 65 72 2c 20 74 68 65  page footer, the
0240: 72 65 20 6d 75 73 74 0a 2a 2a 20 20 20 62 65 20  re must.**   be 
0250: 6c 65 73 73 20 74 68 61 6e 20 32 5e 31 35 20 72  less than 2^15 r
0260: 65 63 6f 72 64 73 20 6f 6e 20 65 61 63 68 20 70  ecords on each p
0270: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 45 61 63  age..**.**   Eac
0280: 68 20 70 61 67 65 20 65 6e 64 73 20 77 69 74 68  h page ends with
0290: 20 61 20 66 6f 6f 74 65 72 20 74 68 61 74 20 64   a footer that d
02a0: 65 73 63 72 69 62 65 73 20 74 68 65 20 70 61 67  escribes the pag
02b0: 65 73 20 63 6f 6e 74 65 6e 74 73 2e 20 54 68 69  es contents. Thi
02c0: 73 0a 2a 2a 20 20 20 66 6f 6f 74 65 72 20 73 65  s.**   footer se
02d0: 72 76 65 73 20 61 73 20 73 69 6d 69 6c 61 72 20  rves as similar 
02e0: 70 75 72 70 6f 73 65 20 74 6f 20 74 68 65 20 70  purpose to the p
02f0: 61 67 65 20 68 65 61 64 65 72 20 69 6e 20 61 6e  age header in an
0300: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0310: 2e 0a 2a 2a 20 20 20 41 20 66 6f 6f 74 65 72 20  ..**   A footer 
0320: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  is used instead 
0330: 6f 66 20 61 20 68 65 61 64 65 72 20 62 65 63 61  of a header beca
0340: 75 73 65 20 69 74 20 6d 61 6b 65 73 20 69 74 20  use it makes it 
0350: 65 61 73 69 65 72 20 74 6f 0a 2a 2a 20 20 20 70  easier to.**   p
0360: 6f 70 75 6c 61 74 65 20 61 20 6e 65 77 20 70 61  opulate a new pa
0370: 67 65 20 62 61 73 65 64 20 6f 6e 20 61 20 73 6f  ge based on a so
0380: 72 74 65 64 20 6c 69 73 74 20 6f 66 20 6b 65 79  rted list of key
0390: 2f 76 61 6c 75 65 20 70 61 69 72 73 2e 0a 2a 2a  /value pairs..**
03a0: 0a 2a 2a 20 20 20 54 68 65 20 66 6f 6f 74 65 72  .**   The footer
03b0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
03c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65   following value
03d0: 73 20 28 73 74 61 72 74 69 6e 67 20 61 74 20 74  s (starting at t
03e0: 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 74  he end of.**   t
03f0: 68 65 20 70 61 67 65 20 61 6e 64 20 63 6f 6e 74  he page and cont
0400: 69 6e 75 69 6e 67 20 62 61 63 6b 77 61 72 64 73  inuing backwards
0410: 20 74 6f 77 61 72 64 73 20 74 68 65 20 73 74 61   towards the sta
0420: 72 74 29 2e 20 41 6c 6c 20 76 61 6c 75 65 73 20  rt). All values 
0430: 61 72 65 0a 2a 2a 20 20 20 73 74 6f 72 65 64 20  are.**   stored 
0440: 61 73 20 75 6e 73 69 67 6e 65 64 20 62 69 67 2d  as unsigned big-
0450: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 73 2e  endian integers.
0460: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4e 75 6d  .**.**     * Num
0470: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 6f  ber of records o
0480: 6e 20 70 61 67 65 20 28 32 20 62 79 74 65 73 29  n page (2 bytes)
0490: 2e 0a 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73  ..**     * Flags
04a0: 20 66 69 65 6c 64 20 28 32 20 62 79 74 65 73 29   field (2 bytes)
04b0: 2e 0a 2a 2a 20 20 20 20 20 2a 20 4c 65 66 74 2d  ..**     * Left-
04c0: 68 61 6e 64 20 70 6f 69 6e 74 65 72 20 76 61 6c  hand pointer val
04d0: 75 65 20 28 38 20 62 79 74 65 73 29 2e 0a 2a 2a  ue (8 bytes)..**
04e0: 20 20 20 20 20 2a 20 54 68 65 20 73 74 61 72 74       * The start
04f0: 69 6e 67 20 6f 66 66 73 65 74 20 6f 66 20 65 61  ing offset of ea
0500: 63 68 20 72 65 63 6f 72 64 20 28 32 20 62 79 74  ch record (2 byt
0510: 65 73 20 70 65 72 20 72 65 63 6f 72 64 29 2e 0a  es per record)..
0520: 2a 2a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 73 20  **.**   Records 
0530: 6d 61 79 20 73 70 61 6e 20 70 61 67 65 73 2e 20  may span pages. 
0540: 55 6e 6c 65 73 73 20 69 74 20 68 61 70 70 65 6e  Unless it happen
0550: 73 20 74 6f 20 62 65 20 61 6e 20 65 78 61 63 74  s to be an exact
0560: 20 66 69 74 2c 20 74 68 65 20 70 61 72 74 0a 2a   fit, the part.*
0570: 2a 20 20 20 6f 66 20 74 68 65 20 66 69 6e 61 6c  *   of the final
0580: 20 72 65 63 6f 72 64 20 74 68 61 74 20 73 74 61   record that sta
0590: 72 74 73 20 6f 6e 20 70 61 67 65 20 58 20 74 68  rts on page X th
05a0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  at does not fit 
05b0: 6f 6e 20 70 61 67 65 20 58 0a 2a 2a 20 20 20 69  on page X.**   i
05c0: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
05d0: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 28 58  start of page (X
05e0: 2b 31 29 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  +1). This means 
05f0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 70 61 67  there may be pag
0600: 65 73 20 77 68 65 72 65 0a 2a 2a 20 20 20 28 4e  es where.**   (N
0610: 3d 3d 30 29 2e 20 41 6e 64 20 6f 6e 20 6d 6f 73  ==0). And on mos
0620: 74 20 70 61 67 65 73 20 74 68 65 20 66 69 72 73  t pages the firs
0630: 74 20 72 65 63 6f 72 64 20 74 68 61 74 20 73 74  t record that st
0640: 61 72 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65  arts on the page
0650: 20 77 69 6c 6c 0a 2a 2a 20 20 20 6e 6f 74 20 73   will.**   not s
0660: 74 61 72 74 20 61 74 20 62 79 74 65 20 6f 66 66  tart at byte off
0670: 73 65 74 20 30 2e 20 46 6f 72 20 65 78 61 6d 70  set 0. For examp
0680: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 61  le:.**.**      a
0690: 61 61 61 61 20 62 62 62 62 62 20 63 63 63 20 3c  aaaa bbbbb ccc <
06a0: 66 6f 6f 74 65 72 3e 20 20 20 20 63 63 20 65 65  footer>    cc ee
06b0: 65 65 65 20 66 66 66 66 66 20 67 20 3c 66 6f 6f  eee fffff g <foo
06c0: 74 65 72 3e 20 20 20 20 67 67 67 67 2e 2e 2e 2e  ter>    gggg....
06d0: 0a 2a 2a 0a 2a 2a 20 52 45 43 4f 52 44 20 46 4f  .**.** RECORD FO
06e0: 52 4d 41 54 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 54  RMAT:.** .**   T
06f0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
0700: 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 61   the record is a
0710: 20 66 6c 61 67 73 20 62 79 74 65 2e 20 49 74 20   flags byte. It 
0720: 69 73 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  is a combination
0730: 0a 2a 2a 20 20 20 6f 66 20 74 68 65 20 66 6f 6c  .**   of the fol
0740: 6c 6f 77 69 6e 67 20 66 6c 61 67 73 20 28 64 65  lowing flags (de
0750: 66 69 6e 65 64 20 69 6e 20 6c 73 6d 49 6e 74 2e  fined in lsmInt.
0760: 68 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  h):.**.**       
0770: 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54 45  LSM_START_DELETE
0780: 0a 2a 2a 20 20 20 20 20 20 20 4c 53 4d 5f 45 4e  .**       LSM_EN
0790: 44 5f 44 45 4c 45 54 45 20 0a 2a 2a 20 20 20 20  D_DELETE .**    
07a0: 20 20 20 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c     LSM_POINT_DEL
07b0: 45 54 45 0a 2a 2a 20 20 20 20 20 20 20 4c 53 4d  ETE.**       LSM
07c0: 5f 49 4e 53 45 52 54 20 20 20 20 0a 2a 2a 20 20  _INSERT    .**  
07d0: 20 20 20 20 20 4c 53 4d 5f 53 45 50 41 52 41 54       LSM_SEPARAT
07e0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 4c 53 4d 5f  OR.**       LSM_
07f0: 53 59 53 54 45 4d 4b 45 59 0a 2a 2a 0a 2a 2a 20  SYSTEMKEY.**.** 
0800: 20 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f    Immediately fo
0810: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 79 70 65  llowing the type
0820: 20 62 79 74 65 20 69 73 20 61 20 70 6f 69 6e 74   byte is a point
0830: 65 72 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65  er to the smalle
0840: 73 74 20 6b 65 79 20 0a 2a 2a 20 20 20 69 6e 20  st key .**   in 
0850: 74 68 65 20 6e 65 78 74 20 66 69 6c 65 20 74 68  the next file th
0860: 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
0870: 6e 20 74 68 65 20 6b 65 79 20 69 6e 20 74 68 65  n the key in the
0880: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 2e   current record.
0890: 20 54 68 65 20 0a 2a 2a 20 20 20 70 6f 69 6e 74   The .**   point
08a0: 65 72 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73  er is encoded as
08b0: 20 61 20 76 61 72 69 6e 74 2e 20 57 68 65 6e 20   a varint. When 
08c0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 33 32 2d  added to the 32-
08d0: 62 69 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  bit page number 
08e0: 0a 2a 2a 20 20 20 73 74 6f 72 65 64 20 69 6e 20  .**   stored in 
08f0: 74 68 65 20 66 6f 6f 74 65 72 2c 20 69 74 20 69  the footer, it i
0900: 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
0910: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  r of the page th
0920: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  at contains the.
0930: 2a 2a 20 20 20 73 6d 61 6c 6c 65 73 74 20 6b 65  **   smallest ke
0940: 79 20 69 6e 20 74 68 65 20 6e 65 78 74 20 73 6f  y in the next so
0950: 72 74 65 64 20 66 69 6c 65 20 74 68 61 74 20 69  rted file that i
0960: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
0970: 69 73 20 6b 65 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  is key. .**.**  
0980: 20 4e 65 78 74 20 69 73 20 74 68 65 20 6e 75 6d   Next is the num
0990: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
09a0: 74 68 65 20 6b 65 79 2c 20 65 6e 63 6f 64 65 64  the key, encoded
09b0: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
09c0: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 4c 53 4d  .**   If the LSM
09d0: 5f 49 4e 53 45 52 54 20 66 6c 61 67 20 69 73 20  _INSERT flag is 
09e0: 73 65 74 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  set, the number 
09f0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
0a00: 76 61 6c 75 65 2c 20 61 73 0a 2a 2a 20 20 20 61  value, as.**   a
0a10: 20 76 61 72 69 6e 74 2c 20 69 73 20 6e 65 78 74   varint, is next
0a20: 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 69 6e 61 6c 6c  ..**.**   Finall
0a30: 79 2c 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  y, the blob of d
0a40: 61 74 61 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ata containing t
0a50: 68 65 20 6b 65 79 2c 20 61 6e 64 20 66 6f 72 20  he key, and for 
0a60: 4c 53 4d 5f 49 4e 53 45 52 54 0a 2a 2a 20 20 20  LSM_INSERT.**   
0a70: 72 65 63 6f 72 64 73 2c 20 74 68 65 20 76 61 6c  records, the val
0a80: 75 65 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 0a  ue as well..*/..
0a90: 23 69 66 6e 64 65 66 20 5f 4c 53 4d 5f 49 4e 54  #ifndef _LSM_INT
0aa0: 5f 48 0a 23 20 69 6e 63 6c 75 64 65 20 22 6c 73  _H.# include "ls
0ab0: 6d 49 6e 74 2e 68 22 0a 23 65 6e 64 69 66 0a 23  mInt.h".#endif.#
0ac0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
0ad0: 2e 68 22 20 20 20 20 20 20 20 20 20 20 20 20 2f  .h"            /
0ae0: 2a 20 6f 6e 6c 79 20 66 6f 72 20 73 71 6c 69 74  * only for sqlit
0af0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 20 2a 2f  e3_snprintf() */
0b00: 0a 0a 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4c 4f  ..#define LSM_LO
0b10: 47 5f 53 54 52 55 43 54 55 52 45 20 30 0a 23 64  G_STRUCTURE 0.#d
0b20: 65 66 69 6e 65 20 4c 53 4d 5f 4c 4f 47 5f 44 41  efine LSM_LOG_DA
0b30: 54 41 20 20 20 20 20 20 30 0a 0a 2f 2a 0a 2a 2a  TA      0../*.**
0b40: 20 4d 61 63 72 6f 73 20 74 6f 20 68 65 6c 70 20   Macros to help 
0b50: 64 65 63 6f 64 65 20 72 65 63 6f 72 64 20 74 79  decode record ty
0b60: 70 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  pes..*/.#define 
0b70: 72 74 54 6f 70 69 63 28 65 54 79 70 65 29 20 20  rtTopic(eType)  
0b80: 20 20 20 20 20 28 28 65 54 79 70 65 29 20 26 20       ((eType) & 
0b90: 4c 53 4d 5f 53 59 53 54 45 4d 4b 45 59 29 0a 23  LSM_SYSTEMKEY).#
0ba0: 64 65 66 69 6e 65 20 72 74 49 73 44 65 6c 65 74  define rtIsDelet
0bb0: 65 28 65 54 79 70 65 29 20 20 20 20 28 28 28 65  e(eType)    (((e
0bc0: 54 79 70 65 29 20 26 20 30 78 30 46 29 3d 3d 4c  Type) & 0x0F)==L
0bd0: 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c 45 54 45 29  SM_POINT_DELETE)
0be0: 0a 0a 23 64 65 66 69 6e 65 20 72 74 49 73 53 65  ..#define rtIsSe
0bf0: 70 61 72 61 74 6f 72 28 65 54 79 70 65 29 20 28  parator(eType) (
0c00: 28 28 65 54 79 70 65 29 20 26 20 4c 53 4d 5f 53  ((eType) & LSM_S
0c10: 45 50 41 52 41 54 4f 52 29 21 3d 30 29 0a 23 64  EPARATOR)!=0).#d
0c20: 65 66 69 6e 65 20 72 74 49 73 57 72 69 74 65 28  efine rtIsWrite(
0c30: 65 54 79 70 65 29 20 20 20 20 20 28 28 28 65 54  eType)     (((eT
0c40: 79 70 65 29 20 26 20 4c 53 4d 5f 49 4e 53 45 52  ype) & LSM_INSER
0c50: 54 29 21 3d 30 29 0a 23 64 65 66 69 6e 65 20 72  T)!=0).#define r
0c60: 74 49 73 53 79 73 74 65 6d 28 65 54 79 70 65 29  tIsSystem(eType)
0c70: 20 20 20 20 28 28 28 65 54 79 70 65 29 20 26 20      (((eType) & 
0c80: 4c 53 4d 5f 53 59 53 54 45 4d 4b 45 59 29 21 3d  LSM_SYSTEMKEY)!=
0c90: 30 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  0)../*.** The fo
0ca0: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20 61  llowing macros a
0cb0: 72 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  re used to acces
0cc0: 73 20 61 20 70 61 67 65 20 66 6f 6f 74 65 72 2e  s a page footer.
0cd0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 45 47 4d  .*/.#define SEGM
0ce0: 45 4e 54 5f 4e 52 45 43 4f 52 44 5f 4f 46 46 53  ENT_NRECORD_OFFS
0cf0: 45 54 28 70 67 73 7a 29 20 20 20 20 20 20 20 20  ET(pgsz)        
0d00: 28 28 70 67 73 7a 29 20 2d 20 32 29 0a 23 64 65  ((pgsz) - 2).#de
0d10: 66 69 6e 65 20 53 45 47 4d 45 4e 54 5f 46 4c 41  fine SEGMENT_FLA
0d20: 47 53 5f 4f 46 46 53 45 54 28 70 67 73 7a 29 20  GS_OFFSET(pgsz) 
0d30: 20 20 20 20 20 20 20 20 20 28 28 70 67 73 7a 29           ((pgsz)
0d40: 20 2d 20 32 20 2d 20 32 29 0a 23 64 65 66 69 6e   - 2 - 2).#defin
0d50: 65 20 53 45 47 4d 45 4e 54 5f 50 4f 49 4e 54 45  e SEGMENT_POINTE
0d60: 52 5f 4f 46 46 53 45 54 28 70 67 73 7a 29 20 20  R_OFFSET(pgsz)  
0d70: 20 20 20 20 20 20 28 28 70 67 73 7a 29 20 2d 20        ((pgsz) - 
0d80: 32 20 2d 20 32 20 2d 20 38 29 0a 23 64 65 66 69  2 - 2 - 8).#defi
0d90: 6e 65 20 53 45 47 4d 45 4e 54 5f 43 45 4c 4c 50  ne SEGMENT_CELLP
0da0: 54 52 5f 4f 46 46 53 45 54 28 70 67 73 7a 2c 20  TR_OFFSET(pgsz, 
0db0: 69 43 65 6c 6c 29 20 28 28 70 67 73 7a 29 20 2d  iCell) ((pgsz) -
0dc0: 20 32 20 2d 20 32 20 2d 20 38 20 2d 20 32 20 2d   2 - 2 - 8 - 2 -
0dd0: 20 28 69 43 65 6c 6c 29 2a 32 29 0a 0a 23 64 65   (iCell)*2)..#de
0de0: 66 69 6e 65 20 53 45 47 4d 45 4e 54 5f 45 4f 46  fine SEGMENT_EOF
0df0: 28 70 67 73 7a 2c 20 6e 45 6e 74 72 79 29 20 53  (pgsz, nEntry) S
0e00: 45 47 4d 45 4e 54 5f 43 45 4c 4c 50 54 52 5f 4f  EGMENT_CELLPTR_O
0e10: 46 46 53 45 54 28 70 67 73 7a 2c 20 6e 45 6e 74  FFSET(pgsz, nEnt
0e20: 72 79 29 0a 0a 23 64 65 66 69 6e 65 20 53 45 47  ry)..#define SEG
0e30: 4d 45 4e 54 5f 42 54 52 45 45 5f 46 4c 41 47 20  MENT_BTREE_FLAG 
0e40: 20 20 20 20 30 78 30 30 30 31 0a 23 64 65 66 69      0x0001.#defi
0e50: 6e 65 20 50 47 46 54 52 5f 53 4b 49 50 5f 4e 45  ne PGFTR_SKIP_NE
0e60: 58 54 5f 46 4c 41 47 20 20 20 30 78 30 30 30 32  XT_FLAG   0x0002
0e70: 0a 23 64 65 66 69 6e 65 20 50 47 46 54 52 5f 53  .#define PGFTR_S
0e80: 4b 49 50 5f 54 48 49 53 5f 46 4c 41 47 20 20 20  KIP_THIS_FLAG   
0e90: 30 78 30 30 30 34 0a 0a 74 79 70 65 64 65 66 20  0x0004..typedef 
0ea0: 73 74 72 75 63 74 20 53 65 67 6d 65 6e 74 50 74  struct SegmentPt
0eb0: 72 20 53 65 67 6d 65 6e 74 50 74 72 3b 0a 74 79  r SegmentPtr;.ty
0ec0: 70 65 64 65 66 20 73 74 72 75 63 74 20 42 6c 6f  pedef struct Blo
0ed0: 62 20 42 6c 6f 62 3b 0a 0a 73 74 72 75 63 74 20  b Blob;..struct 
0ee0: 42 6c 6f 62 20 7b 0a 20 20 6c 73 6d 5f 65 6e 76  Blob {.  lsm_env
0ef0: 20 2a 70 45 6e 76 3b 0a 20 20 76 6f 69 64 20 2a   *pEnv;.  void *
0f00: 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 44 61  pData;.  int nDa
0f10: 74 61 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63  ta;.  int nAlloc
0f20: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 53 65  ;.};../*.** A Se
0f30: 67 6d 65 6e 74 50 74 72 20 6f 62 6a 65 63 74 20  gmentPtr object 
0f40: 6d 61 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  may be used for 
0f50: 6f 6e 65 20 6f 66 20 74 77 6f 20 70 75 72 70 6f  one of two purpo
0f60: 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ses:.**.**   * T
0f70: 6f 20 69 74 65 72 61 74 65 20 61 6e 64 2f 6f 72  o iterate and/or
0f80: 20 73 65 65 6b 20 77 69 74 68 69 6e 20 61 20 73   seek within a s
0f90: 69 6e 67 6c 65 20 53 65 67 6d 65 6e 74 20 28 74  ingle Segment (t
0fa0: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
0fb0: 66 20 61 20 0a 2a 2a 20 20 20 20 20 6d 61 69 6e  f a .**     main
0fc0: 20 72 75 6e 20 61 6e 64 20 61 6e 20 6f 70 74 69   run and an opti
0fd0: 6f 6e 61 6c 20 73 6f 72 74 65 64 20 72 75 6e 29  onal sorted run)
0fe0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 6f 20 69  ..**.**   * To i
0ff0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
1000: 68 65 20 73 65 70 61 72 61 74 6f 72 73 20 61 72  he separators ar
1010: 72 61 79 20 6f 66 20 61 20 73 65 67 6d 65 6e 74  ray of a segment
1020: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 65 67 6d  ..*/.struct Segm
1030: 65 6e 74 50 74 72 20 7b 0a 20 20 4c 65 76 65 6c  entPtr {.  Level
1040: 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20   *pLevel;       
1050: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
1060: 6c 20 6f 62 6a 65 63 74 20 73 65 67 6d 65 6e 74  l object segment
1070: 20 69 73 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20   is part of */. 
1080: 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20   Segment *pSeg; 
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10a0: 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 61 63 63  * Segment to acc
10b0: 65 73 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 75 72  ess */..  /* Cur
10c0: 72 65 6e 74 20 70 61 67 65 2e 20 53 65 65 20 73  rent page. See s
10d0: 65 67 6d 65 6e 74 50 74 72 4c 6f 61 64 50 61 67  egmentPtrLoadPag
10e0: 65 28 29 2e 20 2a 2f 0a 20 20 50 61 67 65 20 2a  e(). */.  Page *
10f0: 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
1100: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1110: 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36  nt page */.  u16
1120: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
1130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1140: 70 79 20 6f 66 20 70 61 67 65 20 66 6c 61 67 73  py of page flags
1150: 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20   field */.  int 
1160: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
1170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1180: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
1190: 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  pPg */.  Pgno iP
11a0: 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
11b0: 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 63         /* Base c
11c0: 61 73 63 61 64 65 20 70 6f 69 6e 74 65 72 20 2a  ascade pointer *
11d0: 2f 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74 20  /..  /* Current 
11e0: 63 65 6c 6c 2e 20 53 65 65 20 73 65 67 6d 65 6e  cell. See segmen
11f0: 74 50 74 72 4c 6f 61 64 43 65 6c 6c 28 29 20 2a  tPtrLoadCell() *
1200: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 3b 20 20  /.  int iCell;  
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 65 63    /* Current rec
1230: 6f 72 64 20 77 69 74 68 69 6e 20 70 61 67 65 20  ord within page 
1240: 70 50 67 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  pPg */.  int eTy
1250: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pe;             
1260: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
1270: 66 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  f current record
1280: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 67 50 74   */.  Pgno iPgPt
1290: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
12a0: 20 20 20 20 2f 2a 20 43 61 73 63 61 64 65 20 70      /* Cascade p
12b0: 6f 69 6e 74 65 72 20 6f 66 66 73 65 74 20 2a 2f  ointer offset */
12c0: 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 20 69  .  void *pKey; i
12d0: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
12e0: 20 2f 2a 20 4b 65 79 20 61 73 73 6f 63 69 61 74   /* Key associat
12f0: 65 64 20 77 69 74 68 20 63 75 72 72 65 6e 74 20  ed with current 
1300: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 76 6f 69 64  record */.  void
1310: 20 2a 70 56 61 6c 3b 20 69 6e 74 20 6e 56 61 6c   *pVal; int nVal
1320: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72  ;         /* Cur
1330: 72 65 6e 74 20 72 65 63 6f 72 64 20 76 61 6c 75  rent record valu
1340: 65 20 28 65 54 79 70 65 3d 3d 57 52 49 54 45 20  e (eType==WRITE 
1350: 6f 6e 6c 79 29 20 2a 2f 0a 0a 20 20 2f 2a 20 42  only) */..  /* B
1360: 6c 6f 62 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  lobs used to all
1370: 6f 63 61 74 65 20 62 75 66 66 65 72 73 20 66 6f  ocate buffers fo
1380: 72 20 70 4b 65 79 20 61 6e 64 20 70 56 61 6c 20  r pKey and pVal 
1390: 61 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  as required */. 
13a0: 20 42 6c 6f 62 20 62 6c 6f 62 31 3b 0a 20 20 42   Blob blob1;.  B
13b0: 6c 6f 62 20 62 6c 6f 62 32 3b 0a 7d 3b 0a 0a 2f  lob blob2;.};../
13c0: 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 69 74 65  *.** Used to ite
13d0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
13e0: 20 6b 65 79 73 20 73 74 6f 72 65 64 20 69 6e 20   keys stored in 
13f0: 61 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63  a b-tree hierarc
1400: 68 79 20 66 72 6f 6d 20 73 74 61 72 74 0a 2a 2a  hy from start.**
1410: 20 74 6f 20 66 69 6e 69 73 68 2e 20 4f 6e 6c 79   to finish. Only
1420: 20 46 69 72 73 74 28 29 20 61 6e 64 20 4e 65 78   First() and Nex
1430: 74 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  t() operations a
1440: 72 65 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a  re required..**.
1450: 2a 2a 20 20 20 62 74 72 65 65 43 75 72 73 6f 72  **   btreeCursor
1460: 4e 65 77 28 29 0a 2a 2a 20 20 20 62 74 72 65 65  New().**   btree
1470: 43 75 72 73 6f 72 46 69 72 73 74 28 29 0a 2a 2a  CursorFirst().**
1480: 20 20 20 62 74 72 65 65 43 75 72 73 6f 72 4e 65     btreeCursorNe
1490: 78 74 28 29 0a 2a 2a 20 20 20 62 74 72 65 65 43  xt().**   btreeC
14a0: 75 72 73 6f 72 46 72 65 65 28 29 0a 2a 2a 20 20  ursorFree().**  
14b0: 20 62 74 72 65 65 43 75 72 73 6f 72 50 6f 73 69   btreeCursorPosi
14c0: 74 69 6f 6e 28 29 0a 2a 2a 20 20 20 62 74 72 65  tion().**   btre
14d0: 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29  eCursorRestore()
14e0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
14f0: 63 74 20 42 74 72 65 65 50 67 20 42 74 72 65 65  ct BtreePg Btree
1500: 50 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  Pg;.typedef stru
1510: 63 74 20 42 74 72 65 65 43 75 72 73 6f 72 20 42  ct BtreeCursor B
1520: 74 72 65 65 43 75 72 73 6f 72 3b 0a 73 74 72 75  treeCursor;.stru
1530: 63 74 20 42 74 72 65 65 50 67 20 7b 0a 20 20 50  ct BtreePg {.  P
1540: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e  age *pPage;.  in
1550: 74 20 69 43 65 6c 6c 3b 0a 7d 3b 0a 73 74 72 75  t iCell;.};.stru
1560: 63 74 20 42 74 72 65 65 43 75 72 73 6f 72 20 7b  ct BtreeCursor {
1570: 0a 20 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  .  Segment *pSeg
1580: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1590: 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
15a0: 72 6f 75 67 68 20 74 68 69 73 20 73 65 67 6d 65  rough this segme
15b0: 6e 74 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 46  nts btree */.  F
15c0: 69 6c 65 53 79 73 74 65 6d 20 2a 70 46 53 3b 20  ileSystem *pFS; 
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15e0: 2a 20 46 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  * File system to
15f0: 20 72 65 61 64 20 70 61 67 65 73 20 66 72 6f 6d   read pages from
1600: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 65 70 74 68   */.  int nDepth
1610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1620: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
1630: 65 64 20 73 69 7a 65 20 6f 66 20 61 50 67 5b 5d  ed size of aPg[]
1640: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 67 3b 20 20   */.  int iPg;  
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1670: 20 65 6e 74 72 79 20 69 6e 20 61 50 67 5b 5d 2e   entry in aPg[].
1680: 20 2d 31 20 2d 3e 20 45 4f 46 2e 20 2a 2f 0a 20   -1 -> EOF. */. 
1690: 20 42 74 72 65 65 50 67 20 2a 61 50 67 3b 20 20   BtreePg *aPg;  
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 2f 2a 20 50 61 67 65 73 20 66 72 6f 6d 20 72   /* Pages from r
16c0: 6f 6f 74 20 74 6f 20 63 75 72 72 65 6e 74 20 6c  oot to current l
16d0: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  ocation */..  /*
16e0: 20 43 61 63 68 65 20 6f 66 20 63 75 72 72 65 6e   Cache of curren
16f0: 74 20 65 6e 74 72 79 2e 20 70 4b 65 79 3d 3d 30  t entry. pKey==0
1700: 20 66 6f 72 20 45 4f 46 2e 20 2a 2f 0a 20 20 76   for EOF. */.  v
1710: 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 69 6e 74  oid *pKey;.  int
1720: 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 65 54 79   nKey;.  int eTy
1730: 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 3b  pe;.  Pgno iPtr;
1740: 0a 0a 20 20 2f 2a 20 53 74 6f 72 61 67 65 20 66  ..  /* Storage f
1750: 6f 72 20 6b 65 79 2c 20 69 66 20 6e 6f 74 20 6c  or key, if not l
1760: 6f 63 61 6c 20 2a 2f 0a 20 20 42 6c 6f 62 20 62  ocal */.  Blob b
1770: 6c 6f 62 3b 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  lob;.};.../*.** 
1780: 41 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  A cursor used fo
1790: 72 20 6d 65 72 67 65 64 20 73 65 61 72 63 68 65  r merged searche
17a0: 73 20 6f 72 20 69 74 65 72 61 74 69 6f 6e 73 20  s or iterations 
17b0: 74 68 72 6f 75 67 68 20 75 70 20 74 6f 20 6f 6e  through up to on
17c0: 65 0a 2a 2a 20 54 72 65 65 20 73 74 72 75 63 74  e.** Tree struct
17d0: 75 72 65 20 61 6e 64 20 61 6e 79 20 6e 75 6d 62  ure and any numb
17e0: 65 72 20 6f 66 20 73 6f 72 74 65 64 20 66 69 6c  er of sorted fil
17f0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 6c 73 6d 4d  es..**.**   lsmM
1800: 43 75 72 73 6f 72 4e 65 77 28 29 0a 2a 2a 20 20  CursorNew().**  
1810: 20 6c 73 6d 4d 43 75 72 73 6f 72 53 65 65 6b 28   lsmMCursorSeek(
1820: 29 0a 2a 2a 20 20 20 6c 73 6d 4d 43 75 72 73 6f  ).**   lsmMCurso
1830: 72 4e 65 78 74 28 29 0a 2a 2a 20 20 20 6c 73 6d  rNext().**   lsm
1840: 4d 43 75 72 73 6f 72 50 72 65 76 28 29 0a 2a 2a  MCursorPrev().**
1850: 20 20 20 6c 73 6d 4d 43 75 72 73 6f 72 46 69 72     lsmMCursorFir
1860: 73 74 28 29 0a 2a 2a 20 20 20 6c 73 6d 4d 43 75  st().**   lsmMCu
1870: 72 73 6f 72 4c 61 73 74 28 29 0a 2a 2a 20 20 20  rsorLast().**   
1880: 6c 73 6d 4d 43 75 72 73 6f 72 4b 65 79 28 29 0a  lsmMCursorKey().
1890: 2a 2a 20 20 20 6c 73 6d 4d 43 75 72 73 6f 72 56  **   lsmMCursorV
18a0: 61 6c 75 65 28 29 0a 2a 2a 20 20 20 6c 73 6d 4d  alue().**   lsmM
18b0: 43 75 72 73 6f 72 56 61 6c 69 64 28 29 0a 2a 2a  CursorValid().**
18c0: 0a 2a 2a 20 69 46 72 65 65 3a 0a 2a 2a 20 20 20  .** iFree:.**   
18d0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
18e0: 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 63 75   only used by cu
18f0: 72 73 6f 72 73 20 70 72 6f 76 69 64 69 6e 67 20  rsors providing 
1900: 69 6e 70 75 74 20 64 61 74 61 20 66 6f 72 20 61  input data for a
1910: 0a 2a 2a 20 20 20 6e 65 77 20 74 6f 70 2d 6c 65  .**   new top-le
1920: 76 65 6c 20 73 65 67 6d 65 6e 74 2e 20 53 75 63  vel segment. Suc
1930: 68 20 63 75 72 73 6f 72 73 20 6f 6e 6c 79 20 65  h cursors only e
1940: 76 65 72 20 69 74 65 72 61 74 65 20 66 6f 72 77  ver iterate forw
1950: 61 72 64 73 2c 20 6e 6f 74 0a 2a 2a 20 20 20 62  ards, not.**   b
1960: 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a 73 74 72  ackwards..*/.str
1970: 75 63 74 20 4d 75 6c 74 69 43 75 72 73 6f 72 20  uct MultiCursor 
1980: 7b 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 3b  {.  lsm_db *pDb;
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
19b0: 6e 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  n that owns this
19c0: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 4d 75 6c   cursor */.  Mul
19d0: 74 69 43 75 72 73 6f 72 20 2a 70 4e 65 78 74 3b  tiCursor *pNext;
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f0: 4e 65 78 74 20 63 75 72 73 6f 72 20 6f 77 6e 65  Next cursor owne
1a00: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  d by connection 
1a10: 70 44 62 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  pDb */.  int fla
1a20: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1a40: 20 6f 66 20 43 55 52 53 4f 52 5f 58 58 58 20 66   of CURSOR_XXX f
1a50: 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 65  lags */..  int e
1a60: 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  Type;           
1a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
1a80: 63 68 65 20 6f 66 20 63 75 72 72 65 6e 74 20 6b  che of current k
1a90: 65 79 20 74 79 70 65 20 2a 2f 0a 20 20 42 6c 6f  ey type */.  Blo
1aa0: 62 20 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20  b key;          
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac0: 43 61 63 68 65 20 6f 66 20 63 75 72 72 65 6e 74  Cache of current
1ad0: 20 6b 65 79 20 28 6f 72 20 4e 55 4c 4c 29 20 2a   key (or NULL) *
1ae0: 2f 0a 20 20 42 6c 6f 62 20 76 61 6c 3b 20 20 20  /.  Blob val;   
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 6f 66 20      /* Cache of 
1b10: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 2a 2f  current value */
1b20: 0a 0a 20 20 2f 2a 20 41 6c 6c 20 74 68 65 20 63  ..  /* All the c
1b30: 6f 6d 70 6f 6e 65 6e 74 20 63 75 72 73 6f 72 73  omponent cursors
1b40: 3a 20 2a 2f 0a 20 20 54 72 65 65 43 75 72 73 6f  : */.  TreeCurso
1b50: 72 20 2a 61 70 54 72 65 65 43 73 72 5b 32 5d 3b  r *apTreeCsr[2];
1b60: 20 20 20 20 20 20 20 2f 2a 20 55 70 20 74 6f 20         /* Up to 
1b70: 74 77 6f 20 74 72 65 65 20 63 75 72 73 6f 72 73  two tree cursors
1b80: 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 65 65 3b   */.  int iFree;
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6c        /* Next el
1bb0: 65 6d 65 6e 74 20 6f 66 20 66 72 65 65 2d 6c 69  ement of free-li
1bc0: 73 74 20 28 2d 76 65 20 66 6f 72 20 65 6f 66 29  st (-ve for eof)
1bd0: 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 50 74 72   */.  SegmentPtr
1be0: 20 2a 61 50 74 72 3b 20 20 20 20 20 20 20 20 20   *aPtr;         
1bf0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
1c00: 66 20 73 65 67 6d 65 6e 74 20 70 6f 69 6e 74 65  f segment pointe
1c10: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 74 72  rs */.  int nPtr
1c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c30: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1c40: 6f 66 20 61 72 72 61 79 20 61 50 74 72 5b 5d 20  of array aPtr[] 
1c50: 2a 2f 0a 20 20 42 74 72 65 65 43 75 72 73 6f 72  */.  BtreeCursor
1c60: 20 2a 70 42 74 43 73 72 3b 20 20 20 20 20 20 20   *pBtCsr;       
1c70: 20 20 20 20 20 2f 2a 20 62 2d 74 72 65 65 20 63       /* b-tree c
1c80: 75 72 73 6f 72 20 28 64 62 20 77 72 69 74 65 73  ursor (db writes
1c90: 20 6f 6e 6c 79 29 20 2a 2f 0a 0a 20 20 2f 2a 20   only) */..  /* 
1ca0: 43 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  Comparison resul
1cb0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 72 65  ts */.  int nTre
1cc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1cd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1ce0: 6f 66 20 61 54 72 65 65 5b 5d 20 61 72 72 61 79  of aTree[] array
1cf0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 54 72 65 65   */.  int *aTree
1d00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d10: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
1d20: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  f comparison res
1d30: 75 6c 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73  ults */..  /* Us
1d40: 65 64 20 62 79 20 63 75 72 73 6f 72 73 20 66 6c  ed by cursors fl
1d50: 75 73 68 69 6e 67 20 74 68 65 20 69 6e 2d 6d 65  ushing the in-me
1d60: 6d 6f 72 79 20 74 72 65 65 20 6f 6e 6c 79 20 2a  mory tree only *
1d70: 2f 0a 20 20 76 6f 69 64 20 2a 70 53 79 73 74 65  /.  void *pSyste
1d80: 6d 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  mVal;           
1d90: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1da0: 6f 20 62 75 66 66 65 72 20 74 6f 20 66 72 65 65  o buffer to free
1db0: 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 65 64 20 62   */..  /* Used b
1dc0: 79 20 77 6f 72 6b 65 72 20 63 75 72 73 6f 72 73  y worker cursors
1dd0: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 50 67 6e 6f 20   only */.  Pgno 
1de0: 2a 70 50 72 65 76 4d 65 72 67 65 50 74 72 3b 0a  *pPrevMergePtr;.
1df0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  };../*.** The fo
1e00: 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74  llowing constant
1e10: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 73  s are used to as
1e20: 73 69 67 6e 20 69 6e 74 65 67 65 72 73 20 74 6f  sign integers to
1e30: 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 0a   each component.
1e40: 2a 2a 20 63 75 72 73 6f 72 20 6f 66 20 61 20 6d  ** cursor of a m
1e50: 75 6c 74 69 2d 63 75 72 73 6f 72 2e 0a 2a 2f 0a  ulti-cursor..*/.
1e60: 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52 5f 44  #define CURSOR_D
1e70: 41 54 41 5f 54 52 45 45 30 20 20 20 20 20 30 20  ATA_TREE0     0 
1e80: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 72 65    /* Current tre
1e90: 65 20 63 75 72 73 6f 72 20 28 61 70 54 72 65 65  e cursor (apTree
1ea0: 43 73 72 5b 30 5d 29 20 2a 2f 0a 23 64 65 66 69  Csr[0]) */.#defi
1eb0: 6e 65 20 43 55 52 53 4f 52 5f 44 41 54 41 5f 54  ne CURSOR_DATA_T
1ec0: 52 45 45 31 20 20 20 20 20 31 20 20 20 2f 2a 20  REE1     1   /* 
1ed0: 54 68 65 20 22 6f 6c 64 22 20 74 72 65 65 2c 20  The "old" tree, 
1ee0: 69 66 20 61 6e 79 20 28 61 70 54 72 65 65 43 73  if any (apTreeCs
1ef0: 72 5b 31 5d 29 20 2a 2f 0a 23 64 65 66 69 6e 65  r[1]) */.#define
1f00: 20 43 55 52 53 4f 52 5f 44 41 54 41 5f 53 59 53   CURSOR_DATA_SYS
1f10: 54 45 4d 20 20 20 20 32 20 20 20 2f 2a 20 46 72  TEM    2   /* Fr
1f20: 65 65 2d 6c 69 73 74 20 65 6e 74 72 69 65 73 20  ee-list entries 
1f30: 28 6e 65 77 2d 74 6f 70 6c 65 76 65 6c 20 6f 6e  (new-toplevel on
1f40: 6c 79 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43  ly) */.#define C
1f50: 55 52 53 4f 52 5f 44 41 54 41 5f 53 45 47 4d 45  URSOR_DATA_SEGME
1f60: 4e 54 20 20 20 33 20 20 20 2f 2a 20 46 69 72 73  NT   3   /* Firs
1f70: 74 20 73 65 67 6d 65 6e 74 20 70 6f 69 6e 74 65  t segment pointe
1f80: 72 20 28 61 50 74 72 5b 30 5d 29 20 2a 2f 0a 0a  r (aPtr[0]) */..
1f90: 2f 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 47 4e  /*.** CURSOR_IGN
1fa0: 4f 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20  ORE_DELETE.**   
1fb0: 49 66 20 73 65 74 2c 20 74 68 69 73 20 63 75 72  If set, this cur
1fc0: 73 6f 72 20 77 69 6c 6c 20 6e 6f 74 20 76 69 73  sor will not vis
1fd0: 69 74 20 53 4f 52 54 45 44 5f 44 45 4c 45 54 45  it SORTED_DELETE
1fe0: 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 43 55 52   keys..**.** CUR
1ff0: 53 4f 52 5f 46 4c 55 53 48 5f 46 52 45 45 4c 49  SOR_FLUSH_FREELI
2000: 53 54 0a 2a 2a 20 20 20 54 68 69 73 20 63 75 72  ST.**   This cur
2010: 73 6f 72 20 69 73 20 62 65 69 6e 67 20 75 73 65  sor is being use
2020: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
2030: 77 20 74 6f 70 6c 65 76 65 6c 2e 20 49 74 20 73  w toplevel. It s
2040: 68 6f 75 6c 64 20 61 6c 73 6f 20 0a 2a 2a 20 20  hould also .**  
2050: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2060: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2070: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 66   the in-memory f
2080: 72 65 65 20 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a  ree block list..
2090: 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 47 4e  **.** CURSOR_IGN
20a0: 4f 52 45 5f 53 59 53 54 45 4d 0a 2a 2a 20 20 20  ORE_SYSTEM.**   
20b0: 49 66 20 73 65 74 2c 20 74 68 69 73 20 63 75 72  If set, this cur
20c0: 73 6f 72 20 69 67 6e 6f 72 65 73 20 73 79 73 74  sor ignores syst
20d0: 65 6d 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 43  em keys..**.** C
20e0: 55 52 53 4f 52 5f 4e 45 58 54 5f 4f 4b 0a 2a 2a  URSOR_NEXT_OK.**
20f0: 20 20 20 53 65 74 20 69 66 20 69 74 20 69 73 20     Set if it is 
2100: 4f 6b 20 74 6f 20 63 61 6c 6c 20 6c 73 6d 5f 63  Ok to call lsm_c
2110: 73 72 5f 6e 65 78 74 28 29 2e 0a 2a 2a 0a 2a 2a  sr_next()..**.**
2120: 20 43 55 52 53 4f 52 5f 50 52 45 56 5f 4f 4b 0a   CURSOR_PREV_OK.
2130: 2a 2a 20 20 20 53 65 74 20 69 66 20 69 74 20 69  **   Set if it i
2140: 73 20 4f 6b 20 74 6f 20 63 61 6c 6c 20 6c 73 6d  s Ok to call lsm
2150: 5f 63 73 72 5f 70 72 65 76 28 29 2e 0a 2a 2a 0a  _csr_prev()..**.
2160: 2a 2a 20 43 55 52 53 4f 52 5f 52 45 41 44 5f 53  ** CURSOR_READ_S
2170: 45 50 41 52 41 54 4f 52 53 0a 2a 2a 20 20 20 53  EPARATORS.**   S
2180: 65 74 20 69 66 20 74 68 69 73 20 63 75 72 73 6f  et if this curso
2190: 72 20 73 68 6f 75 6c 64 20 76 69 73 69 74 20 74  r should visit t
21a0: 68 65 20 73 65 70 61 72 61 74 6f 72 20 6b 65 79  he separator key
21b0: 73 20 69 6e 20 73 65 67 6d 65 6e 74 20 0a 2a 2a  s in segment .**
21c0: 20 20 20 61 50 74 72 5b 6e 50 74 72 2d 31 5d 2e     aPtr[nPtr-1].
21d0: 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 53 45  .**.** CURSOR_SE
21e0: 45 4b 5f 45 51 0a 2a 2a 20 20 20 43 75 72 73 6f  EK_EQ.**   Curso
21f0: 72 20 68 61 73 20 75 6e 64 65 72 67 6f 6e 65 20  r has undergone 
2200: 61 20 73 75 63 63 65 73 73 66 75 6c 20 6c 73 6d  a successful lsm
2210: 5f 63 73 72 5f 73 65 65 6b 28 4c 53 4d 5f 53 45  _csr_seek(LSM_SE
2220: 45 4b 5f 45 51 29 20 6f 70 65 72 61 74 69 6f 6e  EK_EQ) operation
2230: 2e 0a 2a 2a 20 20 20 54 68 65 20 6b 65 79 20 61  ..**   The key a
2240: 6e 64 20 76 61 6c 75 65 20 61 72 65 20 73 74 6f  nd value are sto
2250: 72 65 64 20 69 6e 20 4d 75 6c 74 69 43 75 72 73  red in MultiCurs
2260: 6f 72 2e 6b 65 79 20 61 6e 64 20 4d 75 6c 74 69  or.key and Multi
2270: 43 75 72 73 6f 72 2e 76 61 6c 0a 2a 2a 20 20 20  Cursor.val.**   
2280: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2f  respectively..*/
2290: 0a 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52 5f  .#define CURSOR_
22a0: 49 47 4e 4f 52 45 5f 44 45 4c 45 54 45 20 20 20  IGNORE_DELETE   
22b0: 20 30 78 30 30 30 30 30 30 30 31 0a 23 64 65 66   0x00000001.#def
22c0: 69 6e 65 20 43 55 52 53 4f 52 5f 46 4c 55 53 48  ine CURSOR_FLUSH
22d0: 5f 46 52 45 45 4c 49 53 54 20 20 20 30 78 30 30  _FREELIST   0x00
22e0: 30 30 30 30 30 32 0a 23 64 65 66 69 6e 65 20 43  000002.#define C
22f0: 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 53 59 53  URSOR_IGNORE_SYS
2300: 54 45 4d 20 20 20 20 30 78 30 30 30 30 30 30 31  TEM    0x0000001
2310: 30 0a 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52  0.#define CURSOR
2320: 5f 4e 45 58 54 5f 4f 4b 20 20 20 20 20 20 20 20  _NEXT_OK        
2330: 20 20 30 78 30 30 30 30 30 30 32 30 0a 23 64 65    0x00000020.#de
2340: 66 69 6e 65 20 43 55 52 53 4f 52 5f 50 52 45 56  fine CURSOR_PREV
2350: 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 30 78 30  _OK          0x0
2360: 30 30 30 30 30 34 30 0a 23 64 65 66 69 6e 65 20  0000040.#define 
2370: 43 55 52 53 4f 52 5f 52 45 41 44 5f 53 45 50 41  CURSOR_READ_SEPA
2380: 52 41 54 4f 52 53 20 20 30 78 30 30 30 30 30 30  RATORS  0x000000
2390: 38 30 0a 23 64 65 66 69 6e 65 20 43 55 52 53 4f  80.#define CURSO
23a0: 52 5f 53 45 45 4b 5f 45 51 20 20 20 20 20 20 20  R_SEEK_EQ       
23b0: 20 20 20 30 78 30 30 30 30 30 31 30 30 0a 0a 74     0x00000100..t
23c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 65  ypedef struct Me
23d0: 72 67 65 57 6f 72 6b 65 72 20 4d 65 72 67 65 57  rgeWorker MergeW
23e0: 6f 72 6b 65 72 3b 0a 74 79 70 65 64 65 66 20 73  orker;.typedef s
23f0: 74 72 75 63 74 20 48 69 65 72 61 72 63 68 79 20  truct Hierarchy 
2400: 48 69 65 72 61 72 63 68 79 3b 0a 0a 73 74 72 75  Hierarchy;..stru
2410: 63 74 20 48 69 65 72 61 72 63 68 79 20 7b 0a 20  ct Hierarchy {. 
2420: 20 50 61 67 65 20 2a 2a 61 70 48 69 65 72 3b 0a   Page **apHier;.
2430: 20 20 69 6e 74 20 6e 48 69 65 72 3b 0a 7d 3b 0a    int nHier;.};.
2440: 0a 2f 2a 0a 2a 2a 20 61 53 61 76 65 3a 0a 2a 2a  ./*.** aSave:.**
2450: 20 20 20 57 68 65 6e 20 6d 65 72 67 65 57 6f 72     When mergeWor
2460: 6b 65 72 4e 65 78 74 50 61 67 65 28 29 20 69 73  kerNextPage() is
2470: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 76 61 6e   called to advan
2480: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 70  ce to the next p
2490: 61 67 65 20 69 6e 0a 2a 2a 20 20 20 74 68 65 20  age in.**   the 
24a0: 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2c 20  output segment, 
24b0: 69 66 20 74 68 65 20 62 53 74 6f 72 65 20 66 6c  if the bStore fl
24c0: 61 67 20 66 6f 72 20 61 6e 20 65 6c 65 6d 65 6e  ag for an elemen
24d0: 74 20 6f 66 20 61 53 61 76 65 5b 5d 20 69 73 0a  t of aSave[] is.
24e0: 2a 2a 20 20 20 74 72 75 65 2c 20 69 74 20 69 73  **   true, it is
24f0: 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
2500: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
2510: 50 67 6e 6f 20 76 61 6c 75 65 20 69 73 20 73 65  Pgno value is se
2520: 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 70  t to the .**   p
2530: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2540: 65 20 70 61 67 65 20 6a 75 73 74 20 63 6f 6d 70  e page just comp
2550: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 61  leted..**.**   a
2560: 53 61 76 65 5b 30 5d 20 69 73 20 75 73 65 64 20  Save[0] is used 
2570: 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 70 6f  to record the po
2580: 69 6e 74 65 72 20 76 61 6c 75 65 20 74 6f 20 62  inter value to b
2590: 65 20 70 75 73 68 65 64 20 69 6e 74 6f 20 74 68  e pushed into th
25a0: 65 0a 2a 2a 20 20 20 62 2d 74 72 65 65 20 68 69  e.**   b-tree hi
25b0: 65 72 61 72 63 68 79 2e 20 61 53 61 76 65 5b 31  erarchy. aSave[1
25c0: 5d 20 69 73 20 75 73 65 64 20 74 6f 20 73 61 76  ] is used to sav
25d0: 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
25e0: 72 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 70 61  r of the.**   pa
25f0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
2600: 65 20 69 6e 64 69 72 65 63 74 20 6b 65 79 20 6d  e indirect key m
2610: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69  ost recently wri
2620: 74 74 65 6e 20 74 6f 20 74 68 65 20 62 2d 74 72  tten to the b-tr
2630: 65 65 2e 0a 2a 2a 20 20 20 73 65 65 20 6d 65 72  ee..**   see mer
2640: 67 65 57 6f 72 6b 65 72 50 75 73 68 48 69 65 72  geWorkerPushHier
2650: 61 72 63 68 79 28 29 20 66 6f 72 20 64 65 74 61  archy() for deta
2660: 69 6c 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4d  ils..*/.struct M
2670: 65 72 67 65 57 6f 72 6b 65 72 20 7b 0a 20 20 6c  ergeWorker {.  l
2680: 73 6d 5f 64 62 20 2a 70 44 62 3b 20 20 20 20 20  sm_db *pDb;     
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a0: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
26b0: 65 20 2a 2f 0a 20 20 4c 65 76 65 6c 20 2a 70 4c  e */.  Level *pL
26c0: 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  evel;           
26d0: 20 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 65 72         /* Worker
26e0: 20 73 6e 61 70 73 68 6f 74 20 4c 65 76 65 6c 20   snapshot Level 
26f0: 62 65 69 6e 67 20 6d 65 72 67 65 64 20 2a 2f 0a  being merged */.
2700: 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70    MultiCursor *p
2710: 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Csr;            
2720: 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72    /* Cursor to r
2730: 65 61 64 20 6e 65 77 20 73 65 67 6d 65 6e 74 20  ead new segment 
2740: 63 6f 6e 74 65 6e 74 73 20 66 72 6f 6d 20 2a 2f  contents from */
2750: 0a 20 20 69 6e 74 20 62 46 6c 75 73 68 3b 20 20  .  int bFlush;  
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2780: 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2790: 72 79 20 74 72 65 65 20 66 6c 75 73 68 20 2a 2f  ry tree flush */
27a0: 0a 20 20 48 69 65 72 61 72 63 68 79 20 68 69 65  .  Hierarchy hie
27b0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
27c0: 20 20 20 2f 2a 20 42 2d 74 72 65 65 20 68 69 65     /* B-tree hie
27d0: 72 61 72 63 68 79 20 75 6e 64 65 72 20 63 6f 6e  rarchy under con
27e0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  struction */.  P
27f0: 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2810: 2a 20 43 75 72 72 65 6e 74 20 6f 75 74 70 75 74  * Current output
2820: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
2830: 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Work;           
2840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2850: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
2860: 20 6d 65 72 67 65 57 6f 72 6b 65 72 4e 65 78 74   mergeWorkerNext
2870: 50 61 67 65 28 29 20 2a 2f 0a 20 20 50 67 6e 6f  Page() */.  Pgno
2880: 20 2a 61 47 6f 62 62 6c 65 3b 20 20 20 20 20 20   *aGobble;      
2890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47              /* G
28a0: 6f 62 62 6c 65 20 70 6f 69 6e 74 20 66 6f 72 20  obble point for 
28b0: 65 61 63 68 20 69 6e 70 75 74 20 73 65 67 6d 65  each input segme
28c0: 6e 74 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20 69 49  nt */..  Pgno iI
28d0: 6e 64 69 72 65 63 74 3b 0a 20 20 73 74 72 75 63  ndirect;.  struc
28e0: 74 20 53 61 76 65 64 50 67 6e 6f 20 7b 0a 20 20  t SavedPgno {.  
28f0: 20 20 50 67 6e 6f 20 69 50 67 6e 6f 3b 0a 20 20    Pgno iPgno;.  
2900: 20 20 69 6e 74 20 62 53 74 6f 72 65 3b 0a 20 20    int bStore;.  
2910: 7d 20 61 53 61 76 65 5b 32 5d 3b 0a 7d 3b 0a 0a  } aSave[2];.};..
2920: 23 69 66 64 65 66 20 4c 53 4d 5f 44 45 42 55 47  #ifdef LSM_DEBUG
2930: 5f 45 58 50 45 4e 53 49 56 45 0a 73 74 61 74 69  _EXPENSIVE.stati
2940: 63 20 69 6e 74 20 61 73 73 65 72 74 50 6f 69 6e  c int assertPoin
2950: 74 65 72 73 4f 6b 28 6c 73 6d 5f 64 62 20 2a 2c  tersOk(lsm_db *,
2960: 20 53 65 67 6d 65 6e 74 20 2a 2c 20 53 65 67 6d   Segment *, Segm
2970: 65 6e 74 20 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  ent *, int);.sta
2980: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 42 74  tic int assertBt
2990: 72 65 65 4f 6b 28 6c 73 6d 5f 64 62 20 2a 2c 20  reeOk(lsm_db *, 
29a0: 53 65 67 6d 65 6e 74 20 2a 29 3b 0a 73 74 61 74  Segment *);.stat
29b0: 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 52 75  ic void assertRu
29c0: 6e 49 6e 4f 72 64 65 72 28 6c 73 6d 5f 64 62 20  nInOrder(lsm_db 
29d0: 2a 70 44 62 2c 20 53 65 67 6d 65 6e 74 20 2a 70  *pDb, Segment *p
29e0: 53 65 67 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66  Seg);.#else.#def
29f0: 69 6e 65 20 61 73 73 65 72 74 52 75 6e 49 6e 4f  ine assertRunInO
2a00: 72 64 65 72 28 78 2c 79 29 0a 23 64 65 66 69 6e  rder(x,y).#defin
2a10: 65 20 61 73 73 65 72 74 42 74 72 65 65 4f 6b 28  e assertBtreeOk(
2a20: 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 0a 73 74  x,y).#endif...st
2a30: 72 75 63 74 20 46 69 6c 65 50 61 67 65 20 7b 20  ruct FilePage { 
2a40: 75 38 20 2a 61 44 61 74 61 3b 20 69 6e 74 20 6e  u8 *aData; int n
2a50: 44 61 74 61 3b 20 7d 3b 0a 73 74 61 74 69 63 20  Data; };.static 
2a60: 75 38 20 2a 66 73 50 61 67 65 44 61 74 61 28 50  u8 *fsPageData(P
2a70: 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 2a 70  age *pPg, int *p
2a80: 6e 44 61 74 61 29 7b 0a 20 20 2a 70 6e 44 61 74  nData){.  *pnDat
2a90: 61 20 3d 20 28 28 73 74 72 75 63 74 20 46 69 6c  a = ((struct Fil
2aa0: 65 50 61 67 65 20 2a 29 28 70 50 67 29 29 2d 3e  ePage *)(pPg))->
2ab0: 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20  nData;.  return 
2ac0: 28 28 73 74 72 75 63 74 20 46 69 6c 65 50 61 67  ((struct FilePag
2ad0: 65 20 2a 29 28 70 50 67 29 29 2d 3e 61 44 61 74  e *)(pPg))->aDat
2ae0: 61 3b 0a 7d 0a 2f 2a 55 4e 55 53 45 44 20 73 74  a;.}./*UNUSED st
2af0: 61 74 69 63 20 75 38 20 2a 66 73 50 61 67 65 44  atic u8 *fsPageD
2b00: 61 74 61 50 74 72 28 50 61 67 65 20 2a 70 50 67  ataPtr(Page *pPg
2b10: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 73 74  ){.  return ((st
2b20: 72 75 63 74 20 46 69 6c 65 50 61 67 65 20 2a 29  ruct FilePage *)
2b30: 28 70 50 67 29 29 2d 3e 61 44 61 74 61 3b 0a 7d  (pPg))->aData;.}
2b40: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  */../*.** Write 
2b50: 6e 56 61 6c 20 61 73 20 61 20 31 36 2d 62 69 74  nVal as a 16-bit
2b60: 20 75 6e 73 69 67 6e 65 64 20 62 69 67 2d 65 6e   unsigned big-en
2b70: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74  dian integer int
2b80: 6f 20 62 75 66 66 65 72 20 61 4f 75 74 2e 0a 2a  o buffer aOut..*
2b90: 2f 0a 76 6f 69 64 20 6c 73 6d 50 75 74 55 31 36  /.void lsmPutU16
2ba0: 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20 6e  (u8 *aOut, u16 n
2bb0: 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d 20  Val){.  aOut[0] 
2bc0: 3d 20 28 75 38 29 28 28 6e 56 61 6c 3e 3e 38 29  = (u8)((nVal>>8)
2bd0: 20 26 20 30 78 46 46 29 3b 0a 20 20 61 4f 75 74   & 0xFF);.  aOut
2be0: 5b 31 5d 20 3d 20 28 75 38 29 28 6e 56 61 6c 20  [1] = (u8)(nVal 
2bf0: 26 20 30 78 46 46 29 3b 0a 7d 0a 0a 76 6f 69 64  & 0xFF);.}..void
2c00: 20 6c 73 6d 50 75 74 55 33 32 28 75 38 20 2a 61   lsmPutU32(u8 *a
2c10: 4f 75 74 2c 20 75 33 32 20 6e 56 61 6c 29 7b 0a  Out, u32 nVal){.
2c20: 20 20 61 4f 75 74 5b 30 5d 20 3d 20 28 75 38 29    aOut[0] = (u8)
2c30: 28 28 6e 56 61 6c 3e 3e 32 34 29 20 26 20 30 78  ((nVal>>24) & 0x
2c40: 46 46 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d  FF);.  aOut[1] =
2c50: 20 28 75 38 29 28 28 6e 56 61 6c 3e 3e 31 36 29   (u8)((nVal>>16)
2c60: 20 26 20 30 78 46 46 29 3b 0a 20 20 61 4f 75 74   & 0xFF);.  aOut
2c70: 5b 32 5d 20 3d 20 28 75 38 29 28 28 6e 56 61 6c  [2] = (u8)((nVal
2c80: 3e 3e 20 38 29 20 26 20 30 78 46 46 29 3b 0a 20  >> 8) & 0xFF);. 
2c90: 20 61 4f 75 74 5b 33 5d 20 3d 20 28 75 38 29 28   aOut[3] = (u8)(
2ca0: 28 6e 56 61 6c 20 20 20 20 29 20 26 20 30 78 46  (nVal    ) & 0xF
2cb0: 46 29 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 47 65  F);.}..int lsmGe
2cc0: 74 55 31 36 28 75 38 20 2a 61 4f 75 74 29 7b 0a  tU16(u8 *aOut){.
2cd0: 20 20 72 65 74 75 72 6e 20 28 61 4f 75 74 5b 30    return (aOut[0
2ce0: 5d 20 3c 3c 20 38 29 20 2b 20 61 4f 75 74 5b 31  ] << 8) + aOut[1
2cf0: 5d 3b 0a 7d 0a 0a 75 33 32 20 6c 73 6d 47 65 74  ];.}..u32 lsmGet
2d00: 55 33 32 28 75 38 20 2a 61 4f 75 74 29 7b 0a 20  U32(u8 *aOut){. 
2d10: 20 72 65 74 75 72 6e 20 28 28 75 33 32 29 61 4f   return ((u32)aO
2d20: 75 74 5b 30 5d 20 3c 3c 20 32 34 29 20 0a 20 20  ut[0] << 24) .  
2d30: 20 20 20 20 20 2b 20 28 28 75 33 32 29 61 4f 75       + ((u32)aOu
2d40: 74 5b 31 5d 20 3c 3c 20 31 36 29 20 0a 20 20 20  t[1] << 16) .   
2d50: 20 20 20 20 2b 20 28 28 75 33 32 29 61 4f 75 74      + ((u32)aOut
2d60: 5b 32 5d 20 3c 3c 20 38 29 20 0a 20 20 20 20 20  [2] << 8) .     
2d70: 20 20 2b 20 28 28 75 33 32 29 61 4f 75 74 5b 33    + ((u32)aOut[3
2d80: 5d 29 3b 0a 7d 0a 0a 75 36 34 20 6c 73 6d 47 65  ]);.}..u64 lsmGe
2d90: 74 55 36 34 28 75 38 20 2a 61 4f 75 74 29 7b 0a  tU64(u8 *aOut){.
2da0: 20 20 72 65 74 75 72 6e 20 28 28 75 36 34 29 61    return ((u64)a
2db0: 4f 75 74 5b 30 5d 20 3c 3c 20 35 36 29 20 0a 20  Out[0] << 56) . 
2dc0: 20 20 20 20 20 20 2b 20 28 28 75 36 34 29 61 4f        + ((u64)aO
2dd0: 75 74 5b 31 5d 20 3c 3c 20 34 38 29 20 0a 20 20  ut[1] << 48) .  
2de0: 20 20 20 20 20 2b 20 28 28 75 36 34 29 61 4f 75       + ((u64)aOu
2df0: 74 5b 32 5d 20 3c 3c 20 34 30 29 20 0a 20 20 20  t[2] << 40) .   
2e00: 20 20 20 20 2b 20 28 28 75 36 34 29 61 4f 75 74      + ((u64)aOut
2e10: 5b 33 5d 20 3c 3c 20 33 32 29 20 0a 20 20 20 20  [3] << 32) .    
2e20: 20 20 20 2b 20 28 28 75 36 34 29 61 4f 75 74 5b     + ((u64)aOut[
2e30: 34 5d 20 3c 3c 20 32 34 29 0a 20 20 20 20 20 20  4] << 24).      
2e40: 20 2b 20 28 28 75 33 32 29 61 4f 75 74 5b 35 5d   + ((u32)aOut[5]
2e50: 20 3c 3c 20 31 36 29 20 0a 20 20 20 20 20 20 20   << 16) .       
2e60: 2b 20 28 28 75 33 32 29 61 4f 75 74 5b 36 5d 20  + ((u32)aOut[6] 
2e70: 3c 3c 20 38 29 20 0a 20 20 20 20 20 20 20 2b 20  << 8) .       + 
2e80: 28 28 75 33 32 29 61 4f 75 74 5b 37 5d 29 3b 0a  ((u32)aOut[7]);.
2e90: 7d 0a 0a 76 6f 69 64 20 6c 73 6d 50 75 74 55 36  }..void lsmPutU6
2ea0: 34 28 75 38 20 2a 61 4f 75 74 2c 20 75 36 34 20  4(u8 *aOut, u64 
2eb0: 6e 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d  nVal){.  aOut[0]
2ec0: 20 3d 20 28 75 38 29 28 28 6e 56 61 6c 3e 3e 35   = (u8)((nVal>>5
2ed0: 36 29 20 26 20 30 78 46 46 29 3b 0a 20 20 61 4f  6) & 0xFF);.  aO
2ee0: 75 74 5b 31 5d 20 3d 20 28 75 38 29 28 28 6e 56  ut[1] = (u8)((nV
2ef0: 61 6c 3e 3e 34 38 29 20 26 20 30 78 46 46 29 3b  al>>48) & 0xFF);
2f00: 0a 20 20 61 4f 75 74 5b 32 5d 20 3d 20 28 75 38  .  aOut[2] = (u8
2f10: 29 28 28 6e 56 61 6c 3e 3e 34 30 29 20 26 20 30  )((nVal>>40) & 0
2f20: 78 46 46 29 3b 0a 20 20 61 4f 75 74 5b 33 5d 20  xFF);.  aOut[3] 
2f30: 3d 20 28 75 38 29 28 28 6e 56 61 6c 3e 3e 33 32  = (u8)((nVal>>32
2f40: 29 20 26 20 30 78 46 46 29 3b 0a 20 20 61 4f 75  ) & 0xFF);.  aOu
2f50: 74 5b 34 5d 20 3d 20 28 75 38 29 28 28 6e 56 61  t[4] = (u8)((nVa
2f60: 6c 3e 3e 32 34 29 20 26 20 30 78 46 46 29 3b 0a  l>>24) & 0xFF);.
2f70: 20 20 61 4f 75 74 5b 35 5d 20 3d 20 28 75 38 29    aOut[5] = (u8)
2f80: 28 28 6e 56 61 6c 3e 3e 31 36 29 20 26 20 30 78  ((nVal>>16) & 0x
2f90: 46 46 29 3b 0a 20 20 61 4f 75 74 5b 36 5d 20 3d  FF);.  aOut[6] =
2fa0: 20 28 75 38 29 28 28 6e 56 61 6c 3e 3e 20 38 29   (u8)((nVal>> 8)
2fb0: 20 26 20 30 78 46 46 29 3b 0a 20 20 61 4f 75 74   & 0xFF);.  aOut
2fc0: 5b 37 5d 20 3d 20 28 75 38 29 28 28 6e 56 61 6c  [7] = (u8)((nVal
2fd0: 20 20 20 20 29 20 26 20 30 78 46 46 29 3b 0a 7d      ) & 0xFF);.}
2fe0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72  ..static int sor
2ff0: 74 65 64 42 6c 6f 62 47 72 6f 77 28 6c 73 6d 5f  tedBlobGrow(lsm_
3000: 65 6e 76 20 2a 70 45 6e 76 2c 20 42 6c 6f 62 20  env *pEnv, Blob 
3010: 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 44 61 74  *pBlob, int nDat
3020: 61 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 42  a){.  assert( pB
3030: 6c 6f 62 2d 3e 70 45 6e 76 3d 3d 70 45 6e 76 20  lob->pEnv==pEnv 
3040: 7c 7c 20 28 70 42 6c 6f 62 2d 3e 70 45 6e 76 3d  || (pBlob->pEnv=
3050: 3d 30 20 26 26 20 70 42 6c 6f 62 2d 3e 70 44 61  =0 && pBlob->pDa
3060: 74 61 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  ta==0) );.  if( 
3070: 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63 3c 6e 44  pBlob->nAlloc<nD
3080: 61 74 61 20 29 7b 0a 20 20 20 20 70 42 6c 6f 62  ata ){.    pBlob
3090: 2d 3e 70 44 61 74 61 20 3d 20 6c 73 6d 52 65 61  ->pData = lsmRea
30a0: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 45 6e 76 2c  llocOrFree(pEnv,
30b0: 20 70 42 6c 6f 62 2d 3e 70 44 61 74 61 2c 20 6e   pBlob->pData, n
30c0: 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 21  Data);.    if( !
30d0: 70 42 6c 6f 62 2d 3e 70 44 61 74 61 20 29 20 72  pBlob->pData ) r
30e0: 65 74 75 72 6e 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f  eturn LSM_NOMEM_
30f0: 42 4b 50 54 3b 0a 20 20 20 20 70 42 6c 6f 62 2d  BKPT;.    pBlob-
3100: 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 44 61 74 61 3b  >nAlloc = nData;
3110: 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 70 45 6e 76  .    pBlob->pEnv
3120: 20 3d 20 70 45 6e 76 3b 0a 20 20 7d 0a 20 20 72   = pEnv;.  }.  r
3130: 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a  eturn LSM_OK;.}.
3140: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74  .static int sort
3150: 65 64 42 6c 6f 62 53 65 74 28 6c 73 6d 5f 65 6e  edBlobSet(lsm_en
3160: 76 20 2a 70 45 6e 76 2c 20 42 6c 6f 62 20 2a 70  v *pEnv, Blob *p
3170: 42 6c 6f 62 2c 20 76 6f 69 64 20 2a 70 44 61 74  Blob, void *pDat
3180: 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20  a, int nData){. 
3190: 20 69 66 28 20 73 6f 72 74 65 64 42 6c 6f 62 47   if( sortedBlobG
31a0: 72 6f 77 28 70 45 6e 76 2c 20 70 42 6c 6f 62 2c  row(pEnv, pBlob,
31b0: 20 6e 44 61 74 61 29 20 29 20 72 65 74 75 72 6e   nData) ) return
31c0: 20 4c 53 4d 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65   LSM_NOMEM;.  me
31d0: 6d 63 70 79 28 70 42 6c 6f 62 2d 3e 70 44 61 74  mcpy(pBlob->pDat
31e0: 61 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29  a, pData, nData)
31f0: 3b 0a 20 20 70 42 6c 6f 62 2d 3e 6e 44 61 74 61  ;.  pBlob->nData
3200: 20 3d 20 6e 44 61 74 61 3b 0a 20 20 72 65 74 75   = nData;.  retu
3210: 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn LSM_OK;.}..#i
3220: 66 20 30 0a 73 74 61 74 69 63 20 69 6e 74 20 73  f 0.static int s
3230: 6f 72 74 65 64 42 6c 6f 62 43 6f 70 79 28 42 6c  ortedBlobCopy(Bl
3240: 6f 62 20 2a 70 44 65 73 74 2c 20 42 6c 6f 62 20  ob *pDest, Blob 
3250: 2a 70 53 72 63 29 7b 0a 20 20 72 65 74 75 72 6e  *pSrc){.  return
3260: 20 73 6f 72 74 65 64 42 6c 6f 62 53 65 74 28 70   sortedBlobSet(p
3270: 44 65 73 74 2c 20 70 53 72 63 2d 3e 70 44 61 74  Dest, pSrc->pDat
3280: 61 2c 20 70 53 72 63 2d 3e 6e 44 61 74 61 29 3b  a, pSrc->nData);
3290: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  .}.#endif..stati
32a0: 63 20 76 6f 69 64 20 73 6f 72 74 65 64 42 6c 6f  c void sortedBlo
32b0: 62 46 72 65 65 28 42 6c 6f 62 20 2a 70 42 6c 6f  bFree(Blob *pBlo
32c0: 62 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 42  b){.  assert( pB
32d0: 6c 6f 62 2d 3e 70 45 6e 76 20 7c 7c 20 70 42 6c  lob->pEnv || pBl
32e0: 6f 62 2d 3e 70 44 61 74 61 3d 3d 30 20 29 3b 0a  ob->pData==0 );.
32f0: 20 20 69 66 28 20 70 42 6c 6f 62 2d 3e 70 44 61    if( pBlob->pDa
3300: 74 61 20 29 20 6c 73 6d 46 72 65 65 28 70 42 6c  ta ) lsmFree(pBl
3310: 6f 62 2d 3e 70 45 6e 76 2c 20 70 42 6c 6f 62 2d  ob->pEnv, pBlob-
3320: 3e 70 44 61 74 61 29 3b 0a 20 20 6d 65 6d 73 65  >pData);.  memse
3330: 74 28 70 42 6c 6f 62 2c 20 30 2c 20 73 69 7a 65  t(pBlob, 0, size
3340: 6f 66 28 42 6c 6f 62 29 29 3b 0a 7d 0a 0a 73 74  of(Blob));.}..st
3350: 61 74 69 63 20 69 6e 74 20 73 6f 72 74 65 64 52  atic int sortedR
3360: 65 61 64 44 61 74 61 28 0a 20 20 53 65 67 6d 65  eadData(.  Segme
3370: 6e 74 20 2a 70 53 65 67 2c 0a 20 20 50 61 67 65  nt *pSeg,.  Page
3380: 20 2a 70 50 67 2c 0a 20 20 69 6e 74 20 69 4f 66   *pPg,.  int iOf
3390: 66 2c 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 0a  f,.  int nByte,.
33a0: 20 20 76 6f 69 64 20 2a 2a 70 70 44 61 74 61 2c    void **ppData,
33b0: 0a 20 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 0a 29  .  Blob *pBlob.)
33c0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d  {.  int rc = LSM
33d0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 45 6e 64 3b  _OK;.  int iEnd;
33e0: 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20  .  int nData;.  
33f0: 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20  int nCell;.  u8 
3400: 2a 61 44 61 74 61 3b 0a 0a 20 20 61 44 61 74 61  *aData;..  aData
3410: 20 3d 20 66 73 50 61 67 65 44 61 74 61 28 70 50   = fsPageData(pP
3420: 67 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 6e 43  g, &nData);.  nC
3430: 65 6c 6c 20 3d 20 6c 73 6d 47 65 74 55 31 36 28  ell = lsmGetU16(
3440: 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54 5f 4e  &aData[SEGMENT_N
3450: 52 45 43 4f 52 44 5f 4f 46 46 53 45 54 28 6e 44  RECORD_OFFSET(nD
3460: 61 74 61 29 5d 29 3b 0a 20 20 69 45 6e 64 20 3d  ata)]);.  iEnd =
3470: 20 53 45 47 4d 45 4e 54 5f 45 4f 46 28 6e 44 61   SEGMENT_EOF(nDa
3480: 74 61 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 61 73  ta, nCell);.  as
3490: 73 65 72 74 28 20 69 45 6e 64 3e 30 20 26 26 20  sert( iEnd>0 && 
34a0: 69 45 6e 64 3c 6e 44 61 74 61 20 29 3b 0a 0a 20  iEnd<nData );.. 
34b0: 20 69 66 28 20 69 4f 66 66 2b 6e 42 79 74 65 3c   if( iOff+nByte<
34c0: 3d 69 45 6e 64 20 29 7b 0a 20 20 20 20 2a 70 70  =iEnd ){.    *pp
34d0: 44 61 74 61 20 3d 20 28 76 6f 69 64 20 2a 29 26  Data = (void *)&
34e0: 61 44 61 74 61 5b 69 4f 66 66 5d 3b 0a 20 20 7d  aData[iOff];.  }
34f0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 52  else{.    int nR
3500: 65 6d 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  em = nByte;.    
3510: 69 6e 74 20 69 20 3d 20 69 4f 66 66 3b 0a 20 20  int i = iOff;.  
3520: 20 20 75 38 20 2a 61 44 65 73 74 3b 0a 0a 20 20    u8 *aDest;..  
3530: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
3540: 68 65 20 62 6c 6f 62 20 69 73 20 62 69 67 20 65  he blob is big e
3550: 6e 6f 75 67 68 20 74 6f 20 73 74 6f 72 65 20 74  nough to store t
3560: 68 65 20 76 61 6c 75 65 20 62 65 69 6e 67 20 6c  he value being l
3570: 6f 61 64 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63  oaded. */.    rc
3580: 20 3d 20 73 6f 72 74 65 64 42 6c 6f 62 47 72 6f   = sortedBlobGro
3590: 77 28 6c 73 6d 50 61 67 65 45 6e 76 28 70 50 67  w(lsmPageEnv(pPg
35a0: 29 2c 20 70 42 6c 6f 62 2c 20 6e 42 79 74 65 29  ), pBlob, nByte)
35b0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 4c 53  ;.    if( rc!=LS
35c0: 4d 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  M_OK ) return rc
35d0: 3b 0a 20 20 20 20 70 42 6c 6f 62 2d 3e 6e 44 61  ;.    pBlob->nDa
35e0: 74 61 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ta = nByte;.    
35f0: 61 44 65 73 74 20 3d 20 28 75 38 20 2a 29 70 42  aDest = (u8 *)pB
3600: 6c 6f 62 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  lob->pData;.    
3610: 2a 70 70 44 61 74 61 20 3d 20 70 42 6c 6f 62 2d  *ppData = pBlob-
3620: 3e 70 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20  >pData;..    /* 
3630: 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 70 6f  Increment the po
3640: 69 6e 74 65 72 20 70 61 67 65 73 20 72 65 66 2d  inter pages ref-
3650: 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 6c 73  count. */.    ls
3660: 6d 46 73 50 61 67 65 52 65 66 28 70 50 67 29 3b  mFsPageRef(pPg);
3670: 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ..    while( rc=
3680: 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =LSM_OK ){.     
3690: 20 50 61 67 65 20 2a 70 4e 65 78 74 3b 0a 20 20   Page *pNext;.  
36a0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 0a      int flags;..
36b0: 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61        /* Copy da
36c0: 74 61 20 66 72 6f 6d 20 70 50 67 20 69 6e 74 6f  ta from pPg into
36d0: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
36e0: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  er. */.      int
36f0: 20 6e 43 6f 70 79 20 3d 20 4c 53 4d 5f 4d 49 4e   nCopy = LSM_MIN
3700: 28 6e 52 65 6d 2c 20 69 45 6e 64 2d 69 29 3b 0a  (nRem, iEnd-i);.
3710: 20 20 20 20 20 20 69 66 28 20 6e 43 6f 70 79 3e        if( nCopy>
3720: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 ){.        mem
3730: 63 70 79 28 26 61 44 65 73 74 5b 6e 42 79 74 65  cpy(&aDest[nByte
3740: 2d 6e 52 65 6d 5d 2c 20 26 61 44 61 74 61 5b 69  -nRem], &aData[i
3750: 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  ], nCopy);.     
3760: 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 6f 70 79     nRem -= nCopy
3770: 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e  ;.        i += n
3780: 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 61 73  Copy;.        as
3790: 73 65 72 74 28 20 6e 52 65 6d 3d 3d 30 20 7c 7c  sert( nRem==0 ||
37a0: 20 69 3d 3d 69 45 6e 64 20 29 3b 0a 20 20 20 20   i==iEnd );.    
37b0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
37c0: 28 20 6e 52 65 6d 3e 3d 30 20 29 3b 0a 20 20 20  ( nRem>=0 );.   
37d0: 20 20 20 69 66 28 20 6e 52 65 6d 3d 3d 30 20 29     if( nRem==0 )
37e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 20   break;.      i 
37f0: 2d 3d 20 69 45 6e 64 3b 0a 0a 20 20 20 20 20 20  -= iEnd;..      
3800: 2f 2a 20 47 72 61 62 20 74 68 65 20 6e 65 78 74  /* Grab the next
3810: 20 70 61 67 65 20 69 6e 20 74 68 65 20 73 65 67   page in the seg
3820: 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 64  ment */..      d
3830: 6f 20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o {.        rc =
3840: 20 6c 73 6d 46 73 44 62 50 61 67 65 4e 65 78 74   lsmFsDbPageNext
3850: 28 70 53 65 67 2c 20 70 50 67 2c 20 31 2c 20 26  (pSeg, pPg, 1, &
3860: 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  pNext);.        
3870: 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26  if( rc==LSM_OK &
3880: 26 20 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20  & pNext==0 ){.  
3890: 20 20 20 20 20 20 20 20 72 63 20 3d 20 4c 53 4d          rc = LSM
38a0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
38b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
38c0: 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
38d0: 0a 20 20 20 20 20 20 20 20 6c 73 6d 46 73 50 61  .        lsmFsPa
38e0: 67 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  geRelease(pPg);.
38f0: 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70 4e          pPg = pN
3900: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 61 44 61  ext;.        aDa
3910: 74 61 20 3d 20 66 73 50 61 67 65 44 61 74 61 28  ta = fsPageData(
3920: 70 50 67 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20  pPg, &nData);.  
3930: 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 6c 73        flags = ls
3940: 6d 47 65 74 55 31 36 28 26 61 44 61 74 61 5b 53  mGetU16(&aData[S
3950: 45 47 4d 45 4e 54 5f 46 4c 41 47 53 5f 4f 46 46  EGMENT_FLAGS_OFF
3960: 53 45 54 28 6e 44 61 74 61 29 5d 29 3b 0a 20 20  SET(nData)]);.  
3970: 20 20 20 20 7d 77 68 69 6c 65 28 20 66 6c 61 67      }while( flag
3980: 73 26 53 45 47 4d 45 4e 54 5f 42 54 52 45 45 5f  s&SEGMENT_BTREE_
3990: 46 4c 41 47 20 29 3b 0a 0a 20 20 20 20 20 20 69  FLAG );..      i
39a0: 45 6e 64 20 3d 20 53 45 47 4d 45 4e 54 5f 45 4f  End = SEGMENT_EO
39b0: 46 28 6e 44 61 74 61 2c 20 6c 73 6d 47 65 74 55  F(nData, lsmGetU
39c0: 31 36 28 26 61 44 61 74 61 5b 6e 44 61 74 61 2d  16(&aData[nData-
39d0: 32 5d 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  2]));.      asse
39e0: 72 74 28 20 69 45 6e 64 3e 30 20 26 26 20 69 45  rt( iEnd>0 && iE
39f0: 6e 64 3c 6e 44 61 74 61 20 29 3b 0a 20 20 20 20  nd<nData );.    
3a00: 7d 0a 0a 20 20 20 20 6c 73 6d 46 73 50 61 67 65  }..    lsmFsPage
3a10: 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
3a20: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
3a30: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  }..static int pa
3a40: 67 65 47 65 74 4e 52 65 63 28 75 38 20 2a 61 44  geGetNRec(u8 *aD
3a50: 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b  ata, int nData){
3a60: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6c  .  return (int)l
3a70: 73 6d 47 65 74 55 31 36 28 26 61 44 61 74 61 5b  smGetU16(&aData[
3a80: 53 45 47 4d 45 4e 54 5f 4e 52 45 43 4f 52 44 5f  SEGMENT_NRECORD_
3a90: 4f 46 46 53 45 54 28 6e 44 61 74 61 29 5d 29 3b  OFFSET(nData)]);
3aa0: 0a 7d 0a 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .}..static Pgno 
3ab0: 70 61 67 65 47 65 74 50 74 72 28 75 38 20 2a 61  pageGetPtr(u8 *a
3ac0: 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
3ad0: 7b 0a 20 20 72 65 74 75 72 6e 20 28 50 67 6e 6f  {.  return (Pgno
3ae0: 29 6c 73 6d 47 65 74 55 36 34 28 26 61 44 61 74  )lsmGetU64(&aDat
3af0: 61 5b 53 45 47 4d 45 4e 54 5f 50 4f 49 4e 54 45  a[SEGMENT_POINTE
3b00: 52 5f 4f 46 46 53 45 54 28 6e 44 61 74 61 29 5d  R_OFFSET(nData)]
3b10: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
3b20: 20 70 61 67 65 47 65 74 46 6c 61 67 73 28 75 38   pageGetFlags(u8
3b30: 20 2a 61 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *aData, int nDa
3b40: 74 61 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 69  ta){.  return (i
3b50: 6e 74 29 6c 73 6d 47 65 74 55 31 36 28 26 61 44  nt)lsmGetU16(&aD
3b60: 61 74 61 5b 53 45 47 4d 45 4e 54 5f 46 4c 41 47  ata[SEGMENT_FLAG
3b70: 53 5f 4f 46 46 53 45 54 28 6e 44 61 74 61 29 5d  S_OFFSET(nData)]
3b80: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 38 20  );.}..static u8 
3b90: 2a 70 61 67 65 47 65 74 43 65 6c 6c 28 75 38 20  *pageGetCell(u8 
3ba0: 2a 61 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *aData, int nDat
3bb0: 61 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  a, int iCell){. 
3bc0: 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 6c   return &aData[l
3bd0: 73 6d 47 65 74 55 31 36 28 26 61 44 61 74 61 5b  smGetU16(&aData[
3be0: 53 45 47 4d 45 4e 54 5f 43 45 4c 4c 50 54 52 5f  SEGMENT_CELLPTR_
3bf0: 4f 46 46 53 45 54 28 6e 44 61 74 61 2c 20 69 43  OFFSET(nData, iC
3c00: 65 6c 6c 29 5d 29 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a  ell)])];.}../*.*
3c10: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
3c20: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
3c30: 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 73 74 61  page pPg..*/.sta
3c40: 74 69 63 20 69 6e 74 20 70 61 67 65 4f 62 6a 47  tic int pageObjG
3c50: 65 74 4e 52 65 63 28 50 61 67 65 20 2a 70 50 67  etNRec(Page *pPg
3c60: 29 7b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a  ){.  int nData;.
3c70: 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 6c 73    u8 *aData = ls
3c80: 6d 46 73 50 61 67 65 44 61 74 61 28 70 50 67 2c  mFsPageData(pPg,
3c90: 20 26 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75   &nData);.  retu
3ca0: 72 6e 20 70 61 67 65 47 65 74 4e 52 65 63 28 61  rn pageGetNRec(a
3cb0: 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 7d 0a  Data, nData);.}.
3cc0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
3cd0: 65 20 64 65 63 6f 64 65 64 20 28 70 6f 73 73 69  e decoded (possi
3ce0: 62 6c 79 20 72 65 6c 61 74 69 76 65 29 20 70 6f  bly relative) po
3cf0: 69 6e 74 65 72 20 76 61 6c 75 65 20 73 74 6f 72  inter value stor
3d00: 65 64 20 69 6e 20 63 65 6c 6c 20 0a 2a 2a 20 69  ed in cell .** i
3d10: 43 65 6c 6c 20 66 72 6f 6d 20 70 61 67 65 20 61  Cell from page a
3d20: 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2f 0a 73  Data/nData..*/.s
3d30: 74 61 74 69 63 20 50 67 6e 6f 20 70 61 67 65 47  tatic Pgno pageG
3d40: 65 74 52 65 63 6f 72 64 50 74 72 28 75 38 20 2a  etRecordPtr(u8 *
3d50: 61 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  aData, int nData
3d60: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
3d70: 50 67 6e 6f 20 69 52 65 74 3b 20 20 20 20 20 20  Pgno iRet;      
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
3da0: 2a 2f 0a 20 20 75 38 20 2a 61 43 65 6c 6c 3b 20  */.  u8 *aCell; 
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dc0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
3dd0: 74 6f 20 63 65 6c 6c 20 69 43 65 6c 6c 20 2a 2f  to cell iCell */
3de0: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43 65 6c  ..  assert( iCel
3df0: 6c 3c 70 61 67 65 47 65 74 4e 52 65 63 28 61 44  l<pageGetNRec(aD
3e00: 61 74 61 2c 20 6e 44 61 74 61 29 20 26 26 20 69  ata, nData) && i
3e10: 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20 61 43 65  Cell>=0 );.  aCe
3e20: 6c 6c 20 3d 20 70 61 67 65 47 65 74 43 65 6c 6c  ll = pageGetCell
3e30: 28 61 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 69  (aData, nData, i
3e40: 43 65 6c 6c 29 3b 0a 20 20 6c 73 6d 56 61 72 69  Cell);.  lsmVari
3e50: 6e 74 47 65 74 36 34 28 26 61 43 65 6c 6c 5b 31  ntGet64(&aCell[1
3e60: 5d 2c 20 26 69 52 65 74 29 3b 0a 20 20 72 65 74  ], &iRet);.  ret
3e70: 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 73 74 61  urn iRet;.}..sta
3e80: 74 69 63 20 75 38 20 2a 70 61 67 65 47 65 74 4b  tic u8 *pageGetK
3e90: 65 79 28 0a 20 20 53 65 67 6d 65 6e 74 20 2a 70  ey(.  Segment *p
3ea0: 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Seg,            
3eb0: 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
3ec0: 20 70 50 67 20 62 65 6c 6f 6e 67 73 20 74 6f 20   pPg belongs to 
3ed0: 2a 2f 0a 20 20 50 61 67 65 20 2a 70 50 67 2c 20  */.  Page *pPg, 
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
3f00: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
3f10: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f30: 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20  * Index of cell 
3f40: 6f 6e 20 70 61 67 65 20 74 6f 20 72 65 61 64 20  on page to read 
3f50: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54 6f 70 69  */.  int *piTopi
3f60: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
3f70: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 70       /* OUT: Top
3f80: 69 63 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ic associated wi
3f90: 74 68 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20  th this key */. 
3fa0: 20 69 6e 74 20 2a 70 6e 4b 65 79 2c 20 20 20 20   int *pnKey,    
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fc0: 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
3fd0: 20 6b 65 79 20 69 6e 20 62 79 74 65 73 20 2a 2f   key in bytes */
3fe0: 0a 20 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 20 20  .  Blob *pBlob  
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
4010: 64 2c 20 75 73 65 20 74 68 69 73 20 66 6f 72 20  d, use this for 
4020: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 2a  dynamic memory *
4030: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 4b 65 79 3b  /.){.  u8 *pKey;
4040: 0a 20 20 69 6e 74 20 6e 44 75 6d 6d 79 3b 0a 20  .  int nDummy;. 
4050: 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 75 38   int eType;.  u8
4060: 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e   *aData;.  int n
4070: 44 61 74 61 3b 0a 0a 20 20 61 44 61 74 61 20 3d  Data;..  aData =
4080: 20 66 73 50 61 67 65 44 61 74 61 28 70 50 67 2c   fsPageData(pPg,
4090: 20 26 6e 44 61 74 61 29 3b 0a 0a 20 20 61 73 73   &nData);..  ass
40a0: 65 72 74 28 20 21 28 70 61 67 65 47 65 74 46 6c  ert( !(pageGetFl
40b0: 61 67 73 28 61 44 61 74 61 2c 20 6e 44 61 74 61  ags(aData, nData
40c0: 29 20 26 20 53 45 47 4d 45 4e 54 5f 42 54 52 45  ) & SEGMENT_BTRE
40d0: 45 5f 46 4c 41 47 29 20 29 3b 0a 20 20 61 73 73  E_FLAG) );.  ass
40e0: 65 72 74 28 20 69 43 65 6c 6c 3c 70 61 67 65 47  ert( iCell<pageG
40f0: 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44  etNRec(aData, nD
4100: 61 74 61 29 20 29 3b 0a 0a 20 20 70 4b 65 79 20  ata) );..  pKey 
4110: 3d 20 70 61 67 65 47 65 74 43 65 6c 6c 28 61 44  = pageGetCell(aD
4120: 61 74 61 2c 20 6e 44 61 74 61 2c 20 69 43 65 6c  ata, nData, iCel
4130: 6c 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 2a 70  l);.  eType = *p
4140: 4b 65 79 2b 2b 3b 0a 20 20 70 4b 65 79 20 2b 3d  Key++;.  pKey +=
4150: 20 6c 73 6d 56 61 72 69 6e 74 47 65 74 33 32 28   lsmVarintGet32(
4160: 70 4b 65 79 2c 20 26 6e 44 75 6d 6d 79 29 3b 0a  pKey, &nDummy);.
4170: 20 20 70 4b 65 79 20 2b 3d 20 6c 73 6d 56 61 72    pKey += lsmVar
4180: 69 6e 74 47 65 74 33 32 28 70 4b 65 79 2c 20 70  intGet32(pKey, p
4190: 6e 4b 65 79 29 3b 0a 20 20 69 66 28 20 72 74 49  nKey);.  if( rtI
41a0: 73 57 72 69 74 65 28 65 54 79 70 65 29 20 29 7b  sWrite(eType) ){
41b0: 0a 20 20 20 20 70 4b 65 79 20 2b 3d 20 6c 73 6d  .    pKey += lsm
41c0: 56 61 72 69 6e 74 47 65 74 33 32 28 70 4b 65 79  VarintGet32(pKey
41d0: 2c 20 26 6e 44 75 6d 6d 79 29 3b 0a 20 20 7d 0a  , &nDummy);.  }.
41e0: 20 20 2a 70 69 54 6f 70 69 63 20 3d 20 72 74 54    *piTopic = rtT
41f0: 6f 70 69 63 28 65 54 79 70 65 29 3b 0a 0a 20 20  opic(eType);..  
4200: 73 6f 72 74 65 64 52 65 61 64 44 61 74 61 28 70  sortedReadData(p
4210: 53 65 67 2c 20 70 50 67 2c 20 70 4b 65 79 2d 61  Seg, pPg, pKey-a
4220: 44 61 74 61 2c 20 2a 70 6e 4b 65 79 2c 20 28 76  Data, *pnKey, (v
4230: 6f 69 64 20 2a 2a 29 26 70 4b 65 79 2c 20 70 42  oid **)&pKey, pB
4240: 6c 6f 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  lob);.  return p
4250: 4b 65 79 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  Key;.}..static i
4260: 6e 74 20 70 61 67 65 47 65 74 4b 65 79 43 6f 70  nt pageGetKeyCop
4270: 79 28 0a 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 45  y(.  lsm_env *pE
4280: 6e 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nv,             
4290: 20 20 20 20 20 2f 2a 20 45 6e 76 69 72 6f 6e 6d       /* Environm
42a0: 65 6e 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ent handle */.  
42b0: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20  Segment *pSeg,  
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42d0: 2f 2a 20 53 65 67 6d 65 6e 74 20 70 50 67 20 62  /* Segment pPg b
42e0: 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 50  elongs to */.  P
42f0: 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4310: 2a 20 50 61 67 65 20 74 6f 20 72 65 61 64 20 66  * Page to read f
4320: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  rom */.  int iCe
4330: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
4340: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
4350: 78 20 6f 66 20 63 65 6c 6c 20 6f 6e 20 70 61 67  x of cell on pag
4360: 65 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  e to read */.  i
4370: 6e 74 20 2a 70 69 54 6f 70 69 63 2c 20 20 20 20  nt *piTopic,    
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4390: 2a 20 4f 55 54 3a 20 54 6f 70 69 63 20 61 73 73  * OUT: Topic ass
43a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
43b0: 73 20 6b 65 79 20 2a 2f 0a 20 20 42 6c 6f 62 20  s key */.  Blob 
43c0: 2a 70 42 6c 6f 62 20 20 20 20 20 20 20 20 20 20  *pBlob          
43d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
43e0: 20 72 65 71 75 69 72 65 64 2c 20 75 73 65 20 74   required, use t
43f0: 68 69 73 20 66 6f 72 20 64 79 6e 61 6d 69 63 20  his for dynamic 
4400: 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 69  memory */.){.  i
4410: 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a  nt rc = LSM_OK;.
4420: 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 75 38    int nKey;.  u8
4430: 20 2a 61 4b 65 79 3b 0a 0a 20 20 61 4b 65 79 20   *aKey;..  aKey 
4440: 3d 20 70 61 67 65 47 65 74 4b 65 79 28 70 53 65  = pageGetKey(pSe
4450: 67 2c 20 70 50 67 2c 20 69 43 65 6c 6c 2c 20 70  g, pPg, iCell, p
4460: 69 54 6f 70 69 63 2c 20 26 6e 4b 65 79 2c 20 70  iTopic, &nKey, p
4470: 42 6c 6f 62 29 3b 0a 20 20 61 73 73 65 72 74 28  Blob);.  assert(
4480: 20 28 76 6f 69 64 20 2a 29 61 4b 65 79 21 3d 70   (void *)aKey!=p
4490: 42 6c 6f 62 2d 3e 70 44 61 74 61 20 7c 7c 20 6e  Blob->pData || n
44a0: 4b 65 79 3d 3d 70 42 6c 6f 62 2d 3e 6e 44 61 74  Key==pBlob->nDat
44b0: 61 20 29 3b 0a 20 20 69 66 28 20 28 76 6f 69 64  a );.  if( (void
44c0: 20 2a 29 61 4b 65 79 21 3d 70 42 6c 6f 62 2d 3e   *)aKey!=pBlob->
44d0: 70 44 61 74 61 20 29 7b 0a 20 20 20 20 72 63 20  pData ){.    rc 
44e0: 3d 20 73 6f 72 74 65 64 42 6c 6f 62 53 65 74 28  = sortedBlobSet(
44f0: 70 45 6e 76 2c 20 70 42 6c 6f 62 2c 20 61 4b 65  pEnv, pBlob, aKe
4500: 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20  y, nKey);.  }.. 
4510: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
4520: 74 61 74 69 63 20 50 67 6e 6f 20 70 61 67 65 47  tatic Pgno pageG
4530: 65 74 42 74 72 65 65 52 65 66 28 50 61 67 65 20  etBtreeRef(Page 
4540: 2a 70 50 67 2c 20 69 6e 74 20 69 4b 65 79 29 7b  *pPg, int iKey){
4550: 0a 20 20 50 67 6e 6f 20 69 52 65 66 3b 0a 20 20  .  Pgno iRef;.  
4560: 75 38 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e 74  u8 *aData;.  int
4570: 20 6e 44 61 74 61 3b 0a 20 20 75 38 20 2a 61 43   nData;.  u8 *aC
4580: 65 6c 6c 3b 0a 0a 20 20 61 44 61 74 61 20 3d 20  ell;..  aData = 
4590: 66 73 50 61 67 65 44 61 74 61 28 70 50 67 2c 20  fsPageData(pPg, 
45a0: 26 6e 44 61 74 61 29 3b 0a 20 20 61 43 65 6c 6c  &nData);.  aCell
45b0: 20 3d 20 70 61 67 65 47 65 74 43 65 6c 6c 28 61   = pageGetCell(a
45c0: 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 69 4b 65  Data, nData, iKe
45d0: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 43  y);.  assert( aC
45e0: 65 6c 6c 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20 61  ell[0]==0 );.  a
45f0: 43 65 6c 6c 2b 2b 3b 0a 20 20 61 43 65 6c 6c 20  Cell++;.  aCell 
4600: 2b 3d 20 6c 73 6d 56 61 72 69 6e 74 47 65 74 36  += lsmVarintGet6
4610: 34 28 61 43 65 6c 6c 2c 20 26 69 52 65 66 29 3b  4(aCell, &iRef);
4620: 0a 20 20 6c 73 6d 56 61 72 69 6e 74 47 65 74 36  .  lsmVarintGet6
4630: 34 28 61 43 65 6c 6c 2c 20 26 69 52 65 66 29 3b  4(aCell, &iRef);
4640: 0a 20 20 61 73 73 65 72 74 28 20 69 52 65 66 3e  .  assert( iRef>
4650: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52  0 );.  return iR
4660: 65 66 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 47  ef;.}..#define G
4670: 45 54 56 41 52 49 4e 54 36 34 28 61 2c 20 69 29  ETVARINT64(a, i)
4680: 20 28 28 28 69 29 3d 28 28 75 38 2a 29 28 61 29   (((i)=((u8*)(a)
4690: 29 5b 30 5d 29 3c 3d 32 34 30 3f 31 3a 6c 73 6d  )[0])<=240?1:lsm
46a0: 56 61 72 69 6e 74 47 65 74 36 34 28 28 61 29 2c  VarintGet64((a),
46b0: 20 26 28 69 29 29 29 0a 23 64 65 66 69 6e 65 20   &(i))).#define 
46c0: 47 45 54 56 41 52 49 4e 54 33 32 28 61 2c 20 69  GETVARINT32(a, i
46d0: 29 20 28 28 28 69 29 3d 28 28 75 38 2a 29 28 61  ) (((i)=((u8*)(a
46e0: 29 29 5b 30 5d 29 3c 3d 32 34 30 3f 31 3a 6c 73  ))[0])<=240?1:ls
46f0: 6d 56 61 72 69 6e 74 47 65 74 33 32 28 28 61 29  mVarintGet32((a)
4700: 2c 20 26 28 69 29 29 29 0a 0a 73 74 61 74 69 63  , &(i)))..static
4710: 20 69 6e 74 20 70 61 67 65 47 65 74 42 74 72 65   int pageGetBtre
4720: 65 4b 65 79 28 0a 20 20 53 65 67 6d 65 6e 74 20  eKey(.  Segment 
4730: 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20 20 20  *pSeg,          
4740: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
4750: 6e 74 20 70 61 67 65 20 70 50 67 20 62 65 6c 6f  nt page pPg belo
4760: 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 50 61 67 65  ngs to */.  Page
4770: 20 2a 70 50 67 2c 0a 20 20 69 6e 74 20 69 4b 65   *pPg,.  int iKe
4780: 79 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 69 50 74  y, .  Pgno *piPt
4790: 72 2c 20 0a 20 20 69 6e 74 20 2a 70 69 54 6f 70  r, .  int *piTop
47a0: 69 63 2c 20 0a 20 20 76 6f 69 64 20 2a 2a 70 70  ic, .  void **pp
47b0: 4b 65 79 2c 0a 20 20 69 6e 74 20 2a 70 6e 4b 65  Key,.  int *pnKe
47c0: 79 2c 0a 20 20 42 6c 6f 62 20 2a 70 42 6c 6f 62  y,.  Blob *pBlob
47d0: 0a 29 7b 0a 20 20 75 38 20 2a 61 44 61 74 61 3b  .){.  u8 *aData;
47e0: 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20  .  int nData;.  
47f0: 75 38 20 2a 61 43 65 6c 6c 3b 0a 20 20 69 6e 74  u8 *aCell;.  int
4800: 20 65 54 79 70 65 3b 0a 0a 20 20 61 44 61 74 61   eType;..  aData
4810: 20 3d 20 66 73 50 61 67 65 44 61 74 61 28 70 50   = fsPageData(pP
4820: 67 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 61 73  g, &nData);.  as
4830: 73 65 72 74 28 20 53 45 47 4d 45 4e 54 5f 42 54  sert( SEGMENT_BT
4840: 52 45 45 5f 46 4c 41 47 20 26 20 70 61 67 65 47  REE_FLAG & pageG
4850: 65 74 46 6c 61 67 73 28 61 44 61 74 61 2c 20 6e  etFlags(aData, n
4860: 44 61 74 61 29 20 29 3b 0a 20 20 61 73 73 65 72  Data) );.  asser
4870: 74 28 20 69 4b 65 79 3e 3d 30 20 26 26 20 69 4b  t( iKey>=0 && iK
4880: 65 79 3c 70 61 67 65 47 65 74 4e 52 65 63 28 61  ey<pageGetNRec(a
4890: 44 61 74 61 2c 20 6e 44 61 74 61 29 20 29 3b 0a  Data, nData) );.
48a0: 0a 20 20 61 43 65 6c 6c 20 3d 20 70 61 67 65 47  .  aCell = pageG
48b0: 65 74 43 65 6c 6c 28 61 44 61 74 61 2c 20 6e 44  etCell(aData, nD
48c0: 61 74 61 2c 20 69 4b 65 79 29 3b 0a 20 20 65 54  ata, iKey);.  eT
48d0: 79 70 65 20 3d 20 2a 61 43 65 6c 6c 2b 2b 3b 0a  ype = *aCell++;.
48e0: 20 20 61 43 65 6c 6c 20 2b 3d 20 47 45 54 56 41    aCell += GETVA
48f0: 52 49 4e 54 36 34 28 61 43 65 6c 6c 2c 20 2a 70  RINT64(aCell, *p
4900: 69 50 74 72 29 3b 0a 0a 20 20 69 66 28 20 65 54  iPtr);..  if( eT
4910: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ype==0 ){.    in
4920: 74 20 72 63 3b 0a 20 20 20 20 50 67 6e 6f 20 69  t rc;.    Pgno i
4930: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
4940: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
4950: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
4960: 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  ed page */.    P
4970: 61 67 65 20 2a 70 52 65 66 3b 0a 20 20 20 20 61  age *pRef;.    a
4980: 43 65 6c 6c 20 2b 3d 20 47 45 54 56 41 52 49 4e  Cell += GETVARIN
4990: 54 36 34 28 61 43 65 6c 6c 2c 20 69 52 65 66 29  T64(aCell, iRef)
49a0: 3b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 46 73  ;.    rc = lsmFs
49b0: 44 62 50 61 67 65 47 65 74 28 6c 73 6d 50 61 67  DbPageGet(lsmPag
49c0: 65 46 53 28 70 50 67 29 2c 20 70 53 65 67 2c 20  eFS(pPg), pSeg, 
49d0: 69 52 65 66 2c 20 26 70 52 65 66 29 3b 0a 20 20  iRef, &pRef);.  
49e0: 20 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b    if( rc!=LSM_OK
49f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
4a00: 20 20 70 61 67 65 47 65 74 4b 65 79 43 6f 70 79    pageGetKeyCopy
4a10: 28 6c 73 6d 50 61 67 65 45 6e 76 28 70 50 67 29  (lsmPageEnv(pPg)
4a20: 2c 20 70 53 65 67 2c 20 70 52 65 66 2c 20 30 2c  , pSeg, pRef, 0,
4a30: 20 26 65 54 79 70 65 2c 20 70 42 6c 6f 62 29 3b   &eType, pBlob);
4a40: 0a 20 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65  .    lsmFsPageRe
4a50: 6c 65 61 73 65 28 70 52 65 66 29 3b 0a 20 20 20  lease(pRef);.   
4a60: 20 2a 70 70 4b 65 79 20 3d 20 70 42 6c 6f 62 2d   *ppKey = pBlob-
4a70: 3e 70 44 61 74 61 3b 0a 20 20 20 20 2a 70 6e 4b  >pData;.    *pnK
4a80: 65 79 20 3d 20 70 42 6c 6f 62 2d 3e 6e 44 61 74  ey = pBlob->nDat
4a90: 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
4aa0: 61 43 65 6c 6c 20 2b 3d 20 47 45 54 56 41 52 49  aCell += GETVARI
4ab0: 4e 54 33 32 28 61 43 65 6c 6c 2c 20 2a 70 6e 4b  NT32(aCell, *pnK
4ac0: 65 79 29 3b 0a 20 20 20 20 2a 70 70 4b 65 79 20  ey);.    *ppKey 
4ad0: 3d 20 61 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69  = aCell;.  }.  i
4ae0: 66 28 20 70 69 54 6f 70 69 63 20 29 20 2a 70 69  f( piTopic ) *pi
4af0: 54 6f 70 69 63 20 3d 20 72 74 54 6f 70 69 63 28  Topic = rtTopic(
4b00: 65 54 79 70 65 29 3b 0a 0a 20 20 72 65 74 75 72  eType);..  retur
4b10: 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  n LSM_OK;.}..sta
4b20: 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
4b30: 73 6f 72 4c 6f 61 64 4b 65 79 28 42 74 72 65 65  sorLoadKey(Btree
4b40: 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
4b50: 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b   int rc = LSM_OK
4b60: 3b 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 69 50  ;.  if( pCsr->iP
4b70: 67 3c 30 20 29 7b 0a 20 20 20 20 70 43 73 72 2d  g<0 ){.    pCsr-
4b80: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  >pKey = 0;.    p
4b90: 43 73 72 2d 3e 6e 4b 65 79 20 3d 20 30 3b 0a 20  Csr->nKey = 0;. 
4ba0: 20 20 20 70 43 73 72 2d 3e 65 54 79 70 65 20 3d     pCsr->eType =
4bb0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
4bc0: 20 50 67 6e 6f 20 64 75 6d 6d 79 3b 0a 20 20 20   Pgno dummy;.   
4bd0: 20 69 6e 74 20 69 50 67 20 3d 20 70 43 73 72 2d   int iPg = pCsr-
4be0: 3e 69 50 67 3b 0a 20 20 20 20 69 6e 74 20 69 43  >iPg;.    int iC
4bf0: 65 6c 6c 20 3d 20 70 43 73 72 2d 3e 61 50 67 5b  ell = pCsr->aPg[
4c00: 69 50 67 5d 2e 69 43 65 6c 6c 3b 0a 20 20 20 20  iPg].iCell;.    
4c10: 77 68 69 6c 65 28 20 69 43 65 6c 6c 3c 30 20 26  while( iCell<0 &
4c20: 26 20 28 2d 2d 69 50 67 29 3e 3d 30 20 29 7b 0a  & (--iPg)>=0 ){.
4c30: 20 20 20 20 20 20 69 43 65 6c 6c 20 3d 20 70 43        iCell = pC
4c40: 73 72 2d 3e 61 50 67 5b 69 50 67 5d 2e 69 43 65  sr->aPg[iPg].iCe
4c50: 6c 6c 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll-1;.    }.    
4c60: 69 66 28 20 69 50 67 3c 30 20 7c 7c 20 69 43 65  if( iPg<0 || iCe
4c70: 6c 6c 3c 30 20 29 20 72 65 74 75 72 6e 20 4c 53  ll<0 ) return LS
4c80: 4d 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  M_CORRUPT_BKPT;.
4c90: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 47 65  .    rc = pageGe
4ca0: 74 42 74 72 65 65 4b 65 79 28 0a 20 20 20 20 20  tBtreeKey(.     
4cb0: 20 20 20 70 43 73 72 2d 3e 70 53 65 67 2c 0a 20     pCsr->pSeg,. 
4cc0: 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 50 67         pCsr->aPg
4cd0: 5b 69 50 67 5d 2e 70 50 61 67 65 2c 20 69 43 65  [iPg].pPage, iCe
4ce0: 6c 6c 2c 0a 20 20 20 20 20 20 20 20 26 64 75 6d  ll,.        &dum
4cf0: 6d 79 2c 20 26 70 43 73 72 2d 3e 65 54 79 70 65  my, &pCsr->eType
4d00: 2c 20 26 70 43 73 72 2d 3e 70 4b 65 79 2c 20 26  , &pCsr->pKey, &
4d10: 70 43 73 72 2d 3e 6e 4b 65 79 2c 20 26 70 43 73  pCsr->nKey, &pCs
4d20: 72 2d 3e 62 6c 6f 62 0a 20 20 20 20 29 3b 0a 20  r->blob.    );. 
4d30: 20 20 20 70 43 73 72 2d 3e 65 54 79 70 65 20 7c     pCsr->eType |
4d40: 3d 20 4c 53 4d 5f 53 45 50 41 52 41 54 4f 52 3b  = LSM_SEPARATOR;
4d50: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
4d60: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
4d70: 20 62 74 72 65 65 43 75 72 73 6f 72 50 74 72 28   btreeCursorPtr(
4d80: 75 38 20 2a 61 44 61 74 61 2c 20 69 6e 74 20 6e  u8 *aData, int n
4d90: 44 61 74 61 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Data, int iCell)
4da0: 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a  {.  int nCell;..
4db0: 20 20 6e 43 65 6c 6c 20 3d 20 70 61 67 65 47 65    nCell = pageGe
4dc0: 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44 61  tNRec(aData, nDa
4dd0: 74 61 29 3b 0a 20 20 69 66 28 20 69 43 65 6c 6c  ta);.  if( iCell
4de0: 3e 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72  >=nCell ){.    r
4df0: 65 74 75 72 6e 20 70 61 67 65 47 65 74 50 74 72  eturn pageGetPtr
4e00: 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a  (aData, nData);.
4e10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 61 67    }.  return pag
4e20: 65 47 65 74 52 65 63 6f 72 64 50 74 72 28 61 44  eGetRecordPtr(aD
4e30: 61 74 61 2c 20 6e 44 61 74 61 2c 20 69 43 65 6c  ata, nData, iCel
4e40: 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  l);.}..static in
4e50: 74 20 62 74 72 65 65 43 75 72 73 6f 72 4e 65 78  t btreeCursorNex
4e60: 74 28 42 74 72 65 65 43 75 72 73 6f 72 20 2a 70  t(BtreeCursor *p
4e70: 43 73 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Csr){.  int rc =
4e80: 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20 20 42 74 72 65   LSM_OK;..  Btre
4e90: 65 50 67 20 2a 70 50 67 20 3d 20 26 70 43 73 72  ePg *pPg = &pCsr
4ea0: 2d 3e 61 50 67 5b 70 43 73 72 2d 3e 69 50 67 5d  ->aPg[pCsr->iPg]
4eb0: 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 0a  ;.  int nCell; .
4ec0: 20 20 75 38 20 2a 61 44 61 74 61 3b 0a 20 20 69    u8 *aData;.  i
4ed0: 6e 74 20 6e 44 61 74 61 3b 0a 0a 20 20 61 73 73  nt nData;..  ass
4ee0: 65 72 74 28 20 70 43 73 72 2d 3e 69 50 67 3e 3d  ert( pCsr->iPg>=
4ef0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
4f00: 43 73 72 2d 3e 69 50 67 3d 3d 70 43 73 72 2d 3e  Csr->iPg==pCsr->
4f10: 6e 44 65 70 74 68 2d 31 20 29 3b 0a 0a 20 20 61  nDepth-1 );..  a
4f20: 44 61 74 61 20 3d 20 66 73 50 61 67 65 44 61 74  Data = fsPageDat
4f30: 61 28 70 50 67 2d 3e 70 50 61 67 65 2c 20 26 6e  a(pPg->pPage, &n
4f40: 44 61 74 61 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d  Data);.  nCell =
4f50: 20 70 61 67 65 47 65 74 4e 52 65 63 28 61 44 61   pageGetNRec(aDa
4f60: 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 61 73  ta, nData);.  as
4f70: 73 65 72 74 28 20 70 50 67 2d 3e 69 43 65 6c 6c  sert( pPg->iCell
4f80: 3c 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 50 67  <=nCell );.  pPg
4f90: 2d 3e 69 43 65 6c 6c 2b 2b 3b 0a 20 20 69 66 28  ->iCell++;.  if(
4fa0: 20 70 50 67 2d 3e 69 43 65 6c 6c 3d 3d 6e 43 65   pPg->iCell==nCe
4fb0: 6c 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  ll ){.    Pgno i
4fc0: 4c 6f 61 64 3b 0a 0a 20 20 20 20 2f 2a 20 55 70  Load;..    /* Up
4fd0: 20 74 6f 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20   to parent. */. 
4fe0: 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65     lsmFsPageRele
4ff0: 61 73 65 28 70 50 67 2d 3e 70 50 61 67 65 29 3b  ase(pPg->pPage);
5000: 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 20  .    pPg->pPage 
5010: 3d 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 69  = 0;.    pCsr->i
5020: 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28  Pg--;.    while(
5030: 20 70 43 73 72 2d 3e 69 50 67 3e 3d 30 20 29 7b   pCsr->iPg>=0 ){
5040: 0a 20 20 20 20 20 20 70 50 67 20 3d 20 26 70 43  .      pPg = &pC
5050: 73 72 2d 3e 61 50 67 5b 70 43 73 72 2d 3e 69 50  sr->aPg[pCsr->iP
5060: 67 5d 3b 0a 20 20 20 20 20 20 61 44 61 74 61 20  g];.      aData 
5070: 3d 20 66 73 50 61 67 65 44 61 74 61 28 70 50 67  = fsPageData(pPg
5080: 2d 3e 70 50 61 67 65 2c 20 26 6e 44 61 74 61 29  ->pPage, &nData)
5090: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  ;.      if( pPg-
50a0: 3e 69 43 65 6c 6c 3c 70 61 67 65 47 65 74 4e 52  >iCell<pageGetNR
50b0: 65 63 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29  ec(aData, nData)
50c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
50d0: 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65  lsmFsPageRelease
50e0: 28 70 50 67 2d 3e 70 50 61 67 65 29 3b 0a 20 20  (pPg->pPage);.  
50f0: 20 20 20 20 70 43 73 72 2d 3e 69 50 67 2d 2d 3b      pCsr->iPg--;
5100: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
5110: 65 61 64 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20  ead the key */. 
5120: 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72     rc = btreeCur
5130: 73 6f 72 4c 6f 61 64 4b 65 79 28 70 43 73 72 29  sorLoadKey(pCsr)
5140: 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73  ;..    /* Unless
5150: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
5160: 74 20 45 4f 46 2c 20 64 65 73 63 65 6e 64 20 74  t EOF, descend t
5170: 6f 20 63 65 6c 6c 20 2d 31 20 28 79 65 73 2c 20  o cell -1 (yes, 
5180: 6e 65 67 61 74 69 76 65 20 6f 6e 65 29 20 6f 66  negative one) of
5190: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 66   .    ** the lef
51a0: 74 2d 6d 6f 73 74 20 6d 6f 73 74 20 64 65 73 63  t-most most desc
51b0: 65 6e 64 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  endent. */.    i
51c0: 66 28 20 70 43 73 72 2d 3e 69 50 67 3e 3d 30 20  f( pCsr->iPg>=0 
51d0: 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 61  ){.      pCsr->a
51e0: 50 67 5b 70 43 73 72 2d 3e 69 50 67 5d 2e 69 43  Pg[pCsr->iPg].iC
51f0: 65 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 4c  ell++;..      iL
5200: 6f 61 64 20 3d 20 62 74 72 65 65 43 75 72 73 6f  oad = btreeCurso
5210: 72 50 74 72 28 61 44 61 74 61 2c 20 6e 44 61 74  rPtr(aData, nDat
5220: 61 2c 20 70 50 67 2d 3e 69 43 65 6c 6c 29 3b 0a  a, pPg->iCell);.
5230: 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
5240: 20 20 20 50 61 67 65 20 2a 70 4c 6f 61 64 3b 0a     Page *pLoad;.
5250: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 69 50          pCsr->iP
5260: 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 63 20  g++;.        rc 
5270: 3d 20 6c 73 6d 46 73 44 62 50 61 67 65 47 65 74  = lsmFsDbPageGet
5280: 28 70 43 73 72 2d 3e 70 46 53 2c 20 70 43 73 72  (pCsr->pFS, pCsr
5290: 2d 3e 70 53 65 67 2c 20 69 4c 6f 61 64 2c 20 26  ->pSeg, iLoad, &
52a0: 70 4c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  pLoad);.        
52b0: 70 43 73 72 2d 3e 61 50 67 5b 70 43 73 72 2d 3e  pCsr->aPg[pCsr->
52c0: 69 50 67 5d 2e 70 50 61 67 65 20 3d 20 70 4c 6f  iPg].pPage = pLo
52d0: 61 64 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72  ad;.        pCsr
52e0: 2d 3e 61 50 67 5b 70 43 73 72 2d 3e 69 50 67 5d  ->aPg[pCsr->iPg]
52f0: 2e 69 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  .iCell = 0;.    
5300: 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f      if( rc==LSM_
5310: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
5320: 69 66 28 20 70 43 73 72 2d 3e 69 50 67 3d 3d 28  if( pCsr->iPg==(
5330: 70 43 73 72 2d 3e 6e 44 65 70 74 68 2d 31 29 20  pCsr->nDepth-1) 
5340: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
5350: 20 20 20 61 44 61 74 61 20 3d 20 66 73 50 61 67     aData = fsPag
5360: 65 44 61 74 61 28 70 4c 6f 61 64 2c 20 26 6e 44  eData(pLoad, &nD
5370: 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ata);.          
5380: 69 4c 6f 61 64 20 3d 20 62 74 72 65 65 43 75 72  iLoad = btreeCur
5390: 73 6f 72 50 74 72 28 61 44 61 74 61 2c 20 6e 44  sorPtr(aData, nD
53a0: 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ata, 0);.       
53b0: 20 7d 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28   }.      }while(
53c0: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70   rc==LSM_OK && p
53d0: 43 73 72 2d 3e 69 50 67 3c 28 70 43 73 72 2d 3e  Csr->iPg<(pCsr->
53e0: 6e 44 65 70 74 68 2d 31 29 20 29 3b 0a 20 20 20  nDepth-1) );.   
53f0: 20 20 20 70 43 73 72 2d 3e 61 50 67 5b 70 43 73     pCsr->aPg[pCs
5400: 72 2d 3e 69 50 67 5d 2e 69 43 65 6c 6c 20 3d 20  r->iPg].iCell = 
5410: 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  -1;.    }..  }el
5420: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  se{.    rc = btr
5430: 65 65 43 75 72 73 6f 72 4c 6f 61 64 4b 65 79 28  eeCursorLoadKey(
5440: 70 43 73 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCsr);.  }..  if
5450: 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20  ( rc==LSM_OK && 
5460: 70 43 73 72 2d 3e 69 50 67 3e 3d 30 20 29 7b 0a  pCsr->iPg>=0 ){.
5470: 20 20 20 20 61 44 61 74 61 20 3d 20 66 73 50 61      aData = fsPa
5480: 67 65 44 61 74 61 28 70 43 73 72 2d 3e 61 50 67  geData(pCsr->aPg
5490: 5b 70 43 73 72 2d 3e 69 50 67 5d 2e 70 50 61 67  [pCsr->iPg].pPag
54a0: 65 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20  e, &nData);.    
54b0: 70 43 73 72 2d 3e 69 50 74 72 20 3d 20 62 74 72  pCsr->iPtr = btr
54c0: 65 65 43 75 72 73 6f 72 50 74 72 28 61 44 61 74  eeCursorPtr(aDat
54d0: 61 2c 20 6e 44 61 74 61 2c 20 70 43 73 72 2d 3e  a, nData, pCsr->
54e0: 61 50 67 5b 70 43 73 72 2d 3e 69 50 67 5d 2e 69  aPg[pCsr->iPg].i
54f0: 43 65 6c 6c 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20  Cell+1);.  }..  
5500: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
5510: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 43  atic void btreeC
5520: 75 72 73 6f 72 46 72 65 65 28 42 74 72 65 65 43  ursorFree(BtreeC
5530: 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20  ursor *pCsr){.  
5540: 69 66 28 20 70 43 73 72 20 29 7b 0a 20 20 20 20  if( pCsr ){.    
5550: 69 6e 74 20 69 3b 0a 20 20 20 20 6c 73 6d 5f 65  int i;.    lsm_e
5560: 6e 76 20 2a 70 45 6e 76 20 3d 20 6c 73 6d 46 73  nv *pEnv = lsmFs
5570: 45 6e 76 28 70 43 73 72 2d 3e 70 46 53 29 3b 0a  Env(pCsr->pFS);.
5580: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
5590: 70 43 73 72 2d 3e 69 50 67 3b 20 69 2b 2b 29 7b  pCsr->iPg; i++){
55a0: 0a 20 20 20 20 20 20 6c 73 6d 46 73 50 61 67 65  .      lsmFsPage
55b0: 52 65 6c 65 61 73 65 28 70 43 73 72 2d 3e 61 50  Release(pCsr->aP
55c0: 67 5b 69 5d 2e 70 50 61 67 65 29 3b 0a 20 20 20  g[i].pPage);.   
55d0: 20 7d 0a 20 20 20 20 73 6f 72 74 65 64 42 6c 6f   }.    sortedBlo
55e0: 62 46 72 65 65 28 26 70 43 73 72 2d 3e 62 6c 6f  bFree(&pCsr->blo
55f0: 62 29 3b 0a 20 20 20 20 6c 73 6d 46 72 65 65 28  b);.    lsmFree(
5600: 70 45 6e 76 2c 20 70 43 73 72 2d 3e 61 50 67 29  pEnv, pCsr->aPg)
5610: 3b 0a 20 20 20 20 6c 73 6d 46 72 65 65 28 70 45  ;.    lsmFree(pE
5620: 6e 76 2c 20 70 43 73 72 29 3b 0a 20 20 7d 0a 7d  nv, pCsr);.  }.}
5630: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  ..static int btr
5640: 65 65 43 75 72 73 6f 72 46 69 72 73 74 28 42 74  eeCursorFirst(Bt
5650: 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72 29  reeCursor *pCsr)
5660: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 50  {.  int rc;..  P
5670: 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
5680: 46 69 6c 65 53 79 73 74 65 6d 20 2a 70 46 53 20  FileSystem *pFS 
5690: 3d 20 70 43 73 72 2d 3e 70 46 53 3b 0a 20 20 69  = pCsr->pFS;.  i
56a0: 6e 74 20 69 50 67 20 3d 20 70 43 73 72 2d 3e 70  nt iPg = pCsr->p
56b0: 53 65 67 2d 3e 69 52 6f 6f 74 3b 0a 0a 20 20 64  Seg->iRoot;..  d
56c0: 6f 20 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d  o {.    rc = lsm
56d0: 46 73 44 62 50 61 67 65 47 65 74 28 70 46 53 2c  FsDbPageGet(pFS,
56e0: 20 70 43 73 72 2d 3e 70 53 65 67 2c 20 69 50 67   pCsr->pSeg, iPg
56f0: 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 61 73 73  , &pPg);.    ass
5700: 65 72 74 28 20 28 72 63 3d 3d 4c 53 4d 5f 4f 4b  ert( (rc==LSM_OK
5710: 29 3d 3d 28 70 50 67 21 3d 30 29 20 29 3b 0a 20  )==(pPg!=0) );. 
5720: 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
5730: 4b 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  K ){.      u8 *a
5740: 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20  Data;.      int 
5750: 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74  nData;.      int
5760: 20 66 6c 61 67 73 3b 0a 0a 20 20 20 20 20 20 61   flags;..      a
5770: 44 61 74 61 20 3d 20 66 73 50 61 67 65 44 61 74  Data = fsPageDat
5780: 61 28 70 50 67 2c 20 26 6e 44 61 74 61 29 3b 0a  a(pPg, &nData);.
5790: 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 70 61        flags = pa
57a0: 67 65 47 65 74 46 6c 61 67 73 28 61 44 61 74 61  geGetFlags(aData
57b0: 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , nData);.      
57c0: 69 66 28 20 28 66 6c 61 67 73 20 26 20 53 45 47  if( (flags & SEG
57d0: 4d 45 4e 54 5f 42 54 52 45 45 5f 46 4c 41 47 29  MENT_BTREE_FLAG)
57e0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==0 ) break;..  
57f0: 20 20 20 20 69 66 28 20 28 70 43 73 72 2d 3e 6e      if( (pCsr->n
5800: 44 65 70 74 68 20 25 20 38 29 3d 3d 30 20 29 7b  Depth % 8)==0 ){
5810: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  .        int nNe
5820: 77 20 3d 20 70 43 73 72 2d 3e 6e 44 65 70 74 68  w = pCsr->nDepth
5830: 20 2b 20 38 3b 0a 20 20 20 20 20 20 20 20 70 43   + 8;.        pC
5840: 73 72 2d 3e 61 50 67 20 3d 20 28 42 74 72 65 65  sr->aPg = (Btree
5850: 50 67 20 2a 29 6c 73 6d 52 65 61 6c 6c 6f 63 4f  Pg *)lsmReallocO
5860: 72 46 72 65 65 52 63 28 0a 20 20 20 20 20 20 20  rFreeRc(.       
5870: 20 20 20 20 20 6c 73 6d 46 73 45 6e 76 28 70 46       lsmFsEnv(pF
5880: 53 29 2c 20 70 43 73 72 2d 3e 61 50 67 2c 20 73  S), pCsr->aPg, s
5890: 69 7a 65 6f 66 28 42 74 72 65 65 50 67 29 20 2a  izeof(BtreePg) *
58a0: 20 6e 4e 65 77 2c 20 26 72 63 0a 20 20 20 20 20   nNew, &rc.     
58b0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
58c0: 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
58d0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
58e0: 28 26 70 43 73 72 2d 3e 61 50 67 5b 70 43 73 72  (&pCsr->aPg[pCsr
58f0: 2d 3e 6e 44 65 70 74 68 5d 2c 20 30 2c 20 73 69  ->nDepth], 0, si
5900: 7a 65 6f 66 28 42 74 72 65 65 50 67 29 20 2a 20  zeof(BtreePg) * 
5910: 38 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  8);.        }.  
5920: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
5930: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
5940: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5950: 43 73 72 2d 3e 61 50 67 5b 70 43 73 72 2d 3e 6e  Csr->aPg[pCsr->n
5960: 44 65 70 74 68 5d 2e 69 43 65 6c 6c 3d 3d 30 20  Depth].iCell==0 
5970: 29 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d  );.        pCsr-
5980: 3e 61 50 67 5b 70 43 73 72 2d 3e 6e 44 65 70 74  >aPg[pCsr->nDept
5990: 68 5d 2e 70 50 61 67 65 20 3d 20 70 50 67 3b 0a  h].pPage = pPg;.
59a0: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 6e 44          pCsr->nD
59b0: 65 70 74 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20  epth++;.        
59c0: 69 50 67 20 3d 20 70 61 67 65 47 65 74 52 65 63  iPg = pageGetRec
59d0: 6f 72 64 50 74 72 28 61 44 61 74 61 2c 20 6e 44  ordPtr(aData, nD
59e0: 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ata, 0);.      }
59f0: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
5a00: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 3b 0a 20   rc==LSM_OK );. 
5a10: 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73   lsmFsPageReleas
5a20: 65 28 70 50 67 29 3b 0a 20 20 70 43 73 72 2d 3e  e(pPg);.  pCsr->
5a30: 69 50 67 20 3d 20 70 43 73 72 2d 3e 6e 44 65 70  iPg = pCsr->nDep
5a40: 74 68 2d 31 3b 0a 0a 20 20 69 66 28 20 72 63 3d  th-1;..  if( rc=
5a50: 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 43 73 72 2d  =LSM_OK && pCsr-
5a60: 3e 6e 44 65 70 74 68 20 29 7b 0a 20 20 20 20 70  >nDepth ){.    p
5a70: 43 73 72 2d 3e 61 50 67 5b 70 43 73 72 2d 3e 69  Csr->aPg[pCsr->i
5a80: 50 67 5d 2e 69 43 65 6c 6c 20 3d 20 2d 31 3b 0a  Pg].iCell = -1;.
5a90: 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75      rc = btreeCu
5aa0: 72 73 6f 72 4e 65 78 74 28 70 43 73 72 29 3b 0a  rsorNext(pCsr);.
5ab0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
5ac0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
5ad0: 20 62 74 72 65 65 43 75 72 73 6f 72 50 6f 73 69   btreeCursorPosi
5ae0: 74 69 6f 6e 28 42 74 72 65 65 43 75 72 73 6f 72  tion(BtreeCursor
5af0: 20 2a 70 43 73 72 2c 20 4d 65 72 67 65 49 6e 70   *pCsr, MergeInp
5b00: 75 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 43  ut *p){.  if( pC
5b10: 73 72 2d 3e 69 50 67 3e 3d 30 20 29 7b 0a 20 20  sr->iPg>=0 ){.  
5b20: 20 20 70 2d 3e 69 50 67 20 3d 20 6c 73 6d 46 73    p->iPg = lsmFs
5b30: 50 61 67 65 4e 75 6d 62 65 72 28 70 43 73 72 2d  PageNumber(pCsr-
5b40: 3e 61 50 67 5b 70 43 73 72 2d 3e 69 50 67 5d 2e  >aPg[pCsr->iPg].
5b50: 70 50 61 67 65 29 3b 0a 20 20 20 20 70 2d 3e 69  pPage);.    p->i
5b60: 43 65 6c 6c 20 3d 20 28 28 70 43 73 72 2d 3e 61  Cell = ((pCsr->a
5b70: 50 67 5b 70 43 73 72 2d 3e 69 50 67 5d 2e 69 43  Pg[pCsr->iPg].iC
5b80: 65 6c 6c 20 2b 20 31 29 20 3c 3c 20 38 29 20 2b  ell + 1) << 8) +
5b90: 20 70 43 73 72 2d 3e 6e 44 65 70 74 68 3b 0a 20   pCsr->nDepth;. 
5ba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 69   }else{.    p->i
5bb0: 50 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 69  Pg = 0;.    p->i
5bc0: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Cell = 0;.  }.}.
5bd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
5be0: 65 65 43 75 72 73 6f 72 53 70 6c 69 74 6b 65 79  eeCursorSplitkey
5bf0: 28 42 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43  (BtreeCursor *pC
5c00: 73 72 2c 20 4d 65 72 67 65 49 6e 70 75 74 20 2a  sr, MergeInput *
5c10: 70 29 7b 0a 20 20 69 6e 74 20 69 43 65 6c 6c 20  p){.  int iCell 
5c20: 3d 20 70 43 73 72 2d 3e 61 50 67 5b 70 43 73 72  = pCsr->aPg[pCsr
5c30: 2d 3e 69 50 67 5d 2e 69 43 65 6c 6c 3b 0a 20 20  ->iPg].iCell;.  
5c40: 69 66 28 20 69 43 65 6c 6c 3e 3d 30 20 29 7b 0a  if( iCell>=0 ){.
5c50: 20 20 20 20 70 2d 3e 69 43 65 6c 6c 20 3d 20 69      p->iCell = i
5c60: 43 65 6c 6c 3b 0a 20 20 20 20 70 2d 3e 69 50 67  Cell;.    p->iPg
5c70: 20 3d 20 6c 73 6d 46 73 50 61 67 65 4e 75 6d 62   = lsmFsPageNumb
5c80: 65 72 28 70 43 73 72 2d 3e 61 50 67 5b 70 43 73  er(pCsr->aPg[pCs
5c90: 72 2d 3e 69 50 67 5d 2e 70 50 61 67 65 29 3b 0a  r->iPg].pPage);.
5ca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
5cb0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 43   i;.    for(i=pC
5cc0: 73 72 2d 3e 69 50 67 2d 31 3b 20 69 3e 3d 30 3b  sr->iPg-1; i>=0;
5cd0: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   i--){.      if(
5ce0: 20 70 43 73 72 2d 3e 61 50 67 5b 69 5d 2e 69 43   pCsr->aPg[i].iC
5cf0: 65 6c 6c 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20  ell>0 ) break;. 
5d00: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
5d10: 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e   i>=0 );.    p->
5d20: 69 43 65 6c 6c 20 3d 20 70 43 73 72 2d 3e 61 50  iCell = pCsr->aP
5d30: 67 5b 69 5d 2e 69 43 65 6c 6c 2d 31 3b 0a 20 20  g[i].iCell-1;.  
5d40: 20 20 70 2d 3e 69 50 67 20 3d 20 6c 73 6d 46 73    p->iPg = lsmFs
5d50: 50 61 67 65 4e 75 6d 62 65 72 28 70 43 73 72 2d  PageNumber(pCsr-
5d60: 3e 61 50 67 5b 69 5d 2e 70 50 61 67 65 29 3b 0a  >aPg[i].pPage);.
5d70: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e    }.}..static in
5d80: 74 20 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61  t sortedKeyCompa
5d90: 72 65 28 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70  re(.  int (*xCmp
5da0: 29 28 76 6f 69 64 20 2a 2c 20 69 6e 74 2c 20 76  )(void *, int, v
5db0: 6f 69 64 20 2a 2c 20 69 6e 74 29 2c 0a 20 20 69  oid *, int),.  i
5dc0: 6e 74 20 69 4c 68 73 54 6f 70 69 63 2c 20 76 6f  nt iLhsTopic, vo
5dd0: 69 64 20 2a 70 4c 68 73 4b 65 79 2c 20 69 6e 74  id *pLhsKey, int
5de0: 20 6e 4c 68 73 4b 65 79 2c 0a 20 20 69 6e 74 20   nLhsKey,.  int 
5df0: 69 52 68 73 54 6f 70 69 63 2c 20 76 6f 69 64 20  iRhsTopic, void 
5e00: 2a 70 52 68 73 4b 65 79 2c 20 69 6e 74 20 6e 52  *pRhsKey, int nR
5e10: 68 73 4b 65 79 0a 29 7b 0a 20 20 69 6e 74 20 72  hsKey.){.  int r
5e20: 65 73 20 3d 20 69 4c 68 73 54 6f 70 69 63 20 2d  es = iLhsTopic -
5e30: 20 69 52 68 73 54 6f 70 69 63 3b 0a 20 20 69 66   iRhsTopic;.  if
5e40: 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
5e50: 72 65 73 20 3d 20 78 43 6d 70 28 70 4c 68 73 4b  res = xCmp(pLhsK
5e60: 65 79 2c 20 6e 4c 68 73 4b 65 79 2c 20 70 52 68  ey, nLhsKey, pRh
5e70: 73 4b 65 79 2c 20 6e 52 68 73 4b 65 79 29 3b 0a  sKey, nRhsKey);.
5e80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
5e90: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
5ea0: 62 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  btreeCursorResto
5eb0: 72 65 28 0a 20 20 42 74 72 65 65 43 75 72 73 6f  re(.  BtreeCurso
5ec0: 72 20 2a 70 43 73 72 2c 20 0a 20 20 69 6e 74 20  r *pCsr, .  int 
5ed0: 28 2a 78 43 6d 70 29 28 76 6f 69 64 20 2a 2c 20  (*xCmp)(void *, 
5ee0: 69 6e 74 2c 20 76 6f 69 64 20 2a 2c 20 69 6e 74  int, void *, int
5ef0: 29 2c 0a 20 20 4d 65 72 67 65 49 6e 70 75 74 20  ),.  MergeInput 
5f00: 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *p.){.  int rc =
5f10: 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20   LSM_OK;..  if( 
5f20: 70 2d 3e 69 50 67 20 29 7b 0a 20 20 20 20 6c 73  p->iPg ){.    ls
5f30: 6d 5f 65 6e 76 20 2a 70 45 6e 76 20 3d 20 6c 73  m_env *pEnv = ls
5f40: 6d 46 73 45 6e 76 28 70 43 73 72 2d 3e 70 46 53  mFsEnv(pCsr->pFS
5f50: 29 3b 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  );.    int iCell
5f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5f70: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
5f80: 63 65 6c 6c 20 6e 75 6d 62 65 72 20 6f 6e 20 6c  cell number on l
5f90: 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  eaf page */.    
5fa0: 50 67 6e 6f 20 69 4c 65 61 66 3b 20 20 20 20 20  Pgno iLeaf;     
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5fc0: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
5fd0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
5fe0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 65  e */.    int nDe
5ff0: 70 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  pth;            
6000: 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20         /* Depth 
6010: 6f 66 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  of b-tree struct
6020: 75 72 65 20 2a 2f 0a 20 20 20 20 53 65 67 6d 65  ure */.    Segme
6030: 6e 74 20 2a 70 53 65 67 20 3d 20 70 43 73 72 2d  nt *pSeg = pCsr-
6040: 3e 70 53 65 67 3b 0a 0a 20 20 20 20 2f 2a 20 44  >pSeg;..    /* D
6050: 65 63 6f 64 65 20 74 68 65 20 4d 65 72 67 65 49  ecode the MergeI
6060: 6e 70 75 74 20 73 74 72 75 63 74 75 72 65 20 2a  nput structure *
6070: 2f 0a 20 20 20 20 69 4c 65 61 66 20 3d 20 70 2d  /.    iLeaf = p-
6080: 3e 69 50 67 3b 0a 20 20 20 20 6e 44 65 70 74 68  >iPg;.    nDepth
6090: 20 3d 20 28 70 2d 3e 69 43 65 6c 6c 20 26 20 30   = (p->iCell & 0
60a0: 78 30 30 46 46 29 3b 0a 20 20 20 20 69 43 65 6c  x00FF);.    iCel
60b0: 6c 20 3d 20 28 70 2d 3e 69 43 65 6c 6c 20 3e 3e  l = (p->iCell >>
60c0: 20 38 29 20 2d 20 31 3b 0a 0a 20 20 20 20 2f 2a   8) - 1;..    /*
60d0: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 42 74   Allocate the Bt
60e0: 72 65 65 43 75 72 73 6f 72 2e 61 50 67 5b 5d 20  reeCursor.aPg[] 
60f0: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 61 73 73  array */.    ass
6100: 65 72 74 28 20 70 43 73 72 2d 3e 61 50 67 3d 3d  ert( pCsr->aPg==
6110: 30 20 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61  0 );.    pCsr->a
6120: 50 67 20 3d 20 28 42 74 72 65 65 50 67 20 2a 29  Pg = (BtreePg *)
6130: 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63 28  lsmMallocZeroRc(
6140: 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28 42 74 72  pEnv, sizeof(Btr
6150: 65 65 50 67 29 20 2a 20 6e 44 65 70 74 68 2c 20  eePg) * nDepth, 
6160: 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f  &rc);..    /* Po
6170: 70 75 6c 61 74 65 20 74 68 65 20 6c 61 73 74 20  pulate the last 
6180: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 61 50 67  entry of the aPg
6190: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
61a0: 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  if( rc==LSM_OK )
61b0: 7b 0a 20 20 20 20 20 20 50 61 67 65 20 2a 2a 70  {.      Page **p
61c0: 70 20 3d 20 26 70 43 73 72 2d 3e 61 50 67 5b 6e  p = &pCsr->aPg[n
61d0: 44 65 70 74 68 2d 31 5d 2e 70 50 61 67 65 3b 0a  Depth-1].pPage;.
61e0: 20 20 20 20 20 20 70 43 73 72 2d 3e 69 50 67 20        pCsr->iPg 
61f0: 3d 20 6e 44 65 70 74 68 2d 31 3b 0a 20 20 20 20  = nDepth-1;.    
6200: 20 20 70 43 73 72 2d 3e 6e 44 65 70 74 68 20 3d    pCsr->nDepth =
6210: 20 6e 44 65 70 74 68 3b 0a 20 20 20 20 20 20 70   nDepth;.      p
6220: 43 73 72 2d 3e 61 50 67 5b 70 43 73 72 2d 3e 69  Csr->aPg[pCsr->i
6230: 50 67 5d 2e 69 43 65 6c 6c 20 3d 20 69 43 65 6c  Pg].iCell = iCel
6240: 6c 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 73  l;.      rc = ls
6250: 6d 46 73 44 62 50 61 67 65 47 65 74 28 70 43 73  mFsDbPageGet(pCs
6260: 72 2d 3e 70 46 53 2c 20 70 53 65 67 2c 20 69 4c  r->pFS, pSeg, iL
6270: 65 61 66 2c 20 70 70 29 3b 0a 20 20 20 20 7d 0a  eaf, pp);.    }.
6280: 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
6290: 20 61 6e 79 20 6f 74 68 65 72 20 61 50 67 5b 5d   any other aPg[]
62a0: 20 61 72 72 61 79 20 65 6e 74 72 69 65 73 20 2a   array entries *
62b0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53  /.    if( rc==LS
62c0: 4d 5f 4f 4b 20 26 26 20 6e 44 65 70 74 68 3e 31  M_OK && nDepth>1
62d0: 20 29 7b 0a 20 20 20 20 20 20 42 6c 6f 62 20 62   ){.      Blob b
62e0: 6c 6f 62 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 20  lob = {0,0,0};. 
62f0: 20 20 20 20 20 76 6f 69 64 20 2a 70 53 65 65 6b       void *pSeek
6300: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 65 65  ;.      int nSee
6310: 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 6f  k;.      int iTo
6320: 70 69 63 53 65 65 6b 3b 0a 20 20 20 20 20 20 69  picSeek;.      i
6330: 6e 74 20 69 50 67 20 3d 20 30 3b 0a 20 20 20 20  nt iPg = 0;.    
6340: 20 20 69 6e 74 20 69 4c 6f 61 64 20 3d 20 70 53    int iLoad = pS
6350: 65 67 2d 3e 69 52 6f 6f 74 3b 0a 20 20 20 20 20  eg->iRoot;.     
6360: 20 50 61 67 65 20 2a 70 50 67 20 3d 20 70 43 73   Page *pPg = pCs
6370: 72 2d 3e 61 50 67 5b 6e 44 65 70 74 68 2d 31 5d  r->aPg[nDepth-1]
6380: 2e 70 50 61 67 65 3b 0a 20 0a 20 20 20 20 20 20  .pPage;. .      
6390: 69 66 28 20 70 61 67 65 4f 62 6a 47 65 74 4e 52  if( pageObjGetNR
63a0: 65 63 28 70 50 67 29 3d 3d 30 20 29 7b 0a 20 20  ec(pPg)==0 ){.  
63b0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
63c0: 6e 20 68 61 70 70 65 6e 20 77 68 65 6e 20 70 50  n happen when pP
63d0: 67 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  g is the right-m
63e0: 6f 73 74 20 6c 65 61 66 20 69 6e 20 74 68 65 20  ost leaf in the 
63f0: 62 2d 74 72 65 65 2e 0a 20 20 20 20 20 20 20 20  b-tree..        
6400: 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  ** In this case,
6410: 20 73 65 74 20 74 68 65 20 69 54 6f 70 69 63 53   set the iTopicS
6420: 65 65 6b 2f 70 53 65 65 6b 2f 6e 53 65 65 6b 20  eek/pSeek/nSeek 
6430: 6b 65 79 20 74 6f 20 61 20 76 61 6c 75 65 0a 20  key to a value. 
6440: 20 20 20 20 20 20 20 2a 2a 20 67 72 65 61 74 65         ** greate
6450: 72 20 74 68 61 6e 20 61 6e 79 20 72 65 61 6c 20  r than any real 
6460: 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  key.  */.       
6470: 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3d 3d   assert( iCell==
6480: 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 54  -1 );.        iT
6490: 6f 70 69 63 53 65 65 6b 20 3d 20 31 30 30 30 3b  opicSeek = 1000;
64a0: 0a 20 20 20 20 20 20 20 20 70 53 65 65 6b 20 3d  .        pSeek =
64b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 53 65 65   0;.        nSee
64c0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  k = 0;.      }el
64d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  se{.        Pgno
64e0: 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20   dummy;.        
64f0: 72 63 20 3d 20 70 61 67 65 47 65 74 42 74 72 65  rc = pageGetBtre
6500: 65 4b 65 79 28 70 53 65 67 2c 20 70 50 67 2c 0a  eKey(pSeg, pPg,.
6510: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 26              0, &
6520: 64 75 6d 6d 79 2c 20 26 69 54 6f 70 69 63 53 65  dummy, &iTopicSe
6530: 65 6b 2c 20 26 70 53 65 65 6b 2c 20 26 6e 53 65  ek, &pSeek, &nSe
6540: 65 6b 2c 20 26 70 43 73 72 2d 3e 62 6c 6f 62 0a  ek, &pCsr->blob.
6550: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
6560: 20 7d 0a 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20   }..      do {. 
6570: 20 20 20 20 20 20 20 50 61 67 65 20 2a 70 50 67         Page *pPg
6580: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
6590: 73 6d 46 73 44 62 50 61 67 65 47 65 74 28 70 43  smFsDbPageGet(pC
65a0: 73 72 2d 3e 70 46 53 2c 20 70 53 65 67 2c 20 69  sr->pFS, pSeg, i
65b0: 4c 6f 61 64 2c 20 26 70 50 67 29 3b 0a 20 20 20  Load, &pPg);.   
65c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
65d0: 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 70 50 67 3d 3d  =LSM_OK || pPg==
65e0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
65f0: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
6600: 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 44 61           u8 *aDa
6610: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
6620: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
6630: 6f 6e 74 61 69 6e 69 6e 67 20 70 61 67 65 20 64  ontaining page d
6640: 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ata */.         
6650: 20 69 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20   int nData;     
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6670: 53 69 7a 65 20 6f 66 20 61 44 61 74 61 5b 5d 20  Size of aData[] 
6680: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
6690: 20 20 20 20 20 20 69 6e 74 20 69 4d 69 6e 3b 0a        int iMin;.
66a0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 4d            int iM
66b0: 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  ax;.          in
66c0: 74 20 69 43 65 6c 6c 3b 0a 0a 20 20 20 20 20 20  t iCell;..      
66d0: 20 20 20 20 61 44 61 74 61 20 3d 20 66 73 50 61      aData = fsPa
66e0: 67 65 44 61 74 61 28 70 50 67 2c 20 26 6e 44 61  geData(pPg, &nDa
66f0: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ta);.          a
6700: 73 73 65 72 74 28 20 28 70 61 67 65 47 65 74 46  ssert( (pageGetF
6710: 6c 61 67 73 28 61 44 61 74 61 2c 20 6e 44 61 74  lags(aData, nDat
6720: 61 29 20 26 20 53 45 47 4d 45 4e 54 5f 42 54 52  a) & SEGMENT_BTR
6730: 45 45 5f 46 4c 41 47 29 20 29 3b 0a 0a 20 20 20  EE_FLAG) );..   
6740: 20 20 20 20 20 20 20 69 4c 6f 61 64 20 3d 20 70         iLoad = p
6750: 61 67 65 47 65 74 50 74 72 28 61 44 61 74 61 2c  ageGetPtr(aData,
6760: 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   nData);.       
6770: 20 20 20 69 43 65 6c 6c 20 3d 20 70 61 67 65 47     iCell = pageG
6780: 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44  etNRec(aData, nD
6790: 61 74 61 29 3b 20 0a 20 20 20 20 20 20 20 20 20  ata); .         
67a0: 20 69 4d 61 78 20 3d 20 69 43 65 6c 6c 2d 31 3b   iMax = iCell-1;
67b0: 0a 20 20 20 20 20 20 20 20 20 20 69 4d 69 6e 20  .          iMin 
67c0: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 0;..          
67d0: 77 68 69 6c 65 28 20 69 4d 61 78 3e 3d 69 4d 69  while( iMax>=iMi
67e0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
67f0: 20 69 6e 74 20 69 54 72 79 20 3d 20 28 69 4d 69   int iTry = (iMi
6800: 6e 2b 69 4d 61 78 29 2f 32 3b 0a 20 20 20 20 20  n+iMax)/2;.     
6810: 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4b 65         void *pKe
6820: 79 3b 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20  y; int nKey;    
6830: 20 20 20 20 20 2f 2a 20 4b 65 79 20 66 6f 72 20       /* Key for 
6840: 63 65 6c 6c 20 69 54 72 79 20 2a 2f 0a 20 20 20  cell iTry */.   
6850: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 6f           int iTo
6860: 70 69 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  pic;            
6870: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 69 63 20         /* Topic 
6880: 66 6f 72 20 6b 65 79 20 70 4b 65 79 54 2f 6e 4b  for key pKeyT/nK
6890: 65 79 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eyT */.         
68a0: 20 20 20 50 67 6e 6f 20 69 50 74 72 3b 20 20 20     Pgno iPtr;   
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68c0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 66 6f 72 20   /* Pointer for 
68d0: 63 65 6c 6c 20 69 54 72 79 20 2a 2f 0a 20 20 20  cell iTry */.   
68e0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73           int res
68f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6900: 20 20 20 20 20 20 20 2f 2a 20 28 70 53 65 65 6b         /* (pSeek
6910: 20 2d 20 70 4b 65 79 54 29 20 2a 2f 0a 0a 20 20   - pKeyT) */..  
6920: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
6930: 61 67 65 47 65 74 42 74 72 65 65 4b 65 79 28 0a  ageGetBtreeKey(.
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 70 53 65 67 2c 20 70 50 67 2c 20 69 54 72 79 2c  pSeg, pPg, iTry,
6960: 20 26 69 50 74 72 2c 20 26 69 54 6f 70 69 63 2c   &iPtr, &iTopic,
6970: 20 26 70 4b 65 79 2c 20 26 6e 4b 65 79 2c 20 26   &pKey, &nKey, &
6980: 62 6c 6f 62 0a 20 20 20 20 20 20 20 20 20 20 20  blob.           
6990: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
69a0: 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29  if( rc!=LSM_OK )
69b0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
69c0: 20 20 20 20 20 72 65 73 20 3d 20 73 6f 72 74 65       res = sorte
69d0: 64 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 20  dKeyCompare(.   
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 43 6d               xCm
69f0: 70 2c 20 69 54 6f 70 69 63 53 65 65 6b 2c 20 70  p, iTopicSeek, p
6a00: 53 65 65 6b 2c 20 6e 53 65 65 6b 2c 20 69 54 6f  Seek, nSeek, iTo
6a10: 70 69 63 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 0a  pic, pKey, nKey.
6a20: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
6a30: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
6a40: 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 0a 20 20  t( res!=0 );..  
6a50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
6a60: 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  s<0 ){.         
6a70: 20 20 20 20 20 69 4c 6f 61 64 20 3d 20 69 50 74       iLoad = iPt
6a80: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r;.             
6a90: 20 69 43 65 6c 6c 20 3d 20 69 54 72 79 3b 0a 20   iCell = iTry;. 
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4d 61               iMa
6ab0: 78 20 3d 20 69 54 72 79 2d 31 3b 0a 20 20 20 20  x = iTry-1;.    
6ac0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 4d 69               iMi
6ae0: 6e 20 3d 20 69 54 72 79 2b 31 3b 0a 20 20 20 20  n = iTry+1;.    
6af0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6b00: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
6b10: 20 70 43 73 72 2d 3e 61 50 67 5b 69 50 67 5d 2e   pCsr->aPg[iPg].
6b20: 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 20  pPage = pPg;.   
6b30: 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 50 67         pCsr->aPg
6b40: 5b 69 50 67 5d 2e 69 43 65 6c 6c 20 3d 20 69 43  [iPg].iCell = iC
6b50: 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ell;.          i
6b60: 50 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  Pg++;.          
6b70: 61 73 73 65 72 74 28 20 69 50 67 21 3d 6e 44 65  assert( iPg!=nDe
6b80: 70 74 68 2d 31 20 0a 20 20 20 20 20 20 20 20 20  pth-1 .         
6b90: 20 20 20 20 20 20 7c 7c 20 6c 73 6d 46 73 52 65        || lsmFsRe
6ba0: 64 69 72 65 63 74 50 61 67 65 28 70 43 73 72 2d  directPage(pCsr-
6bb0: 3e 70 46 53 2c 20 70 53 65 67 2d 3e 70 52 65 64  >pFS, pSeg->pRed
6bc0: 69 72 65 63 74 2c 20 69 4c 6f 61 64 29 3d 3d 69  irect, iLoad)==i
6bd0: 4c 65 61 66 0a 20 20 20 20 20 20 20 20 20 20 29  Leaf.          )
6be0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6bf0: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 4c 53    }while( rc==LS
6c00: 4d 5f 4f 4b 20 26 26 20 69 50 67 3c 28 6e 44 65  M_OK && iPg<(nDe
6c10: 70 74 68 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  pth-1) );.      
6c20: 73 6f 72 74 65 64 42 6c 6f 62 46 72 65 65 28 26  sortedBlobFree(&
6c30: 62 6c 6f 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  blob);.    }..  
6c40: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63 75    /* Load the cu
6c50: 72 72 65 6e 74 20 6b 65 79 20 61 6e 64 20 70 6f  rrent key and po
6c60: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  inter */.    if(
6c70: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
6c80: 20 20 20 20 20 42 74 72 65 65 50 67 20 2a 70 42       BtreePg *pB
6c90: 74 72 65 65 50 67 3b 0a 20 20 20 20 20 20 75 38  treePg;.      u8
6ca0: 20 2a 61 44 61 74 61 3b 0a 20 20 20 20 20 20 69   *aData;.      i
6cb0: 6e 74 20 6e 44 61 74 61 3b 0a 0a 20 20 20 20 20  nt nData;..     
6cc0: 20 70 42 74 72 65 65 50 67 20 3d 20 26 70 43 73   pBtreePg = &pCs
6cd0: 72 2d 3e 61 50 67 5b 70 43 73 72 2d 3e 69 50 67  r->aPg[pCsr->iPg
6ce0: 5d 3b 0a 20 20 20 20 20 20 61 44 61 74 61 20 3d  ];.      aData =
6cf0: 20 66 73 50 61 67 65 44 61 74 61 28 70 42 74 72   fsPageData(pBtr
6d00: 65 65 50 67 2d 3e 70 50 61 67 65 2c 20 26 6e 44  eePg->pPage, &nD
6d10: 61 74 61 29 3b 0a 20 20 20 20 20 20 70 43 73 72  ata);.      pCsr
6d20: 2d 3e 69 50 74 72 20 3d 20 62 74 72 65 65 43 75  ->iPtr = btreeCu
6d30: 72 73 6f 72 50 74 72 28 61 44 61 74 61 2c 20 6e  rsorPtr(aData, n
6d40: 44 61 74 61 2c 20 70 42 74 72 65 65 50 67 2d 3e  Data, pBtreePg->
6d50: 69 43 65 6c 6c 2b 31 29 3b 0a 20 20 20 20 20 20  iCell+1);.      
6d60: 69 66 28 20 70 42 74 72 65 65 50 67 2d 3e 69 43  if( pBtreePg->iC
6d70: 65 6c 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ell<0 ){.       
6d80: 20 50 67 6e 6f 20 64 75 6d 6d 79 3b 0a 20 20 20   Pgno dummy;.   
6d90: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
6da0: 20 20 20 20 66 6f 72 28 69 3d 70 43 73 72 2d 3e      for(i=pCsr->
6db0: 69 50 67 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  iPg-1; i>=0; i--
6dc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
6dd0: 20 70 43 73 72 2d 3e 61 50 67 5b 69 5d 2e 69 43   pCsr->aPg[i].iC
6de0: 65 6c 6c 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20  ell>0 ) break;. 
6df0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6e00: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 29 3b   assert( i>=0 );
6e10: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
6e20: 67 65 47 65 74 42 74 72 65 65 4b 65 79 28 70 53  geGetBtreeKey(pS
6e30: 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  eg,.            
6e40: 70 43 73 72 2d 3e 61 50 67 5b 69 5d 2e 70 50 61  pCsr->aPg[i].pPa
6e50: 67 65 2c 20 70 43 73 72 2d 3e 61 50 67 5b 69 5d  ge, pCsr->aPg[i]
6e60: 2e 69 43 65 6c 6c 2d 31 2c 0a 20 20 20 20 20 20  .iCell-1,.      
6e70: 20 20 20 20 20 20 26 64 75 6d 6d 79 2c 20 26 70        &dummy, &p
6e80: 43 73 72 2d 3e 65 54 79 70 65 2c 20 26 70 43 73  Csr->eType, &pCs
6e90: 72 2d 3e 70 4b 65 79 2c 20 26 70 43 73 72 2d 3e  r->pKey, &pCsr->
6ea0: 6e 4b 65 79 2c 20 26 70 43 73 72 2d 3e 62 6c 6f  nKey, &pCsr->blo
6eb0: 62 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  b.        );.   
6ec0: 20 20 20 20 20 70 43 73 72 2d 3e 65 54 79 70 65       pCsr->eType
6ed0: 20 7c 3d 20 4c 53 4d 5f 53 45 50 41 52 41 54 4f   |= LSM_SEPARATO
6ee0: 52 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  R;..      }else{
6ef0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
6f00: 72 65 65 43 75 72 73 6f 72 4c 6f 61 64 4b 65 79  reeCursorLoadKey
6f10: 28 70 43 73 72 29 3b 0a 20 20 20 20 20 20 7d 0a  (pCsr);.      }.
6f20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6f30: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
6f40: 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
6f50: 4e 65 77 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70  New(.  lsm_db *p
6f60: 44 62 2c 0a 20 20 53 65 67 6d 65 6e 74 20 2a 70  Db,.  Segment *p
6f70: 53 65 67 2c 0a 20 20 42 74 72 65 65 43 75 72 73  Seg,.  BtreeCurs
6f80: 6f 72 20 2a 2a 70 70 43 73 72 0a 29 7b 0a 20 20  or **ppCsr.){.  
6f90: 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b  int rc = LSM_OK;
6fa0: 0a 20 20 42 74 72 65 65 43 75 72 73 6f 72 20 2a  .  BtreeCursor *
6fb0: 70 43 73 72 3b 0a 20 20 0a 20 20 61 73 73 65 72  pCsr;.  .  asser
6fc0: 74 28 20 70 53 65 67 2d 3e 69 52 6f 6f 74 20 29  t( pSeg->iRoot )
6fd0: 3b 0a 20 20 70 43 73 72 20 3d 20 6c 73 6d 4d 61  ;.  pCsr = lsmMa
6fe0: 6c 6c 6f 63 5a 65 72 6f 52 63 28 70 44 62 2d 3e  llocZeroRc(pDb->
6ff0: 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28 42 74 72  pEnv, sizeof(Btr
7000: 65 65 43 75 72 73 6f 72 29 2c 20 26 72 63 29 3b  eeCursor), &rc);
7010: 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20  .  if( pCsr ){. 
7020: 20 20 20 70 43 73 72 2d 3e 70 46 53 20 3d 20 70     pCsr->pFS = p
7030: 44 62 2d 3e 70 46 53 3b 0a 20 20 20 20 70 43 73  Db->pFS;.    pCs
7040: 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  r->pSeg = pSeg;.
7050: 20 20 20 20 70 43 73 72 2d 3e 69 50 67 20 3d 20      pCsr->iPg = 
7060: 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 43 73  -1;.  }..  *ppCs
7070: 72 20 3d 20 70 43 73 72 3b 0a 20 20 72 65 74 75  r = pCsr;.  retu
7080: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
7090: 20 76 6f 69 64 20 73 65 67 6d 65 6e 74 50 74 72   void segmentPtr
70a0: 53 65 74 50 61 67 65 28 53 65 67 6d 65 6e 74 50  SetPage(SegmentP
70b0: 74 72 20 2a 70 50 74 72 2c 20 50 61 67 65 20 2a  tr *pPtr, Page *
70c0: 70 4e 65 78 74 29 7b 0a 20 20 6c 73 6d 46 73 50  pNext){.  lsmFsP
70d0: 61 67 65 52 65 6c 65 61 73 65 28 70 50 74 72 2d  ageRelease(pPtr-
70e0: 3e 70 50 67 29 3b 0a 20 20 69 66 28 20 70 4e 65  >pPg);.  if( pNe
70f0: 78 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44  xt ){.    int nD
7100: 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 61 44 61  ata;.    u8 *aDa
7110: 74 61 20 3d 20 66 73 50 61 67 65 44 61 74 61 28  ta = fsPageData(
7120: 70 4e 65 78 74 2c 20 26 6e 44 61 74 61 29 3b 0a  pNext, &nData);.
7130: 20 20 20 20 70 50 74 72 2d 3e 6e 43 65 6c 6c 20      pPtr->nCell 
7140: 3d 20 70 61 67 65 47 65 74 4e 52 65 63 28 61 44  = pageGetNRec(aD
7150: 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20  ata, nData);.   
7160: 20 70 50 74 72 2d 3e 66 6c 61 67 73 20 3d 20 70   pPtr->flags = p
7170: 61 67 65 47 65 74 46 6c 61 67 73 28 61 44 61 74  ageGetFlags(aDat
7180: 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 70  a, nData);.    p
7190: 50 74 72 2d 3e 69 50 74 72 20 3d 20 70 61 67 65  Ptr->iPtr = page
71a0: 47 65 74 50 74 72 28 61 44 61 74 61 2c 20 6e 44  GetPtr(aData, nD
71b0: 61 74 61 29 3b 0a 20 20 7d 0a 20 20 70 50 74 72  ata);.  }.  pPtr
71c0: 2d 3e 70 50 67 20 3d 20 70 4e 65 78 74 3b 0a 7d  ->pPg = pNext;.}
71d0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 61 20 6e  ../*.** Load a n
71e0: 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
71f0: 20 53 65 67 6d 65 6e 74 50 74 72 20 6f 62 6a 65   SegmentPtr obje
7200: 63 74 20 70 50 74 72 2e 0a 2a 2f 0a 73 74 61 74  ct pPtr..*/.stat
7210: 69 63 20 69 6e 74 20 73 65 67 6d 65 6e 74 50 74  ic int segmentPt
7220: 72 4c 6f 61 64 50 61 67 65 28 0a 20 20 46 69 6c  rLoadPage(.  Fil
7230: 65 53 79 73 74 65 6d 20 2a 70 46 53 2c 0a 20 20  eSystem *pFS,.  
7240: 53 65 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72  SegmentPtr *pPtr
7250: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7260: 2a 20 4c 6f 61 64 20 70 61 67 65 20 69 6e 74 6f  * Load page into
7270: 20 74 68 69 73 20 53 65 67 6d 65 6e 74 50 74 72   this SegmentPtr
7280: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
7290: 20 69 4e 65 77 20 20 20 20 20 20 20 20 20 20 20   iNew           
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
72b0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65  age number of ne
72c0: 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 50  w page */.){.  P
72d0: 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 20 20 20  age *pPg = 0;   
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
72f0: 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 2a 2f   The new page */
7300: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7320: 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
7330: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 6c 73 6d 46   */..  rc = lsmF
7340: 73 44 62 50 61 67 65 47 65 74 28 70 46 53 2c 20  sDbPageGet(pFS, 
7350: 70 50 74 72 2d 3e 70 53 65 67 2c 20 69 4e 65 77  pPtr->pSeg, iNew
7360: 2c 20 26 70 50 67 29 3b 0a 20 20 61 73 73 65 72  , &pPg);.  asser
7370: 74 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 7c 7c  t( rc==LSM_OK ||
7380: 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 73 65 67   pPg==0 );.  seg
7390: 6d 65 6e 74 50 74 72 53 65 74 50 61 67 65 28 70  mentPtrSetPage(p
73a0: 50 74 72 2c 20 70 50 67 29 3b 0a 0a 20 20 72 65  Ptr, pPg);..  re
73b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
73c0: 69 63 20 69 6e 74 20 73 65 67 6d 65 6e 74 50 74  ic int segmentPt
73d0: 72 52 65 61 64 44 61 74 61 28 0a 20 20 53 65 67  rReadData(.  Seg
73e0: 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 2c 0a 20  mentPtr *pPtr,. 
73f0: 20 69 6e 74 20 69 4f 66 66 2c 0a 20 20 69 6e 74   int iOff,.  int
7400: 20 6e 42 79 74 65 2c 0a 20 20 76 6f 69 64 20 2a   nByte,.  void *
7410: 2a 70 70 44 61 74 61 2c 0a 20 20 42 6c 6f 62 20  *ppData,.  Blob 
7420: 2a 70 42 6c 6f 62 0a 29 7b 0a 20 20 72 65 74 75  *pBlob.){.  retu
7430: 72 6e 20 73 6f 72 74 65 64 52 65 61 64 44 61 74  rn sortedReadDat
7440: 61 28 70 50 74 72 2d 3e 70 53 65 67 2c 20 70 50  a(pPtr->pSeg, pP
7450: 74 72 2d 3e 70 50 67 2c 20 69 4f 66 66 2c 20 6e  tr->pPg, iOff, n
7460: 42 79 74 65 2c 20 70 70 44 61 74 61 2c 20 70 42  Byte, ppData, pB
7470: 6c 6f 62 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  lob);.}..static 
7480: 69 6e 74 20 73 65 67 6d 65 6e 74 50 74 72 4e 65  int segmentPtrNe
7490: 78 74 50 61 67 65 28 0a 20 20 53 65 67 6d 65 6e  xtPage(.  Segmen
74a0: 74 50 74 72 20 2a 70 50 74 72 2c 20 20 20 20 20  tPtr *pPtr,     
74b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64           /* Load
74c0: 20 70 61 67 65 20 69 6e 74 6f 20 74 68 69 73 20   page into this 
74d0: 53 65 67 6d 65 6e 74 50 74 72 20 6f 62 6a 65 63  SegmentPtr objec
74e0: 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 69 72 20  t */.  int eDir 
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7500: 20 20 20 20 20 20 2f 2a 20 2b 31 20 66 6f 72 20        /* +1 for 
7510: 6e 65 78 74 28 29 2c 20 2d 31 20 66 6f 72 20 70  next(), -1 for p
7520: 72 65 76 28 29 20 2a 2f 0a 29 7b 0a 20 20 50 61  rev() */.){.  Pa
7530: 67 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  ge *pNext;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7550: 4e 65 77 20 70 61 67 65 20 74 6f 20 6c 6f 61 64  New page to load
7560: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7580: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
7590: 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
75a0: 28 20 65 44 69 72 3d 3d 31 20 7c 7c 20 65 44 69  ( eDir==1 || eDi
75b0: 72 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72  r==-1 );.  asser
75c0: 74 28 20 70 50 74 72 2d 3e 70 50 67 20 29 3b 0a  t( pPtr->pPg );.
75d0: 20 20 61 73 73 65 72 74 28 20 70 50 74 72 2d 3e    assert( pPtr->
75e0: 70 53 65 67 20 7c 7c 20 65 44 69 72 3e 30 20 29  pSeg || eDir>0 )
75f0: 3b 0a 0a 20 20 72 63 20 3d 20 6c 73 6d 46 73 44  ;..  rc = lsmFsD
7600: 62 50 61 67 65 4e 65 78 74 28 70 50 74 72 2d 3e  bPageNext(pPtr->
7610: 70 53 65 67 2c 20 70 50 74 72 2d 3e 70 50 67 2c  pSeg, pPtr->pPg,
7620: 20 65 44 69 72 2c 20 26 70 4e 65 78 74 29 3b 0a   eDir, &pNext);.
7630: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 4c 53    assert( rc==LS
7640: 4d 5f 4f 4b 20 7c 7c 20 70 4e 65 78 74 3d 3d 30  M_OK || pNext==0
7650: 20 29 3b 0a 20 20 73 65 67 6d 65 6e 74 50 74 72   );.  segmentPtr
7660: 53 65 74 50 61 67 65 28 70 50 74 72 2c 20 70 4e  SetPage(pPtr, pN
7670: 65 78 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ext);.  return r
7680: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
7690: 20 73 65 67 6d 65 6e 74 50 74 72 4c 6f 61 64 43   segmentPtrLoadC
76a0: 65 6c 6c 28 0a 20 20 53 65 67 6d 65 6e 74 50 74  ell(.  SegmentPt
76b0: 72 20 2a 70 50 74 72 2c 20 20 20 20 20 20 20 20  r *pPtr,        
76c0: 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 70 61        /* Load pa
76d0: 67 65 20 69 6e 74 6f 20 74 68 69 73 20 53 65 67  ge into this Seg
76e0: 6d 65 6e 74 50 74 72 20 6f 62 6a 65 63 74 20 2a  mentPtr object *
76f0: 2f 0a 20 20 69 6e 74 20 69 4e 65 77 20 20 20 20  /.  int iNew    
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7710: 20 20 20 2f 2a 20 43 65 6c 6c 20 6e 75 6d 62 65     /* Cell numbe
7720: 72 20 6f 66 20 6e 65 77 20 63 65 6c 6c 20 2a 2f  r of new cell */
7730: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c  .){.  int rc = L
7740: 53 4d 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 74  SM_OK;.  if( pPt
7750: 72 2d 3e 70 50 67 20 29 7b 0a 20 20 20 20 75 38  r->pPg ){.    u8
7760: 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20   *aData;        
7770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7780: 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
7790: 61 74 61 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  ata buffer */.  
77a0: 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20    int iOff;     
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77c0: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 44 61  /* Offset in aDa
77d0: 74 61 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f  ta[] to read fro
77e0: 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 67  m */.    int nPg
77f0: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sz;             
7800: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
7810: 66 20 70 61 67 65 20 28 61 44 61 74 61 5b 5d 29  f page (aData[])
7820: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
7830: 20 20 61 73 73 65 72 74 28 20 69 4e 65 77 3c 70    assert( iNew<p
7840: 50 74 72 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  Ptr->nCell );.  
7850: 20 20 70 50 74 72 2d 3e 69 43 65 6c 6c 20 3d 20    pPtr->iCell = 
7860: 69 4e 65 77 3b 0a 20 20 20 20 61 44 61 74 61 20  iNew;.    aData 
7870: 3d 20 66 73 50 61 67 65 44 61 74 61 28 70 50 74  = fsPageData(pPt
7880: 72 2d 3e 70 50 67 2c 20 26 6e 50 67 73 7a 29 3b  r->pPg, &nPgsz);
7890: 0a 20 20 20 20 69 4f 66 66 20 3d 20 6c 73 6d 47  .    iOff = lsmG
78a0: 65 74 55 31 36 28 26 61 44 61 74 61 5b 53 45 47  etU16(&aData[SEG
78b0: 4d 45 4e 54 5f 43 45 4c 4c 50 54 52 5f 4f 46 46  MENT_CELLPTR_OFF
78c0: 53 45 54 28 6e 50 67 73 7a 2c 20 70 50 74 72 2d  SET(nPgsz, pPtr-
78d0: 3e 69 43 65 6c 6c 29 5d 29 3b 0a 20 20 20 20 70  >iCell)]);.    p
78e0: 50 74 72 2d 3e 65 54 79 70 65 20 3d 20 61 44 61  Ptr->eType = aDa
78f0: 74 61 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 69 4f  ta[iOff];.    iO
7900: 66 66 2b 2b 3b 0a 20 20 20 20 69 4f 66 66 20 2b  ff++;.    iOff +
7910: 3d 20 47 45 54 56 41 52 49 4e 54 36 34 28 26 61  = GETVARINT64(&a
7920: 44 61 74 61 5b 69 4f 66 66 5d 2c 20 70 50 74 72  Data[iOff], pPtr
7930: 2d 3e 69 50 67 50 74 72 29 3b 0a 20 20 20 20 69  ->iPgPtr);.    i
7940: 4f 66 66 20 2b 3d 20 47 45 54 56 41 52 49 4e 54  Off += GETVARINT
7950: 33 32 28 26 61 44 61 74 61 5b 69 4f 66 66 5d 2c  32(&aData[iOff],
7960: 20 70 50 74 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20   pPtr->nKey);.  
7970: 20 20 69 66 28 20 72 74 49 73 57 72 69 74 65 28    if( rtIsWrite(
7980: 70 50 74 72 2d 3e 65 54 79 70 65 29 20 29 7b 0a  pPtr->eType) ){.
7990: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 47 45        iOff += GE
79a0: 54 56 41 52 49 4e 54 33 32 28 26 61 44 61 74 61  TVARINT32(&aData
79b0: 5b 69 4f 66 66 5d 2c 20 70 50 74 72 2d 3e 6e 56  [iOff], pPtr->nV
79c0: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  al);.    }.    a
79d0: 73 73 65 72 74 28 20 70 50 74 72 2d 3e 6e 4b 65  ssert( pPtr->nKe
79e0: 79 3e 3d 30 20 29 3b 0a 0a 20 20 20 20 72 63 20  y>=0 );..    rc 
79f0: 3d 20 73 65 67 6d 65 6e 74 50 74 72 52 65 61 64  = segmentPtrRead
7a00: 44 61 74 61 28 0a 20 20 20 20 20 20 20 20 70 50  Data(.        pP
7a10: 74 72 2c 20 69 4f 66 66 2c 20 70 50 74 72 2d 3e  tr, iOff, pPtr->
7a20: 6e 4b 65 79 2c 20 26 70 50 74 72 2d 3e 70 4b 65  nKey, &pPtr->pKe
7a30: 79 2c 20 26 70 50 74 72 2d 3e 62 6c 6f 62 31 0a  y, &pPtr->blob1.
7a40: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
7a50: 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 72 74 49  c==LSM_OK && rtI
7a60: 73 57 72 69 74 65 28 70 50 74 72 2d 3e 65 54 79  sWrite(pPtr->eTy
7a70: 70 65 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  pe) ){.      rc 
7a80: 3d 20 73 65 67 6d 65 6e 74 50 74 72 52 65 61 64  = segmentPtrRead
7a90: 44 61 74 61 28 0a 20 20 20 20 20 20 20 20 20 20  Data(.          
7aa0: 70 50 74 72 2c 20 69 4f 66 66 2b 70 50 74 72 2d  pPtr, iOff+pPtr-
7ab0: 3e 6e 4b 65 79 2c 20 70 50 74 72 2d 3e 6e 56 61  >nKey, pPtr->nVa
7ac0: 6c 2c 20 26 70 50 74 72 2d 3e 70 56 61 6c 2c 20  l, &pPtr->pVal, 
7ad0: 26 70 50 74 72 2d 3e 62 6c 6f 62 32 0a 20 20 20  &pPtr->blob2.   
7ae0: 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b     );.    }else{
7af0: 0a 20 20 20 20 20 20 70 50 74 72 2d 3e 6e 56 61  .      pPtr->nVa
7b00: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 74  l = 0;.      pPt
7b10: 72 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20  r->pVal = 0;.   
7b20: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
7b30: 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20   rc;.}...static 
7b40: 53 65 67 6d 65 6e 74 20 2a 73 6f 72 74 65 64 53  Segment *sortedS
7b50: 70 6c 69 74 6b 65 79 53 65 67 6d 65 6e 74 28 4c  plitkeySegment(L
7b60: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 29 7b 0a 20  evel *pLevel){. 
7b70: 20 4d 65 72 67 65 20 2a 70 4d 65 72 67 65 20 3d   Merge *pMerge =
7b80: 20 70 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65 3b   pLevel->pMerge;
7b90: 0a 20 20 4d 65 72 67 65 49 6e 70 75 74 20 2a 70  .  MergeInput *p
7ba0: 20 3d 20 26 70 4d 65 72 67 65 2d 3e 73 70 6c 69   = &pMerge->spli
7bb0: 74 6b 65 79 3b 0a 20 20 53 65 67 6d 65 6e 74 20  tkey;.  Segment 
7bc0: 2a 70 53 65 67 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pSeg;.  int i;.
7bd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d  .  for(i=0; i<pM
7be0: 65 72 67 65 2d 3e 6e 49 6e 70 75 74 3b 20 69 2b  erge->nInput; i+
7bf0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  +){.    if( p->i
7c00: 50 67 3d 3d 70 4d 65 72 67 65 2d 3e 61 49 6e 70  Pg==pMerge->aInp
7c10: 75 74 5b 69 5d 2e 69 50 67 20 29 20 62 72 65 61  ut[i].iPg ) brea
7c20: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 65  k;.  }.  if( pMe
7c30: 72 67 65 2d 3e 6e 49 6e 70 75 74 3d 3d 28 70 4c  rge->nInput==(pL
7c40: 65 76 65 6c 2d 3e 6e 52 69 67 68 74 2b 31 29 20  evel->nRight+1) 
7c50: 26 26 20 69 3e 3d 28 70 4d 65 72 67 65 2d 3e 6e  && i>=(pMerge->n
7c60: 49 6e 70 75 74 2d 31 29 20 29 7b 0a 20 20 20 20  Input-1) ){.    
7c70: 70 53 65 67 20 3d 20 26 70 4c 65 76 65 6c 2d 3e  pSeg = &pLevel->
7c80: 70 4e 65 78 74 2d 3e 6c 68 73 3b 0a 20 20 7d 65  pNext->lhs;.  }e
7c90: 6c 73 65 7b 0a 20 20 20 20 70 53 65 67 20 3d 20  lse{.    pSeg = 
7ca0: 26 70 4c 65 76 65 6c 2d 3e 61 52 68 73 5b 69 5d  &pLevel->aRhs[i]
7cb0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
7cc0: 70 53 65 67 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  pSeg;.}..static 
7cd0: 76 6f 69 64 20 73 6f 72 74 65 64 53 70 6c 69 74  void sortedSplit
7ce0: 6b 65 79 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c  key(lsm_db *pDb,
7cf0: 20 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20   Level *pLevel, 
7d00: 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 53 65 67  int *pRc){.  Seg
7d10: 6d 65 6e 74 20 2a 70 53 65 67 3b 0a 20 20 50 61  ment *pSeg;.  Pa
7d20: 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 6c  ge *pPg = 0;.  l
7d30: 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 20 3d 20 70  sm_env *pEnv = p
7d40: 44 62 2d 3e 70 45 6e 76 3b 20 20 20 20 20 20 2f  Db->pEnv;      /
7d50: 2a 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 68 61  * Environment ha
7d60: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ndle */.  int rc
7d70: 20 3d 20 2a 70 52 63 3b 0a 20 20 4d 65 72 67 65   = *pRc;.  Merge
7d80: 20 2a 70 4d 65 72 67 65 20 3d 20 70 4c 65 76 65   *pMerge = pLeve
7d90: 6c 2d 3e 70 4d 65 72 67 65 3b 0a 0a 20 20 70 53  l->pMerge;..  pS
7da0: 65 67 20 3d 20 73 6f 72 74 65 64 53 70 6c 69 74  eg = sortedSplit
7db0: 6b 65 79 53 65 67 6d 65 6e 74 28 70 4c 65 76 65  keySegment(pLeve
7dc0: 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53  l);.  if( rc==LS
7dd0: 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  M_OK ){.    rc =
7de0: 20 6c 73 6d 46 73 44 62 50 61 67 65 47 65 74 28   lsmFsDbPageGet(
7df0: 70 44 62 2d 3e 70 46 53 2c 20 70 53 65 67 2c 20  pDb->pFS, pSeg, 
7e00: 70 4d 65 72 67 65 2d 3e 73 70 6c 69 74 6b 65 79  pMerge->splitkey
7e10: 2e 69 50 67 2c 20 26 70 50 67 29 3b 0a 20 20 7d  .iPg, &pPg);.  }
7e20: 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f  .  if( rc==LSM_O
7e30: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 6f  K ){.    int iTo
7e40: 70 69 63 3b 0a 20 20 20 20 42 6c 6f 62 20 62 6c  pic;.    Blob bl
7e50: 6f 62 20 3d 20 7b 30 2c 20 30 2c 20 30 2c 20 30  ob = {0, 0, 0, 0
7e60: 7d 3b 0a 20 20 20 20 75 38 20 2a 61 44 61 74 61  };.    u8 *aData
7e70: 3b 0a 20 20 20 20 69 6e 74 20 6e 44 61 74 61 3b  ;.    int nData;
7e80: 0a 20 20 0a 20 20 20 20 61 44 61 74 61 20 3d 20  .  .    aData = 
7e90: 6c 73 6d 46 73 50 61 67 65 44 61 74 61 28 70 50  lsmFsPageData(pP
7ea0: 67 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20  g, &nData);.    
7eb0: 69 66 28 20 70 61 67 65 47 65 74 46 6c 61 67 73  if( pageGetFlags
7ec0: 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 20 26  (aData, nData) &
7ed0: 20 53 45 47 4d 45 4e 54 5f 42 54 52 45 45 5f 46   SEGMENT_BTREE_F
7ee0: 4c 41 47 20 29 7b 0a 20 20 20 20 20 20 76 6f 69  LAG ){.      voi
7ef0: 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 20 20 69  d *pKey;.      i
7f00: 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 50  nt nKey;.      P
7f10: 67 6e 6f 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  gno dummy;.     
7f20: 20 72 63 20 3d 20 70 61 67 65 47 65 74 42 74 72   rc = pageGetBtr
7f30: 65 65 4b 65 79 28 70 53 65 67 2c 0a 20 20 20 20  eeKey(pSeg,.    
7f40: 20 20 20 20 20 20 70 50 67 2c 20 70 4d 65 72 67        pPg, pMerg
7f50: 65 2d 3e 73 70 6c 69 74 6b 65 79 2e 69 43 65 6c  e->splitkey.iCel
7f60: 6c 2c 20 26 64 75 6d 6d 79 2c 20 26 69 54 6f 70  l, &dummy, &iTop
7f70: 69 63 2c 20 26 70 4b 65 79 2c 20 26 6e 4b 65 79  ic, &pKey, &nKey
7f80: 2c 20 26 62 6c 6f 62 0a 20 20 20 20 20 20 29 3b  , &blob.      );
7f90: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c  .      if( rc==L
7fa0: 53 4d 5f 4f 4b 20 26 26 20 62 6c 6f 62 2e 70 44  SM_OK && blob.pD
7fb0: 61 74 61 21 3d 70 4b 65 79 20 29 7b 0a 20 20 20  ata!=pKey ){.   
7fc0: 20 20 20 20 20 72 63 20 3d 20 73 6f 72 74 65 64       rc = sorted
7fd0: 42 6c 6f 62 53 65 74 28 70 45 6e 76 2c 20 26 62  BlobSet(pEnv, &b
7fe0: 6c 6f 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29  lob, pKey, nKey)
7ff0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8000: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
8010: 70 61 67 65 47 65 74 4b 65 79 43 6f 70 79 28 0a  pageGetKeyCopy(.
8020: 20 20 20 20 20 20 20 20 20 20 70 45 6e 76 2c 20            pEnv, 
8030: 70 53 65 67 2c 20 70 50 67 2c 20 70 4d 65 72 67  pSeg, pPg, pMerg
8040: 65 2d 3e 73 70 6c 69 74 6b 65 79 2e 69 43 65 6c  e->splitkey.iCel
8050: 6c 2c 20 26 69 54 6f 70 69 63 2c 20 26 62 6c 6f  l, &iTopic, &blo
8060: 62 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  b.      );.    }
8070: 0a 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 53  ..    pLevel->iS
8080: 70 6c 69 74 54 6f 70 69 63 20 3d 20 69 54 6f 70  plitTopic = iTop
8090: 69 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ic;.    pLevel->
80a0: 70 53 70 6c 69 74 4b 65 79 20 3d 20 62 6c 6f 62  pSplitKey = blob
80b0: 2e 70 44 61 74 61 3b 0a 20 20 20 20 70 4c 65 76  .pData;.    pLev
80c0: 65 6c 2d 3e 6e 53 70 6c 69 74 4b 65 79 20 3d 20  el->nSplitKey = 
80d0: 62 6c 6f 62 2e 6e 44 61 74 61 3b 0a 20 20 20 20  blob.nData;.    
80e0: 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65  lsmFsPageRelease
80f0: 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70  (pPg);.  }..  *p
8100: 52 63 20 3d 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  Rc = rc;.}..stat
8110: 69 63 20 76 6f 69 64 20 73 65 67 6d 65 6e 74 50  ic void segmentP
8120: 74 72 52 65 73 65 74 28 53 65 67 6d 65 6e 74 50  trReset(SegmentP
8130: 74 72 20 2a 70 50 74 72 29 7b 0a 20 20 6c 73 6d  tr *pPtr){.  lsm
8140: 46 73 50 61 67 65 52 65 6c 65 61 73 65 28 70 50  FsPageRelease(pP
8150: 74 72 2d 3e 70 50 67 29 3b 0a 20 20 70 50 74 72  tr->pPg);.  pPtr
8160: 2d 3e 70 50 67 20 3d 20 30 3b 0a 20 20 70 50 74  ->pPg = 0;.  pPt
8170: 72 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  r->nCell = 0;.  
8180: 70 50 74 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pPtr->pKey = 0;.
8190: 20 20 70 50 74 72 2d 3e 6e 4b 65 79 20 3d 20 30    pPtr->nKey = 0
81a0: 3b 0a 20 20 70 50 74 72 2d 3e 70 56 61 6c 20 3d  ;.  pPtr->pVal =
81b0: 20 30 3b 0a 20 20 70 50 74 72 2d 3e 6e 56 61 6c   0;.  pPtr->nVal
81c0: 20 3d 20 30 3b 0a 20 20 70 50 74 72 2d 3e 65 54   = 0;.  pPtr->eT
81d0: 79 70 65 20 3d 20 30 3b 0a 20 20 70 50 74 72 2d  ype = 0;.  pPtr-
81e0: 3e 69 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 73 6f  >iCell = 0;.  so
81f0: 72 74 65 64 42 6c 6f 62 46 72 65 65 28 26 70 50  rtedBlobFree(&pP
8200: 74 72 2d 3e 62 6c 6f 62 31 29 3b 0a 20 20 73 6f  tr->blob1);.  so
8210: 72 74 65 64 42 6c 6f 62 46 72 65 65 28 26 70 50  rtedBlobFree(&pP
8220: 74 72 2d 3e 62 6c 6f 62 32 29 3b 0a 7d 0a 0a 73  tr->blob2);.}..s
8230: 74 61 74 69 63 20 69 6e 74 20 73 65 67 6d 65 6e  tatic int segmen
8240: 74 50 74 72 49 67 6e 6f 72 65 53 65 70 61 72 61  tPtrIgnoreSepara
8250: 74 6f 72 73 28 4d 75 6c 74 69 43 75 72 73 6f 72  tors(MultiCursor
8260: 20 2a 70 43 73 72 2c 20 53 65 67 6d 65 6e 74 50   *pCsr, SegmentP
8270: 74 72 20 2a 70 50 74 72 29 7b 0a 20 20 72 65 74  tr *pPtr){.  ret
8280: 75 72 6e 20 28 70 43 73 72 2d 3e 66 6c 61 67 73  urn (pCsr->flags
8290: 20 26 20 43 55 52 53 4f 52 5f 52 45 41 44 5f 53   & CURSOR_READ_S
82a0: 45 50 41 52 41 54 4f 52 53 29 3d 3d 30 0a 20 20  EPARATORS)==0.  
82b0: 20 20 20 20 7c 7c 20 28 70 50 74 72 21 3d 26 70      || (pPtr!=&p
82c0: 43 73 72 2d 3e 61 50 74 72 5b 70 43 73 72 2d 3e  Csr->aPtr[pCsr->
82d0: 6e 50 74 72 2d 31 5d 29 3b 0a 7d 0a 0a 73 74 61  nPtr-1]);.}..sta
82e0: 74 69 63 20 69 6e 74 20 73 65 67 6d 65 6e 74 50  tic int segmentP
82f0: 74 72 41 64 76 61 6e 63 65 28 0a 20 20 4d 75 6c  trAdvance(.  Mul
8300: 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  tiCursor *pCsr, 
8310: 0a 20 20 53 65 67 6d 65 6e 74 50 74 72 20 2a 70  .  SegmentPtr *p
8320: 50 74 72 2c 0a 20 20 69 6e 74 20 62 52 65 76 65  Ptr,.  int bReve
8330: 72 73 65 0a 29 7b 0a 20 20 69 6e 74 20 65 44 69  rse.){.  int eDi
8340: 72 20 3d 20 28 62 52 65 76 65 72 73 65 20 3f 20  r = (bReverse ? 
8350: 2d 31 20 3a 20 31 29 3b 0a 20 20 4c 65 76 65 6c  -1 : 1);.  Level
8360: 20 2a 70 4c 76 6c 20 3d 20 70 50 74 72 2d 3e 70   *pLvl = pPtr->p
8370: 4c 65 76 65 6c 3b 0a 20 20 64 6f 20 7b 0a 20 20  Level;.  do {.  
8380: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
8390: 74 20 69 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t iCell;        
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
83b0: 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 63 65 6c  umber of new cel
83c0: 6c 20 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20  l in page */.   
83d0: 20 69 6e 74 20 73 76 46 6c 61 67 73 20 3d 20 30   int svFlags = 0
83e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
83f0: 2a 20 53 65 67 6d 65 6e 74 50 74 72 2e 65 54 79  * SegmentPtr.eTy
8400: 70 65 20 62 65 66 6f 72 65 20 61 64 76 61 6e 63  pe before advanc
8410: 65 20 2a 2f 0a 0a 20 20 20 20 69 43 65 6c 6c 20  e */..    iCell 
8420: 3d 20 70 50 74 72 2d 3e 69 43 65 6c 6c 20 2b 20  = pPtr->iCell + 
8430: 65 44 69 72 3b 0a 20 20 20 20 61 73 73 65 72 74  eDir;.    assert
8440: 28 20 70 50 74 72 2d 3e 70 50 67 20 29 3b 0a 20  ( pPtr->pPg );. 
8450: 20 20 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c     assert( iCell
8460: 3c 3d 70 50 74 72 2d 3e 6e 43 65 6c 6c 20 26 26  <=pPtr->nCell &&
8470: 20 69 43 65 6c 6c 3e 3d 2d 31 20 29 3b 0a 0a 20   iCell>=-1 );.. 
8480: 20 20 20 69 66 28 20 62 52 65 76 65 72 73 65 20     if( bReverse 
8490: 26 26 20 70 50 74 72 2d 3e 70 53 65 67 21 3d 26  && pPtr->pSeg!=&
84a0: 70 50 74 72 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68  pPtr->pLevel->lh
84b0: 73 20 29 7b 0a 20 20 20 20 20 20 73 76 46 6c 61  s ){.      svFla
84c0: 67 73 20 3d 20 70 50 74 72 2d 3e 65 54 79 70 65  gs = pPtr->eType
84d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
84e0: 73 76 46 6c 61 67 73 20 29 3b 0a 20 20 20 20 7d  svFlags );.    }
84f0: 0a 0a 20 20 20 20 69 66 28 20 69 43 65 6c 6c 3e  ..    if( iCell>
8500: 3d 70 50 74 72 2d 3e 6e 43 65 6c 6c 20 7c 7c 20  =pPtr->nCell || 
8510: 69 43 65 6c 6c 3c 30 20 29 7b 0a 20 20 20 20 20  iCell<0 ){.     
8520: 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 72 63   do {.        rc
8530: 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 4e 65 78   = segmentPtrNex
8540: 74 50 61 67 65 28 70 50 74 72 2c 20 65 44 69 72  tPage(pPtr, eDir
8550: 29 3b 20 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  ); .      }while
8560: 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 0a 20 20  ( rc==LSM_OK .  
8570: 20 20 20 20 20 20 20 20 20 26 26 20 70 50 74 72           && pPtr
8580: 2d 3e 70 50 67 20 0a 20 20 20 20 20 20 20 20 20  ->pPg .         
8590: 20 20 26 26 20 28 70 50 74 72 2d 3e 6e 43 65 6c    && (pPtr->nCel
85a0: 6c 3d 3d 30 20 7c 7c 20 28 70 50 74 72 2d 3e 66  l==0 || (pPtr->f
85b0: 6c 61 67 73 20 26 20 53 45 47 4d 45 4e 54 5f 42  lags & SEGMENT_B
85c0: 54 52 45 45 5f 46 4c 41 47 29 20 29 20 0a 20 20  TREE_FLAG) ) .  
85d0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
85e0: 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72 65   rc!=LSM_OK ) re
85f0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
8600: 43 65 6c 6c 20 3d 20 62 52 65 76 65 72 73 65 20  Cell = bReverse 
8610: 3f 20 28 70 50 74 72 2d 3e 6e 43 65 6c 6c 2d 31  ? (pPtr->nCell-1
8620: 29 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ) : 0;.    }.   
8630: 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72   rc = segmentPtr
8640: 4c 6f 61 64 43 65 6c 6c 28 70 50 74 72 2c 20 69  LoadCell(pPtr, i
8650: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
8660: 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72 65 74 75  c!=LSM_OK ) retu
8670: 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20  rn rc;..    if( 
8680: 73 76 46 6c 61 67 73 20 26 26 20 70 50 74 72 2d  svFlags && pPtr-
8690: 3e 70 50 67 20 29 7b 0a 20 20 20 20 20 20 69 6e  >pPg ){.      in
86a0: 74 20 72 65 73 20 3d 20 73 6f 72 74 65 64 4b 65  t res = sortedKe
86b0: 79 43 6f 6d 70 61 72 65 28 70 43 73 72 2d 3e 70  yCompare(pCsr->p
86c0: 44 62 2d 3e 78 43 6d 70 2c 0a 20 20 20 20 20 20  Db->xCmp,.      
86d0: 20 20 20 20 72 74 54 6f 70 69 63 28 70 50 74 72      rtTopic(pPtr
86e0: 2d 3e 65 54 79 70 65 29 2c 20 70 50 74 72 2d 3e  ->eType), pPtr->
86f0: 70 4b 65 79 2c 20 70 50 74 72 2d 3e 6e 4b 65 79  pKey, pPtr->nKey
8700: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c  ,.          pLvl
8710: 2d 3e 69 53 70 6c 69 74 54 6f 70 69 63 2c 20 70  ->iSplitTopic, p
8720: 4c 76 6c 2d 3e 70 53 70 6c 69 74 4b 65 79 2c 20  Lvl->pSplitKey, 
8730: 70 4c 76 6c 2d 3e 6e 53 70 6c 69 74 4b 65 79 0a  pLvl->nSplitKey.
8740: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
8750: 66 28 20 72 65 73 3c 30 20 29 20 73 65 67 6d 65  f( res<0 ) segme
8760: 6e 74 50 74 72 52 65 73 65 74 28 70 50 74 72 29  ntPtrReset(pPtr)
8770: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
8780: 20 70 50 74 72 2d 3e 70 50 67 3d 3d 30 20 26 26   pPtr->pPg==0 &&
8790: 20 28 73 76 46 6c 61 67 73 20 26 20 4c 53 4d 5f   (svFlags & LSM_
87a0: 45 4e 44 5f 44 45 4c 45 54 45 29 20 29 7b 0a 20  END_DELETE) ){. 
87b0: 20 20 20 20 20 53 65 67 6d 65 6e 74 20 2a 70 53       Segment *pS
87c0: 65 67 20 3d 20 70 50 74 72 2d 3e 70 53 65 67 3b  eg = pPtr->pSeg;
87d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 46  .      rc = lsmF
87e0: 73 44 62 50 61 67 65 47 65 74 28 70 43 73 72 2d  sDbPageGet(pCsr-
87f0: 3e 70 44 62 2d 3e 70 46 53 2c 20 70 53 65 67 2c  >pDb->pFS, pSeg,
8800: 20 70 53 65 67 2d 3e 69 46 69 72 73 74 2c 20 26   pSeg->iFirst, &
8810: 70 50 74 72 2d 3e 70 50 67 29 3b 0a 20 20 20 20  pPtr->pPg);.    
8820: 20 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b    if( rc!=LSM_OK
8830: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
8840: 20 20 20 20 70 50 74 72 2d 3e 65 54 79 70 65 20      pPtr->eType 
8850: 3d 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45  = LSM_START_DELE
8860: 54 45 20 7c 20 4c 53 4d 5f 50 4f 49 4e 54 5f 44  TE | LSM_POINT_D
8870: 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 70 50 74  ELETE;.      pPt
8880: 72 2d 3e 65 54 79 70 65 20 7c 3d 20 28 70 4c 76  r->eType |= (pLv
8890: 6c 2d 3e 69 53 70 6c 69 74 54 6f 70 69 63 20 3f  l->iSplitTopic ?
88a0: 20 4c 53 4d 5f 53 59 53 54 45 4d 4b 45 59 20 3a   LSM_SYSTEMKEY :
88b0: 20 30 29 3b 0a 20 20 20 20 20 20 70 50 74 72 2d   0);.      pPtr-
88c0: 3e 70 4b 65 79 20 3d 20 70 4c 76 6c 2d 3e 70 53  >pKey = pLvl->pS
88d0: 70 6c 69 74 4b 65 79 3b 0a 20 20 20 20 20 20 70  plitKey;.      p
88e0: 50 74 72 2d 3e 6e 4b 65 79 20 3d 20 70 4c 76 6c  Ptr->nKey = pLvl
88f0: 2d 3e 6e 53 70 6c 69 74 4b 65 79 3b 0a 20 20 20  ->nSplitKey;.   
8900: 20 7d 0a 0a 20 20 7d 77 68 69 6c 65 28 20 70 43   }..  }while( pC
8910: 73 72 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  sr .       && pP
8920: 74 72 2d 3e 70 50 67 20 0a 20 20 20 20 20 20 20  tr->pPg .       
8930: 26 26 20 73 65 67 6d 65 6e 74 50 74 72 49 67 6e  && segmentPtrIgn
8940: 6f 72 65 53 65 70 61 72 61 74 6f 72 73 28 70 43  oreSeparators(pC
8950: 73 72 2c 20 70 50 74 72 29 0a 20 20 20 20 20 20  sr, pPtr).      
8960: 20 26 26 20 72 74 49 73 53 65 70 61 72 61 74 6f   && rtIsSeparato
8970: 72 28 70 50 74 72 2d 3e 65 54 79 70 65 29 0a 20  r(pPtr->eType). 
8980: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 4c 53   );..  return LS
8990: 4d 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  M_OK;.}..static 
89a0: 76 6f 69 64 20 73 65 67 6d 65 6e 74 50 74 72 45  void segmentPtrE
89b0: 6e 64 50 61 67 65 28 0a 20 20 46 69 6c 65 53 79  ndPage(.  FileSy
89c0: 73 74 65 6d 20 2a 70 46 53 2c 20 0a 20 20 53 65  stem *pFS, .  Se
89d0: 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 2c 20  gmentPtr *pPtr, 
89e0: 0a 20 20 69 6e 74 20 62 4c 61 73 74 2c 20 0a 20  .  int bLast, . 
89f0: 20 69 6e 74 20 2a 70 52 63 0a 29 7b 0a 20 20 69   int *pRc.){.  i
8a00: 66 28 20 2a 70 52 63 3d 3d 4c 53 4d 5f 4f 4b 20  f( *pRc==LSM_OK 
8a10: 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 20 2a  ){.    Segment *
8a20: 70 53 65 67 20 3d 20 70 50 74 72 2d 3e 70 53 65  pSeg = pPtr->pSe
8a30: 67 3b 0a 20 20 20 20 50 61 67 65 20 2a 70 4e 65  g;.    Page *pNe
8a40: 77 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 62  w = 0;.    if( b
8a50: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  Last ){.      *p
8a60: 52 63 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65  Rc = lsmFsDbPage
8a70: 4c 61 73 74 28 70 46 53 2c 20 70 53 65 67 2c 20  Last(pFS, pSeg, 
8a80: 26 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73  &pNew);.    }els
8a90: 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  e{.      *pRc = 
8aa0: 6c 73 6d 46 73 44 62 50 61 67 65 47 65 74 28 70  lsmFsDbPageGet(p
8ab0: 46 53 2c 20 70 53 65 67 2c 20 70 53 65 67 2d 3e  FS, pSeg, pSeg->
8ac0: 69 46 69 72 73 74 2c 20 26 70 4e 65 77 29 3b 0a  iFirst, &pNew);.
8ad0: 20 20 20 20 7d 0a 20 20 20 20 73 65 67 6d 65 6e      }.    segmen
8ae0: 74 50 74 72 53 65 74 50 61 67 65 28 70 50 74 72  tPtrSetPage(pPtr
8af0: 2c 20 70 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 0a  , pNew);.  }.}..
8b00: 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 6f  ./*.** Try to mo
8b10: 76 65 20 74 68 65 20 73 65 67 6d 65 6e 74 20 70  ve the segment p
8b20: 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20 61 73  ointer passed as
8b30: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
8b40: 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 69 74 0a  ment so that it.
8b50: 2a 2a 20 70 6f 69 6e 74 73 20 61 74 20 65 69 74  ** points at eit
8b60: 68 65 72 20 74 68 65 20 66 69 72 73 74 20 28 62  her the first (b
8b70: 4c 61 73 74 3d 3d 30 29 20 6f 72 20 6c 61 73 74  Last==0) or last
8b80: 20 28 62 4c 61 73 74 3d 3d 31 29 20 63 65 6c 6c   (bLast==1) cell
8b90: 20 69 6e 20 74 68 65 20 76 61 6c 69 64 0a 2a 2a   in the valid.**
8ba0: 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 73   region of the s
8bb0: 65 67 6d 65 6e 74 20 64 65 66 69 6e 65 64 20 62  egment defined b
8bc0: 79 20 70 50 74 72 2d 3e 69 46 69 72 73 74 20 61  y pPtr->iFirst a
8bd0: 6e 64 20 70 50 74 72 2d 3e 69 4c 61 73 74 2e 0a  nd pPtr->iLast..
8be0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4c 53 4d  **.** Return LSM
8bf0: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
8c00: 6c 20 6f 72 20 61 6e 20 6c 73 6d 20 65 72 72 6f  l or an lsm erro
8c10: 72 20 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68  r code if someth
8c20: 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
8c30: 67 20 28 49 4f 20 65 72 72 6f 72 2c 20 4f 4f 4d  g (IO error, OOM
8c40: 20 65 74 63 2e 29 2e 0a 2a 2f 0a 73 74 61 74 69   etc.)..*/.stati
8c50: 63 20 69 6e 74 20 73 65 67 6d 65 6e 74 50 74 72  c int segmentPtr
8c60: 45 6e 64 28 4d 75 6c 74 69 43 75 72 73 6f 72 20  End(MultiCursor 
8c70: 2a 70 43 73 72 2c 20 53 65 67 6d 65 6e 74 50 74  *pCsr, SegmentPt
8c80: 72 20 2a 70 50 74 72 2c 20 69 6e 74 20 62 4c 61  r *pPtr, int bLa
8c90: 73 74 29 7b 0a 20 20 4c 65 76 65 6c 20 2a 70 4c  st){.  Level *pL
8ca0: 76 6c 20 3d 20 70 50 74 72 2d 3e 70 4c 65 76 65  vl = pPtr->pLeve
8cb0: 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  l;.  int rc = LS
8cc0: 4d 5f 4f 4b 3b 0a 20 20 46 69 6c 65 53 79 73 74  M_OK;.  FileSyst
8cd0: 65 6d 20 2a 70 46 53 20 3d 20 70 43 73 72 2d 3e  em *pFS = pCsr->
8ce0: 70 44 62 2d 3e 70 46 53 3b 0a 20 20 69 6e 74 20  pDb->pFS;.  int 
8cf0: 62 49 67 6e 6f 72 65 3b 0a 0a 20 20 73 65 67 6d  bIgnore;..  segm
8d00: 65 6e 74 50 74 72 45 6e 64 50 61 67 65 28 70 46  entPtrEndPage(pF
8d10: 53 2c 20 70 50 74 72 2c 20 62 4c 61 73 74 2c 20  S, pPtr, bLast, 
8d20: 26 72 63 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  &rc);.  while( r
8d30: 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 50 74  c==LSM_OK && pPt
8d40: 72 2d 3e 70 50 67 20 0a 20 20 20 20 20 20 26 26  r->pPg .      &&
8d50: 20 28 70 50 74 72 2d 3e 6e 43 65 6c 6c 3d 3d 30   (pPtr->nCell==0
8d60: 20 7c 7c 20 28 70 50 74 72 2d 3e 66 6c 61 67 73   || (pPtr->flags
8d70: 20 26 20 53 45 47 4d 45 4e 54 5f 42 54 52 45 45   & SEGMENT_BTREE
8d80: 5f 46 4c 41 47 29 29 0a 20 20 29 7b 0a 20 20 20  _FLAG)).  ){.   
8d90: 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72   rc = segmentPtr
8da0: 4e 65 78 74 50 61 67 65 28 70 50 74 72 2c 20 28  NextPage(pPtr, (
8db0: 62 4c 61 73 74 20 3f 20 2d 31 20 3a 20 31 29 29  bLast ? -1 : 1))
8dc0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
8dd0: 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 50 74 72 2d  =LSM_OK && pPtr-
8de0: 3e 70 50 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  >pPg ){.    rc =
8df0: 20 73 65 67 6d 65 6e 74 50 74 72 4c 6f 61 64 43   segmentPtrLoadC
8e00: 65 6c 6c 28 70 50 74 72 2c 20 62 4c 61 73 74 20  ell(pPtr, bLast 
8e10: 3f 20 28 70 50 74 72 2d 3e 6e 43 65 6c 6c 2d 31  ? (pPtr->nCell-1
8e20: 29 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ) : 0);.    if( 
8e30: 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 62 4c  rc==LSM_OK && bL
8e40: 61 73 74 20 26 26 20 70 50 74 72 2d 3e 70 53 65  ast && pPtr->pSe
8e50: 67 21 3d 26 70 4c 76 6c 2d 3e 6c 68 73 20 29 7b  g!=&pLvl->lhs ){
8e60: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d  .      int res =
8e70: 20 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72   sortedKeyCompar
8e80: 65 28 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d  e(pCsr->pDb->xCm
8e90: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 72 74 54  p,.          rtT
8ea0: 6f 70 69 63 28 70 50 74 72 2d 3e 65 54 79 70 65  opic(pPtr->eType
8eb0: 29 2c 20 70 50 74 72 2d 3e 70 4b 65 79 2c 20 70  ), pPtr->pKey, p
8ec0: 50 74 72 2d 3e 6e 4b 65 79 2c 0a 20 20 20 20 20  Ptr->nKey,.     
8ed0: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 53 70 6c 69       pLvl->iSpli
8ee0: 74 54 6f 70 69 63 2c 20 70 4c 76 6c 2d 3e 70 53  tTopic, pLvl->pS
8ef0: 70 6c 69 74 4b 65 79 2c 20 70 4c 76 6c 2d 3e 6e  plitKey, pLvl->n
8f00: 53 70 6c 69 74 4b 65 79 0a 20 20 20 20 20 20 29  SplitKey.      )
8f10: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c  ;.      if( res<
8f20: 30 20 29 20 73 65 67 6d 65 6e 74 50 74 72 52 65  0 ) segmentPtrRe
8f30: 73 65 74 28 70 50 74 72 29 3b 0a 20 20 20 20 7d  set(pPtr);.    }
8f40: 0a 20 20 7d 0a 20 20 0a 20 20 62 49 67 6e 6f 72  .  }.  .  bIgnor
8f50: 65 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 49 67  e = segmentPtrIg
8f60: 6e 6f 72 65 53 65 70 61 72 61 74 6f 72 73 28 70  noreSeparators(p
8f70: 43 73 72 2c 20 70 50 74 72 29 3b 0a 20 20 69 66  Csr, pPtr);.  if
8f80: 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20  ( rc==LSM_OK && 
8f90: 70 50 74 72 2d 3e 70 50 67 20 26 26 20 62 49 67  pPtr->pPg && bIg
8fa0: 6e 6f 72 65 20 26 26 20 72 74 49 73 53 65 70 61  nore && rtIsSepa
8fb0: 72 61 74 6f 72 28 70 50 74 72 2d 3e 65 54 79 70  rator(pPtr->eTyp
8fc0: 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  e) ){.    rc = s
8fd0: 65 67 6d 65 6e 74 50 74 72 41 64 76 61 6e 63 65  egmentPtrAdvance
8fe0: 28 70 43 73 72 2c 20 70 50 74 72 2c 20 62 4c 61  (pCsr, pPtr, bLa
8ff0: 73 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 30 0a  st);.  }..#if 0.
9000: 20 20 69 66 28 20 62 4c 61 73 74 20 26 26 20 72    if( bLast && r
9010: 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 50 74  c==LSM_OK && pPt
9020: 72 2d 3e 70 50 67 0a 20 20 20 26 26 20 70 50 74  r->pPg.   && pPt
9030: 72 2d 3e 70 53 65 67 3d 3d 26 70 4c 76 6c 2d 3e  r->pSeg==&pLvl->
9040: 6c 68 73 20 0a 20 20 20 26 26 20 70 4c 76 6c 2d  lhs .   && pLvl-
9050: 3e 6e 52 69 67 68 74 20 26 26 20 28 70 50 74 72  >nRight && (pPtr
9060: 2d 3e 65 54 79 70 65 20 26 20 4c 53 4d 5f 53 54  ->eType & LSM_ST
9070: 41 52 54 5f 44 45 4c 45 54 45 29 0a 20 20 29 7b  ART_DELETE).  ){
9080: 0a 20 20 20 20 70 50 74 72 2d 3e 69 43 65 6c 6c  .    pPtr->iCell
9090: 2b 2b 3b 0a 20 20 20 20 70 50 74 72 2d 3e 65 54  ++;.    pPtr->eT
90a0: 79 70 65 20 3d 20 4c 53 4d 5f 45 4e 44 5f 44 45  ype = LSM_END_DE
90b0: 4c 45 54 45 20 7c 20 28 70 4c 76 6c 2d 3e 69 53  LETE | (pLvl->iS
90c0: 70 6c 69 74 54 6f 70 69 63 29 3b 0a 20 20 20 20  plitTopic);.    
90d0: 70 50 74 72 2d 3e 70 4b 65 79 20 3d 20 70 4c 76  pPtr->pKey = pLv
90e0: 6c 2d 3e 70 53 70 6c 69 74 4b 65 79 3b 0a 20 20  l->pSplitKey;.  
90f0: 20 20 70 50 74 72 2d 3e 6e 4b 65 79 20 3d 20 70    pPtr->nKey = p
9100: 4c 76 6c 2d 3e 6e 53 70 6c 69 74 4b 65 79 3b 0a  Lvl->nSplitKey;.
9110: 20 20 20 20 70 50 74 72 2d 3e 70 56 61 6c 20 3d      pPtr->pVal =
9120: 20 30 3b 0a 20 20 20 20 70 50 74 72 2d 3e 6e 56   0;.    pPtr->nV
9130: 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  al = 0;.  }.#end
9140: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
9150: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
9160: 73 65 67 6d 65 6e 74 50 74 72 4b 65 79 28 53 65  segmentPtrKey(Se
9170: 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 2c 20  gmentPtr *pPtr, 
9180: 76 6f 69 64 20 2a 2a 70 70 4b 65 79 2c 20 69 6e  void **ppKey, in
9190: 74 20 2a 70 6e 4b 65 79 29 7b 0a 20 20 61 73 73  t *pnKey){.  ass
91a0: 65 72 74 28 20 70 50 74 72 2d 3e 70 50 67 20 29  ert( pPtr->pPg )
91b0: 3b 0a 20 20 2a 70 70 4b 65 79 20 3d 20 70 50 74  ;.  *ppKey = pPt
91c0: 72 2d 3e 70 4b 65 79 3b 0a 20 20 2a 70 6e 4b 65  r->pKey;.  *pnKe
91d0: 79 20 3d 20 70 50 74 72 2d 3e 6e 4b 65 79 3b 0a  y = pPtr->nKey;.
91e0: 7d 0a 0a 23 69 66 20 30 20 2f 2a 20 4e 4f 54 20  }..#if 0 /* NOT 
91f0: 55 53 45 44 20 2a 2f 0a 73 74 61 74 69 63 20 63  USED */.static c
9200: 68 61 72 20 2a 6b 65 79 54 6f 53 74 72 69 6e 67  har *keyToString
9210: 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20  (lsm_env *pEnv, 
9220: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20  void *pKey, int 
9230: 6e 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nKey){.  int i;.
9240: 20 20 75 38 20 2a 61 4b 65 79 20 3d 20 28 75 38    u8 *aKey = (u8
9250: 20 2a 29 70 4b 65 79 3b 0a 20 20 63 68 61 72 20   *)pKey;.  char 
9260: 2a 7a 52 65 74 20 3d 20 28 63 68 61 72 20 2a 29  *zRet = (char *)
9270: 6c 73 6d 4d 61 6c 6c 6f 63 28 70 45 6e 76 2c 20  lsmMalloc(pEnv, 
9280: 6e 4b 65 79 2b 31 29 3b 0a 0a 20 20 66 6f 72 28  nKey+1);..  for(
9290: 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b  i=0; i<nKey; i++
92a0: 29 7b 0a 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d  ){.    zRet[i] =
92b0: 20 28 63 68 61 72 29 28 69 73 61 6c 6e 75 6d 28   (char)(isalnum(
92c0: 61 4b 65 79 5b 69 5d 29 20 3f 20 61 4b 65 79 5b  aKey[i]) ? aKey[
92d0: 69 5d 20 3a 20 27 2e 27 29 3b 0a 20 20 7d 0a 20  i] : '.');.  }. 
92e0: 20 7a 52 65 74 5b 6e 4b 65 79 5d 20 3d 20 27 5c   zRet[nKey] = '\
92f0: 30 27 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  0';.  return zRe
9300: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  t;.}.#endif..#if
9310: 20 30 20 2f 2a 20 4e 4f 54 20 55 53 45 44 20 2a   0 /* NOT USED *
9320: 2f 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68  /./*.** Check th
9330: 61 74 20 74 68 65 20 70 61 67 65 20 74 68 61 74  at the page that
9340: 20 70 50 74 72 20 63 75 72 72 65 6e 74 6c 79 20   pPtr currently 
9350: 68 61 73 20 6c 6f 61 64 65 64 20 69 73 20 74 68  has loaded is th
9360: 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 0a 2a  e correct page.*
9370: 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  * to search for 
9380: 6b 65 79 20 28 70 4b 65 79 2f 6e 4b 65 79 29 2e  key (pKey/nKey).
9390: 20 49 66 20 69 74 20 69 73 2c 20 72 65 74 75 72   If it is, retur
93a0: 6e 20 31 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  n 1. Otherwise, 
93b0: 61 6e 20 61 73 73 65 72 74 0a 2a 2a 20 66 61 69  an assert.** fai
93c0: 6c 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ls and this func
93d0: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
93e0: 74 75 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  turn..*/.static 
93f0: 69 6e 74 20 61 73 73 65 72 74 4b 65 79 4c 6f 63  int assertKeyLoc
9400: 61 74 69 6f 6e 28 0a 20 20 4d 75 6c 74 69 43 75  ation(.  MultiCu
9410: 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20 53  rsor *pCsr, .  S
9420: 65 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 2c  egmentPtr *pPtr,
9430: 20 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20   .  void *pKey, 
9440: 69 6e 74 20 6e 4b 65 79 0a 29 7b 0a 20 20 6c 73  int nKey.){.  ls
9450: 6d 5f 65 6e 76 20 2a 70 45 6e 76 20 3d 20 6c 73  m_env *pEnv = ls
9460: 6d 46 73 45 6e 76 28 70 43 73 72 2d 3e 70 44 62  mFsEnv(pCsr->pDb
9470: 2d 3e 70 46 53 29 3b 0a 20 20 42 6c 6f 62 20 62  ->pFS);.  Blob b
9480: 6c 6f 62 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  lob = {0, 0, 0};
9490: 0a 20 20 69 6e 74 20 65 44 69 72 3b 0a 20 20 69  .  int eDir;.  i
94a0: 6e 74 20 69 54 6f 70 69 63 20 3d 20 30 3b 20 20  nt iTopic = 0;  
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
94c0: 2a 20 54 4f 44 4f 3a 20 46 69 78 20 6d 65 20 2a  * TODO: Fix me *
94d0: 2f 0a 0a 20 20 66 6f 72 28 65 44 69 72 3d 2d 31  /..  for(eDir=-1
94e0: 3b 20 65 44 69 72 3c 3d 31 3b 20 65 44 69 72 2b  ; eDir<=1; eDir+
94f0: 3d 32 29 7b 0a 20 20 20 20 50 61 67 65 20 2a 70  =2){.    Page *p
9500: 54 65 73 74 20 3d 20 70 50 74 72 2d 3e 70 50 67  Test = pPtr->pPg
9510: 3b 0a 0a 20 20 20 20 6c 73 6d 46 73 50 61 67 65  ;..    lsmFsPage
9520: 52 65 66 28 70 54 65 73 74 29 3b 0a 20 20 20 20  Ref(pTest);.    
9530: 77 68 69 6c 65 28 20 70 54 65 73 74 20 29 7b 0a  while( pTest ){.
9540: 20 20 20 20 20 20 53 65 67 6d 65 6e 74 20 2a 70        Segment *p
9550: 53 65 67 20 3d 20 70 50 74 72 2d 3e 70 53 65 67  Seg = pPtr->pSeg
9560: 3b 0a 20 20 20 20 20 20 50 61 67 65 20 2a 70 4e  ;.      Page *pN
9570: 65 78 74 3b 0a 0a 20 20 20 20 20 20 69 6e 74 20  ext;..      int 
9580: 72 63 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65  rc = lsmFsDbPage
9590: 4e 65 78 74 28 70 53 65 67 2c 20 70 54 65 73 74  Next(pSeg, pTest
95a0: 2c 20 65 44 69 72 2c 20 26 70 4e 65 78 74 29 3b  , eDir, &pNext);
95b0: 0a 20 20 20 20 20 20 6c 73 6d 46 73 50 61 67 65  .      lsmFsPage
95c0: 52 65 6c 65 61 73 65 28 70 54 65 73 74 29 3b 0a  Release(pTest);.
95d0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
95e0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70  eturn 1;.      p
95f0: 54 65 73 74 20 3d 20 70 4e 65 78 74 3b 0a 0a 20  Test = pNext;.. 
9600: 20 20 20 20 20 69 66 28 20 70 54 65 73 74 20 29       if( pTest )
9610: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44  {.        int nD
9620: 61 74 61 3b 0a 20 20 20 20 20 20 20 20 75 38 20  ata;.        u8 
9630: 2a 61 44 61 74 61 20 3d 20 66 73 50 61 67 65 44  *aData = fsPageD
9640: 61 74 61 28 70 54 65 73 74 2c 20 26 6e 44 61 74  ata(pTest, &nDat
9650: 61 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  a);.        int 
9660: 6e 43 65 6c 6c 20 3d 20 70 61 67 65 47 65 74 4e  nCell = pageGetN
9670: 52 65 63 28 61 44 61 74 61 2c 20 6e 44 61 74 61  Rec(aData, nData
9680: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  );.        int f
9690: 6c 61 67 73 20 3d 20 70 61 67 65 47 65 74 46 6c  lags = pageGetFl
96a0: 61 67 73 28 61 44 61 74 61 2c 20 6e 44 61 74 61  ags(aData, nData
96b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
96c0: 43 65 6c 6c 20 26 26 20 30 3d 3d 28 66 6c 61 67  Cell && 0==(flag
96d0: 73 26 53 45 47 4d 45 4e 54 5f 42 54 52 45 45 5f  s&SEGMENT_BTREE_
96e0: 46 4c 41 47 29 20 29 7b 0a 20 20 20 20 20 20 20  FLAG) ){.       
96f0: 20 20 20 69 6e 74 20 6e 50 67 4b 65 79 3b 0a 20     int nPgKey;. 
9700: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 67           int iPg
9710: 54 6f 70 69 63 3b 0a 20 20 20 20 20 20 20 20 20  Topic;.         
9720: 20 75 38 20 2a 70 50 67 4b 65 79 3b 0a 20 20 20   u8 *pPgKey;.   
9730: 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a         int res;.
9740: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 43            int iC
9750: 65 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ell;..          
9760: 69 43 65 6c 6c 20 3d 20 28 28 65 44 69 72 20 3c  iCell = ((eDir <
9770: 20 30 29 20 3f 20 28 6e 43 65 6c 6c 2d 31 29 20   0) ? (nCell-1) 
9780: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  : 0);.          
9790: 70 50 67 4b 65 79 20 3d 20 70 61 67 65 47 65 74  pPgKey = pageGet
97a0: 4b 65 79 28 70 53 65 67 2c 20 70 54 65 73 74 2c  Key(pSeg, pTest,
97b0: 20 69 43 65 6c 6c 2c 20 26 69 50 67 54 6f 70 69   iCell, &iPgTopi
97c0: 63 2c 20 26 6e 50 67 4b 65 79 2c 20 26 62 6c 6f  c, &nPgKey, &blo
97d0: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  b);.          re
97e0: 73 20 3d 20 69 54 6f 70 69 63 20 2d 20 69 50 67  s = iTopic - iPg
97f0: 54 6f 70 69 63 3b 0a 20 20 20 20 20 20 20 20 20  Topic;.         
9800: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65   if( res==0 ) re
9810: 73 20 3d 20 70 43 73 72 2d 3e 70 44 62 2d 3e 78  s = pCsr->pDb->x
9820: 43 6d 70 28 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  Cmp(pKey, nKey, 
9830: 70 50 67 4b 65 79 2c 20 6e 50 67 4b 65 79 29 3b  pPgKey, nPgKey);
9840: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
9850: 65 44 69 72 3d 3d 31 20 26 26 20 72 65 73 3e 30  eDir==1 && res>0
9860: 29 20 7c 7c 20 28 65 44 69 72 3d 3d 2d 31 20 26  ) || (eDir==-1 &
9870: 26 20 72 65 73 3c 30 29 20 29 7b 0a 20 20 20 20  & res<0) ){.    
9880: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 6b 69 6e          /* Takin
9890: 67 20 74 68 69 73 20 62 72 61 6e 63 68 20 6d 65  g this branch me
98a0: 61 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 68 61  ans something ha
98b0: 73 20 67 6f 6e 65 20 77 72 6f 6e 67 2e 20 2a 2f  s gone wrong. */
98c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
98d0: 72 20 2a 7a 4d 73 67 20 3d 20 6c 73 6d 4d 61 6c  r *zMsg = lsmMal
98e0: 6c 6f 63 50 72 69 6e 74 66 28 70 45 6e 76 2c 20  locPrintf(pEnv, 
98f0: 22 4b 65 79 20 5c 22 25 73 5c 22 20 69 73 20 6e  "Key \"%s\" is n
9900: 6f 74 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20  ot on page %d", 
9910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9920: 20 6b 65 79 54 6f 53 74 72 69 6e 67 28 70 45 6e   keyToString(pEn
9930: 76 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 2c 20  v, pKey, nKey), 
9940: 6c 73 6d 46 73 50 61 67 65 4e 75 6d 62 65 72 28  lsmFsPageNumber(
9950: 70 50 74 72 2d 3e 70 50 67 29 0a 20 20 20 20 20  pPtr->pPg).     
9960: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
9970: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
9980: 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 7a 4d  derr, "%s\n", zM
9990: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
99a0: 20 61 73 73 65 72 74 28 20 21 22 61 73 73 65 72   assert( !"asser
99b0: 74 4b 65 79 4c 6f 63 61 74 69 6f 6e 28 29 20 66  tKeyLocation() f
99c0: 61 69 6c 65 64 22 20 29 3b 0a 20 20 20 20 20 20  ailed" );.      
99d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
99e0: 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65  lsmFsPageRelease
99f0: 28 70 54 65 73 74 29 3b 0a 20 20 20 20 20 20 20  (pTest);.       
9a00: 20 20 20 70 54 65 73 74 20 3d 20 30 3b 0a 20 20     pTest = 0;.  
9a10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9a20: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 6f 72      }.  }..  sor
9a30: 74 65 64 42 6c 6f 62 46 72 65 65 28 26 62 6c 6f  tedBlobFree(&blo
9a40: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  b);.  return 1;.
9a50: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
9a60: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
9a70: 69 6e 74 20 61 73 73 65 72 74 53 65 65 6b 52 65  int assertSeekRe
9a80: 73 75 6c 74 28 0a 20 20 4d 75 6c 74 69 43 75 72  sult(.  MultiCur
9a90: 73 6f 72 20 2a 70 43 73 72 2c 0a 20 20 53 65 67  sor *pCsr,.  Seg
9aa0: 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 2c 0a 20  mentPtr *pPtr,. 
9ab0: 20 69 6e 74 20 69 54 6f 70 69 63 2c 0a 20 20 76   int iTopic,.  v
9ac0: 6f 69 64 20 2a 70 4b 65 79 2c 0a 20 20 69 6e 74  oid *pKey,.  int
9ad0: 20 6e 4b 65 79 2c 0a 20 20 69 6e 74 20 65 53 65   nKey,.  int eSe
9ae0: 65 6b 0a 29 7b 0a 20 20 69 66 28 20 70 50 74 72  ek.){.  if( pPtr
9af0: 2d 3e 70 50 67 20 29 7b 0a 20 20 20 20 69 6e 74  ->pPg ){.    int
9b00: 20 72 65 73 3b 0a 20 20 20 20 72 65 73 20 3d 20   res;.    res = 
9b10: 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65  sortedKeyCompare
9b20: 28 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70  (pCsr->pDb->xCmp
9b30: 2c 20 69 54 6f 70 69 63 2c 20 70 4b 65 79 2c 20  , iTopic, pKey, 
9b40: 6e 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 72 74  nKey,.        rt
9b50: 54 6f 70 69 63 28 70 50 74 72 2d 3e 65 54 79 70  Topic(pPtr->eTyp
9b60: 65 29 2c 20 70 50 74 72 2d 3e 70 4b 65 79 2c 20  e), pPtr->pKey, 
9b70: 70 50 74 72 2d 3e 6e 4b 65 79 0a 20 20 20 20 29  pPtr->nKey.    )
9b80: 3b 0a 0a 20 20 20 20 69 66 28 20 65 53 65 65 6b  ;..    if( eSeek
9b90: 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 45 51 20 29 20  ==LSM_SEEK_EQ ) 
9ba0: 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 29 3b  return (res==0);
9bb0: 0a 20 20 20 20 69 66 28 20 65 53 65 65 6b 3d 3d  .    if( eSeek==
9bc0: 4c 53 4d 5f 53 45 45 4b 5f 4c 45 20 29 20 72 65  LSM_SEEK_LE ) re
9bd0: 74 75 72 6e 20 28 72 65 73 3e 3d 30 29 3b 0a 20  turn (res>=0);. 
9be0: 20 20 20 69 66 28 20 65 53 65 65 6b 3d 3d 4c 53     if( eSeek==LS
9bf0: 4d 5f 53 45 45 4b 5f 47 45 20 29 20 72 65 74 75  M_SEEK_GE ) retu
9c00: 72 6e 20 28 72 65 73 3c 3d 30 29 3b 0a 20 20 7d  rn (res<=0);.  }
9c10: 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
9c20: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
9c30: 6e 74 20 73 65 67 6d 65 6e 74 50 74 72 53 65 61  nt segmentPtrSea
9c40: 72 63 68 4f 76 65 72 73 69 7a 65 64 28 0a 20 20  rchOversized(.  
9c50: 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73  MultiCursor *pCs
9c60: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
9c70: 2f 2a 20 43 75 72 73 6f 72 20 63 6f 6e 74 65 78  /* Cursor contex
9c80: 74 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 50 74  t */.  SegmentPt
9c90: 72 20 2a 70 50 74 72 2c 20 20 20 20 20 20 20 20  r *pPtr,        
9ca0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9cb0: 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 69  r to seek */.  i
9cc0: 6e 74 20 69 54 6f 70 69 63 2c 20 20 20 20 20 20  nt iTopic,      
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ce0: 2a 20 54 6f 70 69 63 20 6f 66 20 6b 65 79 20 74  * Topic of key t
9cf0: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a  o search for */.
9d00: 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e    void *pKey, in
9d10: 74 20 6e 4b 65 79 20 20 20 20 20 20 20 20 20 20  t nKey          
9d20: 20 20 2f 2a 20 4b 65 79 20 74 6f 20 73 65 65 6b    /* Key to seek
9d30: 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   to */.){.  int 
9d40: 28 2a 78 43 6d 70 29 28 76 6f 69 64 20 2a 2c 20  (*xCmp)(void *, 
9d50: 69 6e 74 2c 20 76 6f 69 64 20 2a 2c 20 69 6e 74  int, void *, int
9d60: 29 20 3d 20 70 43 73 72 2d 3e 70 44 62 2d 3e 78  ) = pCsr->pDb->x
9d70: 43 6d 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Cmp;.  int rc = 
9d80: 4c 53 4d 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  LSM_OK;..  /* If
9d90: 20 74 68 65 20 4f 56 45 52 53 49 5a 45 44 20 66   the OVERSIZED f
9da0: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
9db0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
9dc0: 6e 74 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a  nter in the.  **
9dd0: 20 75 70 70 65 72 20 6c 65 76 65 6c 20 74 6f 20   upper level to 
9de0: 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
9df0: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 74 68 61   the segment tha
9e00: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
9e10: 61 73 74 0a 20 20 2a 2a 20 6f 6e 65 20 6b 65 79  ast.  ** one key
9e20: 2e 20 53 6f 20 63 6f 6d 70 61 72 65 20 74 68 65  . So compare the
9e30: 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
9e40: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
9e50: 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 6b   with the.  ** k
9e60: 65 79 20 62 65 69 6e 67 20 73 6f 75 67 68 74 20  ey being sought 
9e70: 28 70 4b 65 79 2f 6e 4b 65 79 29 2e 20 49 66 20  (pKey/nKey). If 
9e80: 28 70 4b 65 79 2f 6e 4b 65 79 29 20 69 73 20 6c  (pKey/nKey) is l
9e90: 61 72 67 65 72 2c 20 61 64 76 61 6e 63 65 0a 20  arger, advance. 
9ea0: 20 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20   ** to the next 
9eb0: 70 61 67 65 20 69 6e 20 74 68 65 20 73 65 67 6d  page in the segm
9ec0: 65 6e 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ent that contain
9ed0: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6b  s at least one k
9ee0: 65 79 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ey. .  */.  whil
9ef0: 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  e( rc==LSM_OK &&
9f00: 20 28 70 50 74 72 2d 3e 66 6c 61 67 73 20 26 20   (pPtr->flags & 
9f10: 50 47 46 54 52 5f 53 4b 49 50 5f 4e 45 58 54 5f  PGFTR_SKIP_NEXT_
9f20: 46 4c 41 47 29 20 29 7b 0a 20 20 20 20 75 38 20  FLAG) ){.    u8 
9f30: 2a 70 4c 61 73 74 4b 65 79 3b 0a 20 20 20 20 69  *pLastKey;.    i
9f40: 6e 74 20 6e 4c 61 73 74 4b 65 79 3b 0a 20 20 20  nt nLastKey;.   
9f50: 20 69 6e 74 20 69 4c 61 73 74 54 6f 70 69 63 3b   int iLastTopic;
9f60: 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20  .    int res;   
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
9f90: 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20  comparison */.  
9fa0: 20 20 50 61 67 65 20 2a 70 4e 65 78 74 3b 0a 0a    Page *pNext;..
9fb0: 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
9fc0: 6c 61 73 74 20 6b 65 79 20 6f 6e 20 74 68 65 20  last key on the 
9fd0: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f  current page. */
9fe0: 0a 20 20 20 20 70 4c 61 73 74 4b 65 79 20 3d 20  .    pLastKey = 
9ff0: 70 61 67 65 47 65 74 4b 65 79 28 70 50 74 72 2d  pageGetKey(pPtr-
a000: 3e 70 53 65 67 2c 0a 20 20 20 20 20 20 20 20 70  >pSeg,.        p
a010: 50 74 72 2d 3e 70 50 67 2c 20 70 50 74 72 2d 3e  Ptr->pPg, pPtr->
a020: 6e 43 65 6c 6c 2d 31 2c 20 26 69 4c 61 73 74 54  nCell-1, &iLastT
a030: 6f 70 69 63 2c 20 26 6e 4c 61 73 74 4b 65 79 2c  opic, &nLastKey,
a040: 20 26 70 50 74 72 2d 3e 62 6c 6f 62 31 0a 20 20   &pPtr->blob1.  
a050: 20 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20    );..    /* If 
a060: 74 68 65 20 6c 6f 61 64 65 64 20 6b 65 79 20 69  the loaded key i
a070: 73 20 3e 3d 20 74 68 61 6e 20 28 70 4b 65 79 2f  s >= than (pKey/
a080: 6e 4b 65 79 29 2c 20 62 72 65 61 6b 20 6f 75 74  nKey), break out
a090: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
a0a0: 20 20 2a 2a 20 49 66 20 28 70 4b 65 79 2f 6e 4b    ** If (pKey/nK
a0b0: 65 79 29 20 69 73 20 70 72 65 73 65 6e 74 20 69  ey) is present i
a0c0: 6e 20 74 68 69 73 20 61 72 72 61 79 2c 20 69 74  n this array, it
a0d0: 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20   must be on the 
a0e0: 63 75 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20  current .    ** 
a0f0: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 72 65  page.  */.    re
a100: 73 20 3d 20 73 6f 72 74 65 64 4b 65 79 43 6f 6d  s = sortedKeyCom
a110: 70 61 72 65 28 0a 20 20 20 20 20 20 20 20 78 43  pare(.        xC
a120: 6d 70 2c 20 69 4c 61 73 74 54 6f 70 69 63 2c 20  mp, iLastTopic, 
a130: 70 4c 61 73 74 4b 65 79 2c 20 6e 4c 61 73 74 4b  pLastKey, nLastK
a140: 65 79 2c 20 69 54 6f 70 69 63 2c 20 70 4b 65 79  ey, iTopic, pKey
a150: 2c 20 6e 4b 65 79 0a 20 20 20 20 29 3b 0a 20 20  , nKey.    );.  
a160: 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 62    if( res>=0 ) b
a170: 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  reak;..    /* Ad
a180: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
a190: 74 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  t page that cont
a1a0: 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
a1b0: 65 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 70 4e  e key. */.    pN
a1c0: 65 78 74 20 3d 20 70 50 74 72 2d 3e 70 50 67 3b  ext = pPtr->pPg;
a1d0: 0a 20 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65  .    lsmFsPageRe
a1e0: 66 28 70 4e 65 78 74 29 3b 0a 20 20 20 20 77 68  f(pNext);.    wh
a1f0: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20  ile( 1 ){.      
a200: 50 61 67 65 20 2a 70 4c 6f 61 64 3b 0a 20 20 20  Page *pLoad;.   
a210: 20 20 20 75 38 20 2a 61 44 61 74 61 3b 20 69 6e     u8 *aData; in
a220: 74 20 6e 44 61 74 61 3b 0a 0a 20 20 20 20 20 20  t nData;..      
a230: 72 63 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65  rc = lsmFsDbPage
a240: 4e 65 78 74 28 70 50 74 72 2d 3e 70 53 65 67 2c  Next(pPtr->pSeg,
a250: 20 70 4e 65 78 74 2c 20 31 2c 20 26 70 4c 6f 61   pNext, 1, &pLoa
a260: 64 29 3b 0a 20 20 20 20 20 20 6c 73 6d 46 73 50  d);.      lsmFsP
a270: 61 67 65 52 65 6c 65 61 73 65 28 70 4e 65 78 74  ageRelease(pNext
a280: 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  );.      pNext =
a290: 20 70 4c 6f 61 64 3b 0a 20 20 20 20 20 20 69 66   pLoad;.      if
a2a0: 28 20 70 4e 65 78 74 3d 3d 30 20 29 20 62 72 65  ( pNext==0 ) bre
a2b0: 61 6b 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  ak;..      asser
a2c0: 74 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 3b  t( rc==LSM_OK );
a2d0: 0a 20 20 20 20 20 20 61 44 61 74 61 20 3d 20 6c  .      aData = l
a2e0: 73 6d 46 73 50 61 67 65 44 61 74 61 28 70 4e 65  smFsPageData(pNe
a2f0: 78 74 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20  xt, &nData);.   
a300: 20 20 20 69 66 28 20 28 70 61 67 65 47 65 74 46     if( (pageGetF
a310: 6c 61 67 73 28 61 44 61 74 61 2c 20 6e 44 61 74  lags(aData, nDat
a320: 61 29 20 26 20 53 45 47 4d 45 4e 54 5f 42 54 52  a) & SEGMENT_BTR
a330: 45 45 5f 46 4c 41 47 29 3d 3d 30 0a 20 20 20 20  EE_FLAG)==0.    
a340: 20 20 20 26 26 20 70 61 67 65 47 65 74 4e 52 65     && pageGetNRe
a350: 63 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3e  c(aData, nData)>
a360: 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
a370: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a380: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
a390: 70 4e 65 78 74 3d 3d 30 20 29 20 62 72 65 61 6b  pNext==0 ) break
a3a0: 3b 0a 20 20 20 20 73 65 67 6d 65 6e 74 50 74 72  ;.    segmentPtr
a3b0: 53 65 74 50 61 67 65 28 70 50 74 72 2c 20 70 4e  SetPage(pPtr, pN
a3c0: 65 78 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ext);..    /* Th
a3d0: 69 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62  is should probab
a3e0: 6c 79 20 62 65 20 61 6e 20 4c 53 4d 5f 43 4f 52  ly be an LSM_COR
a3f0: 52 55 50 54 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  RUPT error. */. 
a400: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 4c     assert( rc!=L
a410: 53 4d 5f 4f 4b 20 7c 7c 20 28 70 50 74 72 2d 3e  SM_OK || (pPtr->
a420: 66 6c 61 67 73 20 26 20 50 47 46 54 52 5f 53 4b  flags & PGFTR_SK
a430: 49 50 5f 54 48 49 53 5f 46 4c 41 47 29 20 29 3b  IP_THIS_FLAG) );
a440: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
a450: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
a460: 20 70 74 72 46 77 64 50 6f 69 6e 74 65 72 28 0a   ptrFwdPointer(.
a470: 20 20 50 61 67 65 20 2a 70 50 61 67 65 2c 0a 20    Page *pPage,. 
a480: 20 69 6e 74 20 69 43 65 6c 6c 2c 0a 20 20 53 65   int iCell,.  Se
a490: 67 6d 65 6e 74 20 2a 70 53 65 67 2c 0a 20 20 50  gment *pSeg,.  P
a4a0: 67 6e 6f 20 2a 70 69 50 74 72 2c 0a 20 20 69 6e  gno *piPtr,.  in
a4b0: 74 20 2a 70 62 46 6f 75 6e 64 0a 29 7b 0a 20 20  t *pbFound.){.  
a4c0: 50 61 67 65 20 2a 70 50 67 20 3d 20 70 50 61 67  Page *pPg = pPag
a4d0: 65 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20  e;.  int iFirst 
a4e0: 3d 20 69 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72  = iCell;.  int r
a4f0: 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20 20 64  c = LSM_OK;..  d
a500: 6f 20 7b 0a 20 20 20 20 50 61 67 65 20 2a 70 4e  o {.    Page *pN
a510: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 75 38 20  ext = 0;.    u8 
a520: 2a 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  *aData;.    int 
a530: 6e 44 61 74 61 3b 0a 0a 20 20 20 20 61 44 61 74  nData;..    aDat
a540: 61 20 3d 20 6c 73 6d 46 73 50 61 67 65 44 61 74  a = lsmFsPageDat
a550: 61 28 70 50 67 2c 20 26 6e 44 61 74 61 29 3b 0a  a(pPg, &nData);.
a560: 20 20 20 20 69 66 28 20 28 70 61 67 65 47 65 74      if( (pageGet
a570: 46 6c 61 67 73 28 61 44 61 74 61 2c 20 6e 44 61  Flags(aData, nDa
a580: 74 61 29 20 26 20 53 45 47 4d 45 4e 54 5f 42 54  ta) & SEGMENT_BT
a590: 52 45 45 5f 46 4c 41 47 29 3d 3d 30 20 29 7b 0a  REE_FLAG)==0 ){.
a5a0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
a5b0: 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70     int nCell = p
a5c0: 61 67 65 47 65 74 4e 52 65 63 28 61 44 61 74 61  ageGetNRec(aData
a5d0: 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , nData);.      
a5e0: 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c  for(i=iFirst; i<
a5f0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
a600: 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
a610: 2a 70 61 67 65 47 65 74 43 65 6c 6c 28 61 44 61  *pageGetCell(aDa
a620: 74 61 2c 20 6e 44 61 74 61 2c 20 69 29 3b 0a 20  ta, nData, i);. 
a630: 20 20 20 20 20 20 20 69 66 28 20 28 65 54 79 70         if( (eTyp
a640: 65 20 26 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45  e & LSM_START_DE
a650: 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LETE)==0 ){.    
a660: 20 20 20 20 20 20 2a 70 62 46 6f 75 6e 64 20 3d        *pbFound =
a670: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   1;.          *p
a680: 69 50 74 72 20 3d 20 70 61 67 65 47 65 74 52 65  iPtr = pageGetRe
a690: 63 6f 72 64 50 74 72 28 61 44 61 74 61 2c 20 6e  cordPtr(aData, n
a6a0: 44 61 74 61 2c 20 69 29 20 2b 20 70 61 67 65 47  Data, i) + pageG
a6b0: 65 74 50 74 72 28 61 44 61 74 61 2c 20 6e 44 61  etPtr(aData, nDa
a6c0: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ta);.          l
a6d0: 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65 28  smFsPageRelease(
a6e0: 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
a6f0: 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 20  return LSM_OK;. 
a700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a710: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
a720: 20 6c 73 6d 46 73 44 62 50 61 67 65 4e 65 78 74   lsmFsDbPageNext
a730: 28 70 53 65 67 2c 20 70 50 67 2c 20 31 2c 20 26  (pSeg, pPg, 1, &
a740: 70 4e 65 78 74 29 3b 0a 20 20 20 20 6c 73 6d 46  pNext);.    lsmF
a750: 73 50 61 67 65 52 65 6c 65 61 73 65 28 70 50 67  sPageRelease(pPg
a760: 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 70 4e 65  );.    pPg = pNe
a770: 78 74 3b 0a 20 20 20 20 69 46 69 72 73 74 20 3d  xt;.    iFirst =
a780: 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 50   0;.  }while( pP
a790: 67 20 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20  g && rc==LSM_OK 
a7a0: 29 3b 0a 20 20 6c 73 6d 46 73 50 61 67 65 52 65  );.  lsmFsPageRe
a7b0: 6c 65 61 73 65 28 70 50 67 29 3b 0a 0a 20 20 2a  lease(pPg);..  *
a7c0: 70 62 46 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 72  pbFound = 0;.  r
a7d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
a7e0: 74 69 63 20 69 6e 74 20 73 6f 72 74 65 64 52 68  tic int sortedRh
a7f0: 73 46 69 72 73 74 28 4d 75 6c 74 69 43 75 72 73  sFirst(MultiCurs
a800: 6f 72 20 2a 70 43 73 72 2c 20 4c 65 76 65 6c 20  or *pCsr, Level 
a810: 2a 70 4c 76 6c 2c 20 53 65 67 6d 65 6e 74 50 74  *pLvl, SegmentPt
a820: 72 20 2a 70 50 74 72 29 7b 0a 20 20 69 6e 74 20  r *pPtr){.  int 
a830: 72 63 3b 0a 20 20 72 63 20 3d 20 73 65 67 6d 65  rc;.  rc = segme
a840: 6e 74 50 74 72 45 6e 64 28 70 43 73 72 2c 20 70  ntPtrEnd(pCsr, p
a850: 50 74 72 2c 20 30 29 3b 0a 20 20 77 68 69 6c 65  Ptr, 0);.  while
a860: 28 20 70 50 74 72 2d 3e 70 50 67 20 26 26 20 72  ( pPtr->pPg && r
a870: 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20  c==LSM_OK ){.   
a880: 20 69 6e 74 20 72 65 73 20 3d 20 73 6f 72 74 65   int res = sorte
a890: 64 4b 65 79 43 6f 6d 70 61 72 65 28 70 43 73 72  dKeyCompare(pCsr
a8a0: 2d 3e 70 44 62 2d 3e 78 43 6d 70 2c 0a 20 20 20  ->pDb->xCmp,.   
a8b0: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 53 70 6c 69       pLvl->iSpli
a8c0: 74 54 6f 70 69 63 2c 20 70 4c 76 6c 2d 3e 70 53  tTopic, pLvl->pS
a8d0: 70 6c 69 74 4b 65 79 2c 20 70 4c 76 6c 2d 3e 6e  plitKey, pLvl->n
a8e0: 53 70 6c 69 74 4b 65 79 2c 0a 20 20 20 20 20 20  SplitKey,.      
a8f0: 20 20 72 74 54 6f 70 69 63 28 70 50 74 72 2d 3e    rtTopic(pPtr->
a900: 65 54 79 70 65 29 2c 20 70 50 74 72 2d 3e 70 4b  eType), pPtr->pK
a910: 65 79 2c 20 70 50 74 72 2d 3e 6e 4b 65 79 0a 20  ey, pPtr->nKey. 
a920: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65     );.    if( re
a930: 73 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  s<=0 ) break;.  
a940: 20 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74    rc = segmentPt
a950: 72 41 64 76 61 6e 63 65 28 70 43 73 72 2c 20 70  rAdvance(pCsr, p
a960: 50 74 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Ptr, 0);.  }.  r
a970: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
a980: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a990: 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
a9a0: 61 72 74 20 6f 66 20 61 20 53 45 45 4b 5f 47 45  art of a SEEK_GE
a9b0: 20 6f 70 20 6f 6e 20 61 20 6d 75 6c 74 69 2d 63   op on a multi-c
a9c0: 75 72 73 6f 72 20 69 66 20 74 68 65 20 0a 2a 2a  ursor if the .**
a9d0: 20 46 43 20 70 6f 69 6e 74 65 72 20 72 65 61 64   FC pointer read
a9e0: 20 66 72 6f 6d 20 73 65 67 6d 65 6e 74 20 2a 70   from segment *p
a9f0: 50 74 72 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61  Ptr comes from a
aa00: 6e 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  n entry with the
aa10: 20 0a 2a 2a 20 4c 53 4d 5f 53 54 41 52 54 5f 44   .** LSM_START_D
aa20: 45 4c 45 54 45 20 66 6c 61 67 20 73 65 74 2e 20  ELETE flag set. 
aa30: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
aa40: 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 20 63   pointer value c
aa50: 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20 74 72 75  annot be .** tru
aa60: 73 74 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 74  sted. Instead, t
aa70: 68 65 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20  he pointer that 
aa80: 73 68 6f 75 6c 64 20 62 65 20 66 6f 6c 6c 6f 77  should be follow
aa90: 65 64 20 69 73 20 74 68 61 74 20 61 73 73 6f 63  ed is that assoc
aaa0: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
aab0: 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
aac0: 2a 70 50 74 72 20 74 68 61 74 20 64 6f 65 73 20  *pPtr that does 
aad0: 6e 6f 74 20 68 61 76 65 20 4c 53 4d 5f 53 54 41  not have LSM_STA
aae0: 52 54 5f 44 45 4c 45 54 45 20 73 65 74 2e 0a 2a  RT_DELETE set..*
aaf0: 2a 0a 2a 2a 20 57 68 79 20 74 68 65 20 70 6f 69  *.** Why the poi
ab00: 6e 74 65 72 73 20 63 61 6e 27 74 20 62 65 20 74  nters can't be t
ab10: 72 75 73 74 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a  rusted:.**.**.**
ab20: 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 69  .** TODO: This i
ab30: 73 20 61 20 73 74 6f 70 2d 67 61 70 20 73 6f 6c  s a stop-gap sol
ab40: 75 74 69 6f 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  ution:.** .**   
ab50: 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2c 20 74  At the moment, t
ab60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ab70: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
ab80: 69 6e 20 73 65 67 6d 65 6e 74 50 74 72 53 65 65  in segmentPtrSee
ab90: 6b 28 29 2c 20 0a 2a 2a 20 20 20 61 73 20 70 61  k(), .**   as pa
aba0: 72 74 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  rt of the initia
abb0: 6c 20 6c 73 6d 4d 43 75 72 73 6f 72 53 65 65 6b  l lsmMCursorSeek
abc0: 28 29 20 63 61 6c 6c 2e 20 48 6f 77 65 76 65 72  () call. However
abd0: 2c 20 63 6f 6e 73 69 64 65 72 20 61 20 0a 2a 2a  , consider a .**
abe0: 20 20 20 64 61 74 61 62 61 73 65 20 77 68 65 72     database wher
abf0: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
ac00: 68 61 73 20 6f 63 63 75 72 72 65 64 3a 0a 2a 2a  has occurred:.**
ac10: 0a 2a 2a 20 20 20 20 20 20 31 2e 20 41 20 72 61  .**      1. A ra
ac20: 6e 67 65 20 64 65 6c 65 74 65 20 72 65 6d 6f 76  nge delete remov
ac30: 65 73 20 6b 65 79 73 20 31 2e 2e 39 39 39 39 20  es keys 1..9999 
ac40: 75 73 69 6e 67 20 61 20 72 61 6e 67 65 20 64 65  using a range de
ac50: 6c 65 74 65 2e 0a 2a 2a 20 20 20 20 20 20 32 2e  lete..**      2.
ac60: 20 4b 65 79 73 20 31 20 74 68 72 6f 75 67 68 20   Keys 1 through 
ac70: 39 39 39 39 20 61 72 65 20 72 65 69 6e 73 65 72  9999 are reinser
ac80: 74 65 64 2e 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ted..**      3. 
ac90: 54 68 65 20 6c 65 76 65 6c 73 20 63 6f 6e 74 61  The levels conta
aca0: 69 6e 69 6e 67 20 74 68 65 20 6f 70 73 20 69 6e  ining the ops in
acb0: 20 31 2e 20 61 6e 64 20 32 2e 20 61 62 6f 76 65   1. and 2. above
acc0: 20 61 72 65 20 6d 65 72 67 65 64 2e 20 43 61 6c   are merged. Cal
acd0: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 69  l.**         thi
ace0: 73 20 6c 65 76 65 6c 20 4e 2e 20 4c 65 76 65 6c  s level N. Level
acf0: 20 4e 20 63 6f 6e 74 61 69 6e 73 20 46 43 20 70   N contains FC p
ad00: 6f 69 6e 74 65 72 73 20 74 6f 20 6c 65 76 65 6c  ointers to level
ad10: 20 4e 2b 31 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68   N+1..**.**   Th
ad20: 65 6e 2c 20 69 66 20 74 68 65 20 75 73 65 72 20  en, if the user 
ad30: 61 74 74 65 6d 70 74 73 20 74 6f 20 71 75 65 72  attempts to quer
ad40: 79 20 66 6f 72 20 28 6b 65 79 3e 3d 32 20 4c 49  y for (key>=2 LI
ad50: 4d 49 54 20 31 30 29 2c 20 74 68 65 20 0a 2a 2a  MIT 10), the .**
ad60: 20 20 20 6c 73 6d 4d 43 75 72 73 6f 72 53 65 65     lsmMCursorSee
ad70: 6b 28 29 20 63 61 6c 6c 20 77 69 6c 6c 20 69 74  k() call will it
ad80: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 39 39  erate through 99
ad90: 39 38 20 65 6e 74 72 69 65 73 20 73 65 61 72 63  98 entries searc
ada0: 68 69 6e 67 20 66 6f 72 20 61 20 0a 2a 2a 20 20  hing for a .**  
adb0: 20 70 6f 69 6e 74 65 72 20 64 6f 77 6e 20 74 6f   pointer down to
adc0: 20 74 68 65 20 6c 65 76 65 6c 20 4e 2b 31 20 74   the level N+1 t
add0: 68 61 74 20 69 73 20 6e 65 76 65 72 20 61 63 74  hat is never act
ade0: 75 61 6c 6c 79 20 75 73 65 64 2e 20 49 74 20 77  ually used. It w
adf0: 6f 75 6c 64 20 62 65 0a 2a 2a 20 20 20 6d 75 63  ould be.**   muc
ae00: 68 20 62 65 74 74 65 72 20 69 66 20 74 68 65 20  h better if the 
ae10: 6d 75 6c 74 69 2d 63 75 72 73 6f 72 20 63 6f 75  multi-cursor cou
ae20: 6c 64 20 64 6f 20 74 68 69 73 20 6c 61 7a 69 6c  ld do this lazil
ae30: 79 20 2d 20 6f 6e 6c 79 20 73 65 65 6b 20 74 6f  y - only seek to
ae40: 20 74 68 65 0a 2a 2a 20 20 20 6c 65 76 65 6c 20   the.**   level 
ae50: 28 4e 2b 31 29 20 70 61 67 65 20 61 66 74 65 72  (N+1) page after
ae60: 20 74 68 65 20 75 73 65 72 20 68 61 73 20 6d 6f   the user has mo
ae70: 76 65 64 20 74 68 65 20 63 75 72 73 6f 72 20 6f  ved the cursor o
ae80: 6e 20 6c 65 76 65 6c 20 4e 20 70 61 73 73 65 64  n level N passed
ae90: 0a 2a 2a 20 20 20 74 68 65 20 62 69 67 20 72 61  .**   the big ra
aea0: 6e 67 65 2d 64 65 6c 65 74 65 2e 0a 2a 2f 0a 73  nge-delete..*/.s
aeb0: 74 61 74 69 63 20 69 6e 74 20 73 65 67 6d 65 6e  tatic int segmen
aec0: 74 50 74 72 46 77 64 50 6f 69 6e 74 65 72 28 0a  tPtrFwdPointer(.
aed0: 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70    MultiCursor *p
aee0: 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Csr,            
aef0: 20 20 2f 2a 20 4d 75 6c 74 69 2d 63 75 72 73 6f    /* Multi-curso
af00: 72 20 70 50 74 72 20 62 65 6c 6f 6e 67 73 20 74  r pPtr belongs t
af10: 6f 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 50 74  o */.  SegmentPt
af20: 72 20 2a 70 50 74 72 2c 20 20 20 20 20 20 20 20  r *pPtr,        
af30: 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
af40: 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 65 78 74  t-pointer to ext
af50: 72 61 63 74 20 46 43 20 70 74 72 20 66 72 6f 6d  ract FC ptr from
af60: 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 69 50 74   */.  Pgno *piPt
af70: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
af80: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 43        /* OUT: FC
af90: 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 20 2a   pointer value *
afa0: 2f 0a 29 7b 0a 20 20 4c 65 76 65 6c 20 2a 70 4c  /.){.  Level *pL
afb0: 76 6c 20 3d 20 70 50 74 72 2d 3e 70 4c 65 76 65  vl = pPtr->pLeve
afc0: 6c 3b 0a 20 20 4c 65 76 65 6c 20 2a 70 4e 65 78  l;.  Level *pNex
afd0: 74 20 3d 20 70 4c 76 6c 2d 3e 70 4e 65 78 74 3b  t = pLvl->pNext;
afe0: 0a 20 20 50 61 67 65 20 2a 70 50 67 20 3d 20 70  .  Page *pPg = p
aff0: 50 74 72 2d 3e 70 50 67 3b 0a 20 20 69 6e 74 20  Ptr->pPg;.  int 
b000: 72 63 3b 0a 20 20 69 6e 74 20 62 46 6f 75 6e 64  rc;.  int bFound
b010: 3b 0a 20 20 50 67 6e 6f 20 69 4f 75 74 20 3d 20  ;.  Pgno iOut = 
b020: 30 3b 0a 0a 20 20 69 66 28 20 70 50 74 72 2d 3e  0;..  if( pPtr->
b030: 70 53 65 67 3d 3d 26 70 4c 76 6c 2d 3e 6c 68 73  pSeg==&pLvl->lhs
b040: 20 7c 7c 20 70 50 74 72 2d 3e 70 53 65 67 3d 3d   || pPtr->pSeg==
b050: 26 70 4c 76 6c 2d 3e 61 52 68 73 5b 70 4c 76 6c  &pLvl->aRhs[pLvl
b060: 2d 3e 6e 52 69 67 68 74 2d 31 5d 20 29 7b 0a 20  ->nRight-1] ){. 
b070: 20 20 20 69 66 28 20 70 4e 65 78 74 3d 3d 30 20     if( pNext==0 
b080: 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
b090: 78 74 2d 3e 6e 52 69 67 68 74 3d 3d 30 20 26 26  xt->nRight==0 &&
b0a0: 20 70 4e 65 78 74 2d 3e 6c 68 73 2e 69 52 6f 6f   pNext->lhs.iRoo
b0b0: 74 29 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70  t).        || (p
b0c0: 4e 65 78 74 2d 3e 6e 52 69 67 68 74 21 3d 30 20  Next->nRight!=0 
b0d0: 26 26 20 70 4e 65 78 74 2d 3e 61 52 68 73 5b 30  && pNext->aRhs[0
b0e0: 5d 2e 69 52 6f 6f 74 29 0a 20 20 20 20 20 20 29  ].iRoot).      )
b0f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
b100: 74 68 69 6e 67 2e 20 54 68 65 20 70 6f 69 6e 74  thing. The point
b110: 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  er will not be u
b120: 73 65 64 20 61 6e 79 77 61 79 2e 20 2a 2f 0a 20  sed anyway. */. 
b130: 20 20 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f       return LSM_
b140: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  OK;.    }.  }els
b150: 65 7b 0a 20 20 20 20 69 66 28 20 70 50 74 72 5b  e{.    if( pPtr[
b160: 31 5d 2e 70 53 65 67 2d 3e 69 52 6f 6f 74 20 29  1].pSeg->iRoot )
b170: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4c  {.      return L
b180: 53 4d 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  SM_OK;.    }.  }
b190: 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f  ..  /* Search fo
b1a0: 72 20 61 20 70 6f 69 6e 74 65 72 20 77 69 74 68  r a pointer with
b1b0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  in the current s
b1c0: 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 6c 73 6d  egment. */.  lsm
b1d0: 46 73 50 61 67 65 52 65 66 28 70 50 67 29 3b 0a  FsPageRef(pPg);.
b1e0: 20 20 72 63 20 3d 20 70 74 72 46 77 64 50 6f 69    rc = ptrFwdPoi
b1f0: 6e 74 65 72 28 70 50 67 2c 20 70 50 74 72 2d 3e  nter(pPg, pPtr->
b200: 69 43 65 6c 6c 2c 20 70 50 74 72 2d 3e 70 53 65  iCell, pPtr->pSe
b210: 67 2c 20 26 69 4f 75 74 2c 20 26 62 46 6f 75 6e  g, &iOut, &bFoun
b220: 64 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 4c  d);..  if( rc==L
b230: 53 4d 5f 4f 4b 20 26 26 20 62 46 6f 75 6e 64 3d  SM_OK && bFound=
b240: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
b250: 73 20 63 61 73 65 20 68 61 70 70 65 6e 73 20 77  s case happens w
b260: 68 65 6e 20 70 50 74 72 20 70 6f 69 6e 74 73 20  hen pPtr points 
b270: 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
b280: 2d 73 69 64 65 20 6f 66 20 61 20 73 65 67 6d 65  -side of a segme
b290: 6e 74 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  nt.    ** curren
b2a0: 74 6c 79 20 75 6e 64 65 72 67 6f 69 6e 67 20 61  tly undergoing a
b2b0: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  n incremental me
b2c0: 72 67 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  rge. In this cas
b2d0: 65 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 0a 20  e, jump to the. 
b2e0: 20 20 20 2a 2a 20 6f 6c 64 65 73 74 20 73 65 67     ** oldest seg
b2f0: 6d 65 6e 74 20 69 6e 20 74 68 65 20 72 69 67 68  ment in the righ
b300: 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74  t-hand-side of t
b310: 68 65 20 73 61 6d 65 20 6c 65 76 65 6c 20 61 6e  he same level an
b320: 64 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 2a  d continue.    *
b330: 2a 20 73 65 61 72 63 68 69 6e 67 2e 20 42 75 74  * searching. But
b340: 20 2d 20 64 6f 20 6e 6f 74 20 63 6f 6e 73 69 64   - do not consid
b350: 65 72 20 61 6e 79 20 6b 65 79 73 20 73 6d 61 6c  er any keys smal
b360: 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6c 65 76  ler than the lev
b370: 65 6c 73 0a 20 20 20 20 2a 2a 20 73 70 6c 69 74  els.    ** split
b380: 2d 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 53 65 67  -key. */.    Seg
b390: 6d 65 6e 74 50 74 72 20 70 74 72 3b 0a 0a 20 20  mentPtr ptr;..  
b3a0: 20 20 69 66 28 20 70 50 74 72 2d 3e 70 4c 65 76    if( pPtr->pLev
b3b0: 65 6c 2d 3e 6e 52 69 67 68 74 3d 3d 30 20 7c 7c  el->nRight==0 ||
b3c0: 20 70 50 74 72 2d 3e 70 53 65 67 21 3d 26 70 50   pPtr->pSeg!=&pP
b3d0: 74 72 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68 73 20  tr->pLevel->lhs 
b3e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b3f0: 4c 53 4d 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  LSM_CORRUPT_BKPT
b400: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 6d  ;.    }..    mem
b410: 73 65 74 28 26 70 74 72 2c 20 30 2c 20 73 69 7a  set(&ptr, 0, siz
b420: 65 6f 66 28 53 65 67 6d 65 6e 74 50 74 72 29 29  eof(SegmentPtr))
b430: 3b 0a 20 20 20 20 70 74 72 2e 70 4c 65 76 65 6c  ;.    ptr.pLevel
b440: 20 3d 20 70 50 74 72 2d 3e 70 4c 65 76 65 6c 3b   = pPtr->pLevel;
b450: 0a 20 20 20 20 70 74 72 2e 70 53 65 67 20 3d 20  .    ptr.pSeg = 
b460: 26 70 74 72 2e 70 4c 65 76 65 6c 2d 3e 61 52 68  &ptr.pLevel->aRh
b470: 73 5b 70 74 72 2e 70 4c 65 76 65 6c 2d 3e 6e 52  s[ptr.pLevel->nR
b480: 69 67 68 74 2d 31 5d 3b 0a 20 20 20 20 72 63 20  ight-1];.    rc 
b490: 3d 20 73 6f 72 74 65 64 52 68 73 46 69 72 73 74  = sortedRhsFirst
b4a0: 28 70 43 73 72 2c 20 70 74 72 2e 70 4c 65 76 65  (pCsr, ptr.pLeve
b4b0: 6c 2c 20 26 70 74 72 29 3b 0a 20 20 20 20 69 66  l, &ptr);.    if
b4c0: 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
b4d0: 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 46 77        rc = ptrFw
b4e0: 64 50 6f 69 6e 74 65 72 28 70 74 72 2e 70 50 67  dPointer(ptr.pPg
b4f0: 2c 20 70 74 72 2e 69 43 65 6c 6c 2c 20 70 74 72  , ptr.iCell, ptr
b500: 2e 70 53 65 67 2c 20 26 69 4f 75 74 2c 20 26 62  .pSeg, &iOut, &b
b510: 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20 20 70 74  Found);.      pt
b520: 72 2e 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d  r.pPg = 0;.    }
b530: 0a 20 20 20 20 73 65 67 6d 65 6e 74 50 74 72 52  .    segmentPtrR
b540: 65 73 65 74 28 26 70 74 72 29 3b 0a 20 20 7d 0a  eset(&ptr);.  }.
b550: 0a 20 20 2a 70 69 50 74 72 20 3d 20 69 4f 75 74  .  *piPtr = iOut
b560: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
b570: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 67  ..static int seg
b580: 6d 65 6e 74 50 74 72 53 65 65 6b 28 0a 20 20 4d  mentPtrSeek(.  M
b590: 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72  ultiCursor *pCsr
b5a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
b5b0: 2a 20 43 75 72 73 6f 72 20 63 6f 6e 74 65 78 74  * Cursor context
b5c0: 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 50 74 72   */.  SegmentPtr
b5d0: 20 2a 70 50 74 72 2c 20 20 20 20 20 20 20 20 20   *pPtr,         
b5e0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
b5f0: 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 69 6e   to seek */.  in
b600: 74 20 69 54 6f 70 69 63 2c 20 20 20 20 20 20 20  t iTopic,       
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b620: 20 4b 65 79 20 74 6f 70 69 63 20 74 6f 20 73 65   Key topic to se
b630: 65 6b 20 74 6f 20 2a 2f 0a 20 20 76 6f 69 64 20  ek to */.  void 
b640: 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 2c  *pKey, int nKey,
b650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
b660: 79 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a  y to seek to */.
b670: 20 20 69 6e 74 20 65 53 65 65 6b 2c 20 20 20 20    int eSeek,    
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b690: 20 20 2f 2a 20 53 65 61 72 63 68 20 62 69 61 73    /* Search bias
b6a0: 20 2d 20 73 65 65 20 61 62 6f 76 65 20 2a 2f 0a   - see above */.
b6b0: 20 20 69 6e 74 20 2a 70 69 50 74 72 2c 20 20 20    int *piPtr,   
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6d0: 20 20 2f 2a 20 4f 55 54 3a 20 46 43 20 70 6f 69    /* OUT: FC poi
b6e0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  nter */.  int *p
b6f0: 62 53 74 6f 70 0a 29 7b 0a 20 20 69 6e 74 20 28  bStop.){.  int (
b700: 2a 78 43 6d 70 29 28 76 6f 69 64 20 2a 2c 20 69  *xCmp)(void *, i
b710: 6e 74 2c 20 76 6f 69 64 20 2a 2c 20 69 6e 74 29  nt, void *, int)
b720: 20 3d 20 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43   = pCsr->pDb->xC
b730: 6d 70 3b 0a 20 20 69 6e 74 20 72 65 73 3b 20 20  mp;.  int res;  
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
b760: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  of comparison op
b770: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
b780: 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20   rc = LSM_OK;.  
b790: 69 6e 74 20 69 4d 69 6e 3b 0a 20 20 69 6e 74 20  int iMin;.  int 
b7a0: 69 4d 61 78 3b 0a 20 20 50 67 6e 6f 20 69 50 74  iMax;.  Pgno iPt
b7b0: 72 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  rOut = 0;..  /* 
b7c0: 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  If the current p
b7d0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  age contains an 
b7e0: 6f 76 65 72 73 69 7a 65 64 20 65 6e 74 72 79 2c  oversized entry,
b7f0: 20 74 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   then there are 
b800: 6e 6f 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73  no.  ** pointers
b810: 20 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   to one or more 
b820: 6f 66 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  of the subsequen
b830: 74 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  t pages in the s
b840: 6f 72 74 65 64 20 72 75 6e 2e 0a 20 20 2a 2a 20  orted run..  ** 
b850: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
b860: 6c 6c 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ll ensures that 
b870: 74 68 65 20 73 65 67 6d 65 6e 74 2d 70 74 72 20  the segment-ptr 
b880: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 63 6f  points to the co
b890: 72 72 65 63 74 20 0a 20 20 2a 2a 20 70 61 67 65  rrect .  ** page
b8a0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
b8b0: 2a 2f 0a 20 20 72 63 20 3d 20 73 65 67 6d 65 6e  */.  rc = segmen
b8c0: 74 50 74 72 53 65 61 72 63 68 4f 76 65 72 73 69  tPtrSearchOversi
b8d0: 7a 65 64 28 70 43 73 72 2c 20 70 50 74 72 2c 20  zed(pCsr, pPtr, 
b8e0: 69 54 6f 70 69 63 2c 20 70 4b 65 79 2c 20 6e 4b  iTopic, pKey, nK
b8f0: 65 79 29 3b 0a 20 20 69 50 74 72 4f 75 74 20 3d  ey);.  iPtrOut =
b900: 20 70 50 74 72 2d 3e 69 50 74 72 3b 0a 0a 20 20   pPtr->iPtr;..  
b910: 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
b920: 68 69 73 20 70 61 67 65 20 69 73 20 74 68 65 20  his page is the 
b930: 72 69 67 68 74 20 70 61 67 65 20 6f 66 20 74 68  right page of th
b940: 69 73 20 73 65 67 6d 65 6e 74 20 66 6f 72 20 74  is segment for t
b950: 68 65 20 6b 65 79 0a 20 20 2a 2a 20 74 68 61 74  he key.  ** that
b960: 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e   we are searchin
b970: 67 20 66 6f 72 2e 20 44 6f 20 74 68 69 73 20 62  g for. Do this b
b980: 79 20 6c 6f 61 64 69 6e 67 20 70 61 67 65 20 28  y loading page (
b990: 69 50 67 2d 31 29 20 61 6e 64 20 74 65 73 74 69  iPg-1) and testi
b9a0: 6e 67 0a 20 20 2a 2a 20 74 68 61 74 20 70 4b 65  ng.  ** that pKe
b9b0: 79 2f 6e 4b 65 79 20 69 73 20 67 72 65 61 74 65  y/nKey is greate
b9c0: 72 20 74 68 61 6e 20 61 6c 6c 20 6b 65 79 73 20  r than all keys 
b9d0: 6f 6e 20 74 68 61 74 20 70 61 67 65 2c 20 61 6e  on that page, an
b9e0: 64 20 74 68 65 6e 20 62 79 20 0a 20 20 2a 2a 20  d then by .  ** 
b9f0: 6c 6f 61 64 69 6e 67 20 28 69 50 67 2b 31 29 20  loading (iPg+1) 
ba00: 61 6e 64 20 74 65 73 74 69 6e 67 20 74 68 61 74  and testing that
ba10: 20 70 4b 65 79 2f 6e 4b 65 79 20 69 73 20 73 6d   pKey/nKey is sm
ba20: 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c 0a 20  aller than all. 
ba30: 20 2a 2a 20 74 68 65 20 6b 65 79 73 20 69 74 20   ** the keys it 
ba40: 68 6f 75 73 65 73 2e 20 20 0a 20 20 2a 2a 0a 20  houses.  .  **. 
ba50: 20 2a 2a 20 54 4f 44 4f 3a 20 57 69 74 68 20 72   ** TODO: With r
ba60: 61 6e 67 65 2d 64 65 6c 65 74 65 73 20 69 6e 20  ange-deletes in 
ba70: 74 68 65 20 74 72 65 65 2c 20 74 68 65 20 74 65  the tree, the te
ba80: 73 74 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  st described abo
ba90: 76 65 20 6d 61 79 20 66 61 69 6c 2e 0a 20 20 2a  ve may fail..  *
baa0: 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
bab0: 28 20 61 73 73 65 72 74 4b 65 79 4c 6f 63 61 74  ( assertKeyLocat
bac0: 69 6f 6e 28 70 43 73 72 2c 20 70 50 74 72 2c 20  ion(pCsr, pPtr, 
bad0: 70 4b 65 79 2c 20 6e 4b 65 79 29 20 29 3b 0a 23  pKey, nKey) );.#
bae0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
baf0: 20 70 50 74 72 2d 3e 6e 43 65 6c 6c 3e 30 20 0a   pPtr->nCell>0 .
bb00: 20 20 20 20 20 20 20 7c 7c 20 70 50 74 72 2d 3e         || pPtr->
bb10: 70 53 65 67 2d 3e 6e 53 69 7a 65 3d 3d 31 20 0a  pSeg->nSize==1 .
bb20: 20 20 20 20 20 20 20 7c 7c 20 6c 73 6d 46 73 44         || lsmFsD
bb30: 62 50 61 67 65 49 73 4c 61 73 74 28 70 50 74 72  bPageIsLast(pPtr
bb40: 2d 3e 70 53 65 67 2c 20 70 50 74 72 2d 3e 70 50  ->pSeg, pPtr->pP
bb50: 67 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 50  g).  );.  if( pP
bb60: 74 72 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  tr->nCell==0 ){.
bb70: 20 20 20 20 73 65 67 6d 65 6e 74 50 74 72 52 65      segmentPtrRe
bb80: 73 65 74 28 70 50 74 72 29 3b 0a 20 20 7d 65 6c  set(pPtr);.  }el
bb90: 73 65 7b 0a 20 20 20 20 69 4d 69 6e 20 3d 20 30  se{.    iMin = 0
bba0: 3b 0a 20 20 20 20 69 4d 61 78 20 3d 20 70 50 74  ;.    iMax = pPt
bbb0: 72 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 0a 20 20 20  r->nCell-1;..   
bbc0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
bbd0: 20 20 20 69 6e 74 20 69 54 72 79 20 3d 20 28 69     int iTry = (i
bbe0: 4d 69 6e 2b 69 4d 61 78 29 2f 32 3b 0a 20 20 20  Min+iMax)/2;.   
bbf0: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 54 3b 20     void *pKeyT; 
bc00: 69 6e 74 20 6e 4b 65 79 54 3b 20 20 20 20 20 20  int nKeyT;      
bc10: 20 2f 2a 20 4b 65 79 20 66 6f 72 20 63 65 6c 6c   /* Key for cell
bc20: 20 69 54 72 79 20 2a 2f 0a 20 20 20 20 20 20 69   iTry */.      i
bc30: 6e 74 20 69 54 6f 70 69 63 54 3b 0a 0a 20 20 20  nt iTopicT;..   
bc40: 20 20 20 61 73 73 65 72 74 28 20 69 54 72 79 3c     assert( iTry<
bc50: 69 4d 61 78 20 7c 7c 20 69 4d 69 6e 3d 3d 69 4d  iMax || iMin==iM
bc60: 61 78 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  ax );..      rc 
bc70: 3d 20 73 65 67 6d 65 6e 74 50 74 72 4c 6f 61 64  = segmentPtrLoad
bc80: 43 65 6c 6c 28 70 50 74 72 2c 20 69 54 72 79 29  Cell(pPtr, iTry)
bc90: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
bca0: 4c 53 4d 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a  LSM_OK ) break;.
bcb0: 0a 20 20 20 20 20 20 73 65 67 6d 65 6e 74 50 74  .      segmentPt
bcc0: 72 4b 65 79 28 70 50 74 72 2c 20 26 70 4b 65 79  rKey(pPtr, &pKey
bcd0: 54 2c 20 26 6e 4b 65 79 54 29 3b 0a 20 20 20 20  T, &nKeyT);.    
bce0: 20 20 69 54 6f 70 69 63 54 20 3d 20 72 74 54 6f    iTopicT = rtTo
bcf0: 70 69 63 28 70 50 74 72 2d 3e 65 54 79 70 65 29  pic(pPtr->eType)
bd00: 3b 0a 0a 20 20 20 20 20 20 72 65 73 20 3d 20 73  ;..      res = s
bd10: 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65 28  ortedKeyCompare(
bd20: 78 43 6d 70 2c 20 69 54 6f 70 69 63 54 2c 20 70  xCmp, iTopicT, p
bd30: 4b 65 79 54 2c 20 6e 4b 65 79 54 2c 20 69 54 6f  KeyT, nKeyT, iTo
bd40: 70 69 63 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29  pic, pKey, nKey)
bd50: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c  ;.      if( res<
bd60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 50  =0 ){.        iP
bd70: 74 72 4f 75 74 20 3d 20 70 50 74 72 2d 3e 69 50  trOut = pPtr->iP
bd80: 74 72 20 2b 20 70 50 74 72 2d 3e 69 50 67 50 74  tr + pPtr->iPgPt
bd90: 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  r;.      }..    
bda0: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 7c 7c 20    if( res==0 || 
bdb0: 69 4d 69 6e 3d 3d 69 4d 61 78 20 29 7b 0a 20 20  iMin==iMax ){.  
bdc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bdd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
bde0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4d  >0 ){.        iM
bdf0: 61 78 20 3d 20 4c 53 4d 5f 4d 41 58 28 69 54 72  ax = LSM_MAX(iTr
be00: 79 2d 31 2c 20 69 4d 69 6e 29 3b 0a 20 20 20 20  y-1, iMin);.    
be10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
be20: 20 69 4d 69 6e 20 3d 20 69 54 72 79 2b 31 3b 0a   iMin = iTry+1;.
be30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
be40: 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
be50: 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
be60: 74 28 20 72 65 73 3d 3d 30 20 7c 7c 20 28 69 4d  t( res==0 || (iM
be70: 69 6e 3d 3d 69 4d 61 78 20 26 26 20 69 4d 69 6e  in==iMax && iMin
be80: 3e 3d 30 20 26 26 20 69 4d 69 6e 3c 70 50 74 72  >=0 && iMin<pPtr
be90: 2d 3e 6e 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20  ->nCell) );.    
bea0: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
beb0: 20 20 20 20 20 72 63 20 3d 20 73 65 67 6d 65 6e       rc = segmen
bec0: 74 50 74 72 4c 6f 61 64 43 65 6c 6c 28 70 50 74  tPtrLoadCell(pPt
bed0: 72 2c 20 69 4d 69 6e 29 3b 0a 20 20 20 20 20 20  r, iMin);.      
bee0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
bef0: 72 63 21 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 72 65  rc!=LSM_OK || re
bf00: 73 3e 30 20 7c 7c 20 69 50 74 72 4f 75 74 3d 3d  s>0 || iPtrOut==
bf10: 28 70 50 74 72 2d 3e 69 50 74 72 20 2b 20 70 50  (pPtr->iPtr + pP
bf20: 74 72 2d 3e 69 50 67 50 74 72 29 20 29 3b 0a 0a  tr->iPgPtr) );..
bf30: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53        if( rc==LS
bf40: 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  M_OK ){.        
bf50: 73 77 69 74 63 68 28 20 65 53 65 65 6b 20 29 7b  switch( eSeek ){
bf60: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
bf70: 4c 53 4d 5f 53 45 45 4b 5f 45 51 3a 20 7b 0a 20  LSM_SEEK_EQ: {. 
bf80: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65             int e
bf90: 54 79 70 65 20 3d 20 70 50 74 72 2d 3e 65 54 79  Type = pPtr->eTy
bfa0: 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pe;.            
bfb0: 69 66 28 20 28 72 65 73 3c 30 20 26 26 20 28 65  if( (res<0 && (e
bfc0: 54 79 70 65 20 26 20 4c 53 4d 5f 53 54 41 52 54  Type & LSM_START
bfd0: 5f 44 45 4c 45 54 45 29 29 0a 20 20 20 20 20 20  _DELETE)).      
bfe0: 20 20 20 20 20 20 20 7c 7c 20 28 72 65 73 3e 30         || (res>0
bff0: 20 26 26 20 28 65 54 79 70 65 20 26 20 4c 53 4d   && (eType & LSM
c000: 5f 45 4e 44 5f 44 45 4c 45 54 45 29 29 0a 20 20  _END_DELETE)).  
c010: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 72             || (r
c020: 65 73 3d 3d 30 20 26 26 20 28 65 54 79 70 65 20  es==0 && (eType 
c030: 26 20 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c 45  & LSM_POINT_DELE
c040: 54 45 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  TE)).           
c050: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c060: 20 20 2a 70 62 53 74 6f 70 20 3d 20 31 3b 0a 20    *pbStop = 1;. 
c070: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
c080: 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28   if( res==0 && (
c090: 65 54 79 70 65 20 26 20 4c 53 4d 5f 49 4e 53 45  eType & LSM_INSE
c0a0: 52 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RT) ){.         
c0b0: 20 20 20 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 45       lsm_env *pE
c0c0: 6e 76 20 3d 20 70 43 73 72 2d 3e 70 44 62 2d 3e  nv = pCsr->pDb->
c0d0: 70 45 6e 76 3b 0a 20 20 20 20 20 20 20 20 20 20  pEnv;.          
c0e0: 20 20 20 20 2a 70 62 53 74 6f 70 20 3d 20 31 3b      *pbStop = 1;
c0f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
c100: 43 73 72 2d 3e 65 54 79 70 65 20 3d 20 70 50 74  Csr->eType = pPt
c110: 72 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20  r->eType;.      
c120: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 6f 72          rc = sor
c130: 74 65 64 42 6c 6f 62 53 65 74 28 70 45 6e 76 2c  tedBlobSet(pEnv,
c140: 20 26 70 43 73 72 2d 3e 6b 65 79 2c 20 70 50 74   &pCsr->key, pPt
c150: 72 2d 3e 70 4b 65 79 2c 20 70 50 74 72 2d 3e 6e  r->pKey, pPtr->n
c160: 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
c170: 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f      if( rc==LSM_
c180: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
c190: 20 20 20 20 20 20 72 63 20 3d 20 73 6f 72 74 65        rc = sorte
c1a0: 64 42 6c 6f 62 53 65 74 28 70 45 6e 76 2c 20 26  dBlobSet(pEnv, &
c1b0: 70 43 73 72 2d 3e 76 61 6c 2c 20 70 50 74 72 2d  pCsr->val, pPtr-
c1c0: 3e 70 56 61 6c 2c 20 70 50 74 72 2d 3e 6e 56 61  >pVal, pPtr->nVa
c1d0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
c1e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
c1f0: 20 20 70 43 73 72 2d 3e 66 6c 61 67 73 20 7c 3d    pCsr->flags |=
c200: 20 43 55 52 53 4f 52 5f 53 45 45 4b 5f 45 51 3b   CURSOR_SEEK_EQ;
c210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
c220: 20 20 20 20 20 20 20 20 20 20 20 73 65 67 6d 65             segme
c230: 6e 74 50 74 72 52 65 73 65 74 28 70 50 74 72 29  ntPtrReset(pPtr)
c240: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
c250: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
c260: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
c270: 4c 53 4d 5f 53 45 45 4b 5f 4c 45 3a 0a 20 20 20  LSM_SEEK_LE:.   
c280: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73           if( res
c290: 3e 30 20 29 20 72 63 20 3d 20 73 65 67 6d 65 6e  >0 ) rc = segmen
c2a0: 74 50 74 72 41 64 76 61 6e 63 65 28 70 43 73 72  tPtrAdvance(pCsr
c2b0: 2c 20 70 50 74 72 2c 20 31 29 3b 0a 20 20 20 20  , pPtr, 1);.    
c2c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c2d0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 4c 53           case LS
c2e0: 4d 5f 53 45 45 4b 5f 47 45 3a 20 7b 0a 20 20 20  M_SEEK_GE: {.   
c2f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 67 75           /* Figu
c300: 72 65 20 6f 75 74 20 69 66 20 77 65 20 6e 65 65  re out if we nee
c310: 64 20 74 6f 20 27 73 6b 69 70 27 20 74 68 65 20  d to 'skip' the 
c320: 70 6f 69 6e 74 65 72 20 66 6f 72 77 61 72 64 20  pointer forward 
c330: 6f 72 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20  or not */.      
c340: 20 20 20 20 20 20 69 66 28 20 28 72 65 73 3c 3d        if( (res<=
c350: 30 20 26 26 20 28 70 50 74 72 2d 3e 65 54 79 70  0 && (pPtr->eTyp
c360: 65 20 26 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45  e & LSM_START_DE
c370: 4c 45 54 45 29 29 20 0a 20 20 20 20 20 20 20 20  LETE)) .        
c380: 20 20 20 20 20 7c 7c 20 28 72 65 73 3e 30 20 20       || (res>0  
c390: 26 26 20 28 70 50 74 72 2d 3e 65 54 79 70 65 20  && (pPtr->eType 
c3a0: 26 20 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45 54 45  & LSM_END_DELETE
c3b0: 29 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  )) .            
c3c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
c3d0: 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72   rc = segmentPtr
c3e0: 46 77 64 50 6f 69 6e 74 65 72 28 70 43 73 72 2c  FwdPointer(pCsr,
c3f0: 20 70 50 74 72 2c 20 26 69 50 74 72 4f 75 74 29   pPtr, &iPtrOut)
c400: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
c410: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
c420: 72 65 73 3c 30 20 26 26 20 72 63 3d 3d 4c 53 4d  res<0 && rc==LSM
c430: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
c440: 20 20 20 20 20 72 63 20 3d 20 73 65 67 6d 65 6e       rc = segmen
c450: 74 50 74 72 41 64 76 61 6e 63 65 28 70 43 73 72  tPtrAdvance(pCsr
c460: 2c 20 70 50 74 72 2c 20 30 29 3b 0a 20 20 20 20  , pPtr, 0);.    
c470: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c4a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c4b0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
c4c0: 63 75 72 73 6f 72 20 73 65 65 6b 20 68 61 73 20  cursor seek has 
c4d0: 66 6f 75 6e 64 20 61 20 73 65 70 61 72 61 74 6f  found a separato
c4e0: 72 20 6b 65 79 2c 20 61 6e 64 20 74 68 69 73 20  r key, and this 
c4f0: 63 75 72 73 6f 72 20 69 73 0a 20 20 20 20 2a 2a  cursor is.    **
c500: 20 73 75 70 70 6f 73 65 64 20 74 6f 20 69 67 6e   supposed to ign
c510: 6f 72 65 20 73 65 70 61 72 61 74 6f 72 73 20 6b  ore separators k
c520: 65 79 73 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  eys, advance to 
c530: 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20  the next entry. 
c540: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
c550: 4c 53 4d 5f 4f 4b 20 26 26 20 70 50 74 72 2d 3e  LSM_OK && pPtr->
c560: 70 50 67 0a 20 20 20 20 20 26 26 20 73 65 67 6d  pPg.     && segm
c570: 65 6e 74 50 74 72 49 67 6e 6f 72 65 53 65 70 61  entPtrIgnoreSepa
c580: 72 61 74 6f 72 73 28 70 43 73 72 2c 20 70 50 74  rators(pCsr, pPt
c590: 72 29 20 0a 20 20 20 20 20 26 26 20 72 74 49 73  r) .     && rtIs
c5a0: 53 65 70 61 72 61 74 6f 72 28 70 50 74 72 2d 3e  Separator(pPtr->
c5b0: 65 54 79 70 65 29 0a 20 20 20 20 29 7b 0a 20 20  eType).    ){.  
c5c0: 20 20 20 20 61 73 73 65 72 74 28 20 65 53 65 65      assert( eSee
c5d0: 6b 21 3d 4c 53 4d 5f 53 45 45 4b 5f 45 51 20 29  k!=LSM_SEEK_EQ )
c5e0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 67  ;.      rc = seg
c5f0: 6d 65 6e 74 50 74 72 41 64 76 61 6e 63 65 28 70  mentPtrAdvance(p
c600: 43 73 72 2c 20 70 50 74 72 2c 20 65 53 65 65 6b  Csr, pPtr, eSeek
c610: 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 4c 45 29 3b 0a  ==LSM_SEEK_LE);.
c620: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
c630: 65 72 74 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20  ert( rc!=LSM_OK 
c640: 7c 7c 20 61 73 73 65 72 74 53 65 65 6b 52 65 73  || assertSeekRes
c650: 75 6c 74 28 70 43 73 72 2c 70 50 74 72 2c 69 54  ult(pCsr,pPtr,iT
c660: 6f 70 69 63 2c 70 4b 65 79 2c 6e 4b 65 79 2c 65  opic,pKey,nKey,e
c670: 53 65 65 6b 29 20 29 3b 0a 20 20 2a 70 69 50 74  Seek) );.  *piPt
c680: 72 20 3d 20 69 50 74 72 4f 75 74 3b 0a 20 20 72  r = iPtrOut;.  r
c690: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
c6a0: 74 69 63 20 69 6e 74 20 73 65 65 6b 49 6e 42 74  tic int seekInBt
c6b0: 72 65 65 28 0a 20 20 4d 75 6c 74 69 43 75 72 73  ree(.  MultiCurs
c6c0: 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
c6d0: 20 20 20 20 20 20 20 2f 2a 20 4d 75 6c 74 69 2d         /* Multi-
c6e0: 63 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  cursor object */
c6f0: 0a 20 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  .  Segment *pSeg
c700: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c710: 20 20 20 2f 2a 20 53 65 65 6b 20 77 69 74 68 69     /* Seek withi
c720: 6e 20 74 68 69 73 20 73 65 67 6d 65 6e 74 20 2a  n this segment *
c730: 2f 0a 20 20 69 6e 74 20 69 54 6f 70 69 63 2c 0a  /.  int iTopic,.
c740: 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e    void *pKey, in
c750: 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
c760: 20 20 2f 2a 20 4b 65 79 20 74 6f 20 73 65 65 6b    /* Key to seek
c770: 20 74 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 61   to */.  Pgno *a
c780: 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
c790: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
c7a0: 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 2a 2f   Page numbers */
c7b0: 0a 20 20 50 61 67 65 20 2a 2a 70 70 50 67 20 20  .  Page **ppPg  
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7d0: 20 20 20 2f 2a 20 4f 55 54 3a 20 4c 65 61 66 20     /* OUT: Leaf 
c7e0: 28 73 6f 72 74 65 64 2d 72 75 6e 29 20 70 61 67  (sorted-run) pag
c7f0: 65 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 29  e reference */.)
c800: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
c810: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
c820: 50 67 3b 0a 20 20 50 61 67 65 20 2a 70 50 67 20  Pg;.  Page *pPg 
c830: 3d 20 30 3b 0a 20 20 42 6c 6f 62 20 62 6c 6f 62  = 0;.  Blob blob
c840: 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20   = {0, 0, 0};.. 
c850: 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 69 52 6f   iPg = pSeg->iRo
c860: 6f 74 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 50  ot;.  do {.    P
c870: 67 6e 6f 20 2a 70 69 46 69 72 73 74 20 3d 20 30  gno *piFirst = 0
c880: 3b 0a 20 20 20 20 69 66 28 20 61 50 67 20 29 7b  ;.    if( aPg ){
c890: 0a 20 20 20 20 20 20 61 50 67 5b 69 2b 2b 5d 20  .      aPg[i++] 
c8a0: 3d 20 69 50 67 3b 0a 20 20 20 20 20 20 70 69 46  = iPg;.      piF
c8b0: 69 72 73 74 20 3d 20 26 61 50 67 5b 69 5d 3b 0a  irst = &aPg[i];.
c8c0: 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
c8d0: 6c 73 6d 46 73 44 62 50 61 67 65 47 65 74 28 70  lsmFsDbPageGet(p
c8e0: 43 73 72 2d 3e 70 44 62 2d 3e 70 46 53 2c 20 70  Csr->pDb->pFS, p
c8f0: 53 65 67 2c 20 69 50 67 2c 20 26 70 50 67 29 3b  Seg, iPg, &pPg);
c900: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
c910: 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 70 50 67 3d 3d  =LSM_OK || pPg==
c920: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
c930: 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =LSM_OK ){.     
c940: 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20   u8 *aData;     
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c960: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
c970: 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  g page data */. 
c980: 20 20 20 20 20 69 6e 74 20 6e 44 61 74 61 3b 20       int nData; 
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9a0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 44 61 74   /* Size of aDat
c9b0: 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  a[] in bytes */.
c9c0: 20 20 20 20 20 20 69 6e 74 20 69 4d 69 6e 3b 0a        int iMin;.
c9d0: 20 20 20 20 20 20 69 6e 74 20 69 4d 61 78 3b 0a        int iMax;.
c9e0: 20 20 20 20 20 20 69 6e 74 20 6e 52 65 63 3b 0a        int nRec;.
c9f0: 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b        int flags;
ca00: 0a 0a 20 20 20 20 20 20 61 44 61 74 61 20 3d 20  ..      aData = 
ca10: 66 73 50 61 67 65 44 61 74 61 28 70 50 67 2c 20  fsPageData(pPg, 
ca20: 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 66  &nData);.      f
ca30: 6c 61 67 73 20 3d 20 70 61 67 65 47 65 74 46 6c  lags = pageGetFl
ca40: 61 67 73 28 61 44 61 74 61 2c 20 6e 44 61 74 61  ags(aData, nData
ca50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c  );.      if( (fl
ca60: 61 67 73 20 26 20 53 45 47 4d 45 4e 54 5f 42 54  ags & SEGMENT_BT
ca70: 52 45 45 5f 46 4c 41 47 29 3d 3d 30 20 29 20 62  REE_FLAG)==0 ) b
ca80: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 50 67  reak;..      iPg
ca90: 20 3d 20 70 61 67 65 47 65 74 50 74 72 28 61 44   = pageGetPtr(aD
caa0: 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20  ata, nData);.   
cab0: 20 20 20 6e 52 65 63 20 3d 20 70 61 67 65 47 65     nRec = pageGe
cac0: 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44 61  tNRec(aData, nDa
cad0: 74 61 29 3b 0a 0a 20 20 20 20 20 20 69 4d 69 6e  ta);..      iMin
cae0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 4d 61 78   = 0;.      iMax
caf0: 20 3d 20 6e 52 65 63 2d 31 3b 0a 20 20 20 20 20   = nRec-1;.     
cb00: 20 77 68 69 6c 65 28 20 69 4d 61 78 3e 3d 69 4d   while( iMax>=iM
cb10: 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  in ){.        in
cb20: 74 20 69 54 72 79 20 3d 20 28 69 4d 69 6e 2b 69  t iTry = (iMin+i
cb30: 4d 61 78 29 2f 32 3b 0a 20 20 20 20 20 20 20 20  Max)/2;.        
cb40: 76 6f 69 64 20 2a 70 4b 65 79 54 3b 20 69 6e 74  void *pKeyT; int
cb50: 20 6e 4b 65 79 54 3b 20 20 20 20 20 20 20 2f 2a   nKeyT;       /*
cb60: 20 4b 65 79 20 66 6f 72 20 63 65 6c 6c 20 69 54   Key for cell iT
cb70: 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ry */.        in
cb80: 74 20 69 54 6f 70 69 63 54 3b 20 20 20 20 20 20  t iTopicT;      
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cba0: 6f 70 69 63 20 66 6f 72 20 6b 65 79 20 70 4b 65  opic for key pKe
cbb0: 79 54 2f 6e 4b 65 79 54 20 2a 2f 0a 20 20 20 20  yT/nKeyT */.    
cbc0: 20 20 20 20 50 67 6e 6f 20 69 50 74 72 3b 20 20      Pgno iPtr;  
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbe0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 61 73 73    /* Pointer ass
cbf0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 65 6c  ociated with cel
cc00: 6c 20 69 54 72 79 20 2a 2f 0a 20 20 20 20 20 20  l iTry */.      
cc10: 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20    int res;      
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 2f 2a 20 28 70 4b 65 79 20 2d 20 70 4b 65 79 54  /* (pKey - pKeyT
cc40: 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 72 63  ) */..        rc
cc50: 20 3d 20 70 61 67 65 47 65 74 42 74 72 65 65 4b   = pageGetBtreeK
cc60: 65 79 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey(.            
cc70: 70 53 65 67 2c 20 70 50 67 2c 20 69 54 72 79 2c  pSeg, pPg, iTry,
cc80: 20 26 69 50 74 72 2c 20 26 69 54 6f 70 69 63 54   &iPtr, &iTopicT
cc90: 2c 20 26 70 4b 65 79 54 2c 20 26 6e 4b 65 79 54  , &pKeyT, &nKeyT
cca0: 2c 20 26 62 6c 6f 62 0a 20 20 20 20 20 20 20 20  , &blob.        
ccb0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
ccc0: 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 62 72 65 61  c!=LSM_OK ) brea
ccd0: 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
cce0: 69 46 69 72 73 74 20 26 26 20 70 4b 65 79 54 3d  iFirst && pKeyT=
ccf0: 3d 62 6c 6f 62 2e 70 44 61 74 61 20 29 7b 0a 20  =blob.pData ){. 
cd00: 20 20 20 20 20 20 20 20 20 2a 70 69 46 69 72 73           *piFirs
cd10: 74 20 3d 20 70 61 67 65 47 65 74 42 74 72 65 65  t = pageGetBtree
cd20: 52 65 66 28 70 50 67 2c 20 69 54 72 79 29 3b 0a  Ref(pPg, iTry);.
cd30: 20 20 20 20 20 20 20 20 20 20 70 69 46 69 72 73            piFirs
cd40: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
cd50: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   i++;.        }.
cd60: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73  .        res = s
cd70: 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65 28  ortedKeyCompare(
cd80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73  .            pCs
cd90: 72 2d 3e 70 44 62 2d 3e 78 43 6d 70 2c 20 69 54  r->pDb->xCmp, iT
cda0: 6f 70 69 63 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  opic, pKey, nKey
cdb0: 2c 20 69 54 6f 70 69 63 54 2c 20 70 4b 65 79 54  , iTopicT, pKeyT
cdc0: 2c 20 6e 4b 65 79 54 0a 20 20 20 20 20 20 20 20  , nKeyT.        
cdd0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
cde0: 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  es<0 ){.        
cdf0: 20 20 69 50 67 20 3d 20 69 50 74 72 3b 0a 20 20    iPg = iPtr;.  
ce00: 20 20 20 20 20 20 20 20 69 4d 61 78 20 3d 20 69          iMax = i
ce10: 54 72 79 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  Try-1;.        }
ce20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ce30: 69 4d 69 6e 20 3d 20 69 54 72 79 2b 31 3b 0a 20  iMin = iTry+1;. 
ce40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ce50: 0a 20 20 20 20 20 20 6c 73 6d 46 73 50 61 67 65  .      lsmFsPage
ce60: 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
ce70: 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
ce80: 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d   }.  }while( rc=
ce90: 3d 4c 53 4d 5f 4f 4b 20 29 3b 0a 0a 20 20 73 6f  =LSM_OK );..  so
cea0: 72 74 65 64 42 6c 6f 62 46 72 65 65 28 26 62 6c  rtedBlobFree(&bl
ceb0: 6f 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ob);.  assert( (
cec0: 72 63 3d 3d 4c 53 4d 5f 4f 4b 29 3d 3d 28 70 50  rc==LSM_OK)==(pP
ced0: 67 21 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  g!=0) );.  if( p
cee0: 70 50 67 20 29 7b 0a 20 20 20 20 2a 70 70 50 67  pPg ){.    *ppPg
cef0: 20 3d 20 70 50 67 3b 0a 20 20 7d 65 6c 73 65 7b   = pPg;.  }else{
cf00: 0a 20 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65  .    lsmFsPageRe
cf10: 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
cf20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cf30: 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 49  static int seekI
cf40: 6e 53 65 67 6d 65 6e 74 28 0a 20 20 4d 75 6c 74  nSegment(.  Mult
cf50: 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a  iCursor *pCsr, .
cf60: 20 20 53 65 67 6d 65 6e 74 50 74 72 20 2a 70 50    SegmentPtr *pP
cf70: 74 72 2c 0a 20 20 69 6e 74 20 69 54 6f 70 69 63  tr,.  int iTopic
cf80: 2c 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  ,.  void *pKey, 
cf90: 69 6e 74 20 6e 4b 65 79 2c 0a 20 20 69 6e 74 20  int nKey,.  int 
cfa0: 69 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  iPg,            
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
cfc0: 61 67 65 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  age to search */
cfd0: 0a 20 20 69 6e 74 20 65 53 65 65 6b 2c 20 20 20  .  int eSeek,   
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cff0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 62 69 61     /* Search bia
d000: 73 20 2d 20 73 65 65 20 61 62 6f 76 65 20 2a 2f  s - see above */
d010: 0a 20 20 69 6e 74 20 2a 70 69 50 74 72 2c 20 20  .  int *piPtr,  
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 20 2f 2a 20 4f 55 54 3a 20 46 43 20 70 6f     /* OUT: FC po
d040: 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  inter */.  int *
d050: 70 62 53 74 6f 70 20 20 20 20 20 20 20 20 20 20  pbStop          
d060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
d070: 54 3a 20 53 74 6f 70 20 73 65 61 72 63 68 20 66  T: Stop search f
d080: 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lag */.){.  int 
d090: 69 50 74 72 20 3d 20 69 50 67 3b 0a 20 20 69 6e  iPtr = iPg;.  in
d0a0: 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 0a  t rc = LSM_OK;..
d0b0: 20 20 69 66 28 20 70 50 74 72 2d 3e 70 53 65 67    if( pPtr->pSeg
d0c0: 2d 3e 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 50  ->iRoot ){.    P
d0d0: 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 61 73  age *pPg;.    as
d0e0: 73 65 72 74 28 20 70 50 74 72 2d 3e 70 53 65 67  sert( pPtr->pSeg
d0f0: 2d 3e 69 52 6f 6f 74 21 3d 30 20 29 3b 0a 20 20  ->iRoot!=0 );.  
d100: 20 20 72 63 20 3d 20 73 65 65 6b 49 6e 42 74 72    rc = seekInBtr
d110: 65 65 28 70 43 73 72 2c 20 70 50 74 72 2d 3e 70  ee(pCsr, pPtr->p
d120: 53 65 67 2c 20 69 54 6f 70 69 63 2c 20 70 4b 65  Seg, iTopic, pKe
d130: 79 2c 20 6e 4b 65 79 2c 20 30 2c 20 26 70 50 67  y, nKey, 0, &pPg
d140: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c  );.    if( rc==L
d150: 53 4d 5f 4f 4b 20 29 20 73 65 67 6d 65 6e 74 50  SM_OK ) segmentP
d160: 74 72 53 65 74 50 61 67 65 28 70 50 74 72 2c 20  trSetPage(pPtr, 
d170: 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pPg);.  }else{. 
d180: 20 20 20 69 66 28 20 69 50 74 72 3d 3d 30 20 29     if( iPtr==0 )
d190: 7b 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 70  {.      iPtr = p
d1a0: 50 74 72 2d 3e 70 53 65 67 2d 3e 69 46 69 72 73  Ptr->pSeg->iFirs
d1b0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
d1c0: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
d1d0: 20 20 20 20 20 72 63 20 3d 20 73 65 67 6d 65 6e       rc = segmen
d1e0: 74 50 74 72 4c 6f 61 64 50 61 67 65 28 70 43 73  tPtrLoadPage(pCs
d1f0: 72 2d 3e 70 44 62 2d 3e 70 46 53 2c 20 70 50 74  r->pDb->pFS, pPt
d200: 72 2c 20 69 50 74 72 29 3b 0a 20 20 20 20 7d 0a  r, iPtr);.    }.
d210: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 4c    }..  if( rc==L
d220: 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  SM_OK ){.    rc 
d230: 3d 20 73 65 67 6d 65 6e 74 50 74 72 53 65 65 6b  = segmentPtrSeek
d240: 28 70 43 73 72 2c 20 70 50 74 72 2c 20 69 54 6f  (pCsr, pPtr, iTo
d250: 70 69 63 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  pic, pKey, nKey,
d260: 20 65 53 65 65 6b 2c 20 70 69 50 74 72 2c 20 70   eSeek, piPtr, p
d270: 62 53 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  bStop);.  }.  re
d280: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d290: 2a 20 53 65 65 6b 20 65 61 63 68 20 73 65 67 6d  * Seek each segm
d2a0: 65 6e 74 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  ent pointer in t
d2b0: 68 65 20 61 72 72 61 79 20 6f 66 20 28 70 4c 76  he array of (pLv
d2c0: 6c 2d 3e 6e 52 69 67 68 74 2b 31 29 20 61 74 20  l->nRight+1) at 
d2d0: 61 50 74 72 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 70 62  aPtr[]..**.** pb
d2e0: 53 74 6f 70 3a 0a 2a 2a 20 20 20 54 68 69 73 20  Stop:.**   This 
d2f0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e 6c  parameter is onl
d300: 79 20 73 69 67 6e 69 66 69 63 61 6e 74 20 69 66  y significant if
d310: 20 70 61 72 61 6d 65 74 65 72 20 65 53 65 65 6b   parameter eSeek
d320: 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20   is set to.**   
d330: 4c 53 4d 5f 53 45 45 4b 5f 45 51 2e 20 49 6e 20  LSM_SEEK_EQ. In 
d340: 74 68 69 73 20 63 61 73 65 2c 20 69 74 20 69 73  this case, it is
d350: 20 73 65 74 20 74 6f 20 74 72 75 65 20 62 65 66   set to true bef
d360: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66  ore returning if
d370: 0a 2a 2a 20 20 20 74 68 65 20 73 65 65 6b 20 6f  .**   the seek o
d380: 70 65 72 61 74 69 6f 6e 20 69 73 20 66 69 6e 69  peration is fini
d390: 73 68 65 64 2e 20 54 68 69 73 20 63 61 6e 20 68  shed. This can h
d3a0: 61 70 70 65 6e 20 69 6e 20 74 77 6f 20 77 61 79  appen in two way
d3b0: 73 3a 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 20 20  s:.**   .**     
d3c0: 61 29 20 41 20 6b 65 79 20 6d 61 74 63 68 69 6e  a) A key matchin
d3d0: 67 20 28 70 4b 65 79 2f 6e 4b 65 79 29 20 69 73  g (pKey/nKey) is
d3e0: 20 66 6f 75 6e 64 2c 20 6f 72 0a 2a 2a 20 20 20   found, or.**   
d3f0: 20 20 62 29 20 41 20 70 6f 69 6e 74 2d 64 65 6c    b) A point-del
d400: 65 74 65 20 6f 72 20 72 61 6e 67 65 2d 64 65 6c  ete or range-del
d410: 65 74 65 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ete deleting the
d420: 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 0a 2a   key is found..*
d430: 2a 0a 2a 2a 20 20 20 49 6e 20 63 61 73 65 20 28  *.**   In case (
d440: 61 29 2c 20 74 68 65 20 6d 75 6c 74 69 2d 63 75  a), the multi-cu
d450: 72 73 6f 72 20 43 55 52 53 4f 52 5f 53 45 45 4b  rsor CURSOR_SEEK
d460: 5f 45 51 20 66 6c 61 67 20 69 73 20 73 65 74 20  _EQ flag is set 
d470: 61 6e 64 20 74 68 65 20 70 43 73 72 2d 3e 6b 65  and the pCsr->ke
d480: 79 0a 2a 2a 20 20 20 61 6e 64 20 70 43 73 72 2d  y.**   and pCsr-
d490: 3e 76 61 6c 20 62 6c 6f 62 73 20 70 6f 70 75 6c  >val blobs popul
d4a0: 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ated before retu
d4b0: 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
d4c0: 20 69 6e 74 20 73 65 65 6b 49 6e 4c 65 76 65 6c   int seekInLevel
d4d0: 28 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20  (.  MultiCursor 
d4e0: 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
d4f0: 20 20 20 20 2f 2a 20 53 6f 72 74 65 64 20 63 75      /* Sorted cu
d500: 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20 73  rsor object to s
d510: 65 65 6b 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74  eek */.  Segment
d520: 50 74 72 20 2a 61 50 74 72 2c 20 20 20 20 20 20  Ptr *aPtr,      
d530: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
d540: 74 65 72 20 74 6f 20 61 72 72 61 79 20 6f 66 20  ter to array of 
d550: 28 6e 52 68 73 2b 31 29 20 53 50 73 20 2a 2f 0a  (nRhs+1) SPs */.
d560: 20 20 69 6e 74 20 65 53 65 65 6b 2c 20 20 20 20    int eSeek,    
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 2f 2a 20 53 65 61 72 63 68 20 62 69 61 73    /* Search bias
d590: 20 2d 20 73 65 65 20 61 62 6f 76 65 20 2a 2f 0a   - see above */.
d5a0: 20 20 69 6e 74 20 69 54 6f 70 69 63 2c 20 20 20    int iTopic,   
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5c0: 20 20 2f 2a 20 4b 65 79 20 74 6f 70 69 63 20 74    /* Key topic t
d5d0: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a  o search for */.
d5e0: 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e    void *pKey, in
d5f0: 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
d600: 20 20 2f 2a 20 4b 65 79 20 74 6f 20 73 65 61 72    /* Key to sear
d610: 63 68 20 66 6f 72 20 2a 2f 0a 20 20 50 67 6e 6f  ch for */.  Pgno
d620: 20 2a 70 69 50 67 6e 6f 2c 20 20 20 20 20 20 20   *piPgno,       
d630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d640: 4e 2f 4f 55 54 3a 20 66 72 61 63 74 69 6f 6e 20  N/OUT: fraction 
d650: 63 61 73 63 61 64 65 20 70 6f 69 6e 74 65 72 20  cascade pointer 
d660: 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20  (or 0) */.  int 
d670: 2a 70 62 53 74 6f 70 20 20 20 20 20 20 20 20 20  *pbStop         
d680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d690: 55 54 3a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f  UT: See above */
d6a0: 0a 29 7b 0a 20 20 4c 65 76 65 6c 20 2a 70 4c 76  .){.  Level *pLv
d6b0: 6c 20 3d 20 61 50 74 72 5b 30 5d 2e 70 4c 65 76  l = aPtr[0].pLev
d6c0: 65 6c 3b 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74  el;   /* Level t
d6d0: 6f 20 73 65 65 6b 20 77 69 74 68 69 6e 20 2a 2f  o seek within */
d6e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f  .  int rc = LSM_
d6f0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
d700: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
d710: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 75 74 20  e */.  int iOut 
d720: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
d730: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
d740: 72 20 74 6f 20 72 65 74 75 72 6e 20 74 6f 20 63  r to return to c
d750: 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  aller */.  int r
d760: 65 73 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  es = -1;        
d770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d780: 73 75 6c 74 20 6f 66 20 78 43 6d 70 28 70 4b 65  sult of xCmp(pKe
d790: 79 2c 20 73 70 6c 69 74 29 20 2a 2f 0a 20 20 69  y, split) */.  i
d7a0: 6e 74 20 6e 52 68 73 20 3d 20 70 4c 76 6c 2d 3e  nt nRhs = pLvl->
d7b0: 6e 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 2f  nRight;        /
d7c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 69 67 68  * Number of righ
d7d0: 74 2d 68 61 6e 64 2d 73 69 64 65 20 73 65 67 6d  t-hand-side segm
d7e0: 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 62 53  ents */.  int bS
d7f0: 74 6f 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  top = 0;..  /* I
d800: 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 70  f this is a comp
d810: 6f 73 69 74 65 20 6c 65 76 65 6c 20 28 6f 6e 65  osite level (one
d820: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
d830: 67 6f 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  going an increme
d840: 6e 74 61 6c 0a 20 20 2a 2a 20 6d 65 72 67 65 29  ntal.  ** merge)
d850: 2c 20 66 69 67 75 72 65 20 6f 75 74 20 69 66 20  , figure out if 
d860: 74 68 65 20 73 65 61 72 63 68 20 6b 65 79 20 69  the search key i
d870: 73 20 6c 61 72 67 65 72 20 6f 72 20 73 6d 61 6c  s larger or smal
d880: 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a  ler than the.  *
d890: 2a 20 6c 65 76 65 6c 73 20 73 70 6c 69 74 2d 6b  * levels split-k
d8a0: 65 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 52  ey.  */.  if( nR
d8b0: 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
d8c0: 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65  sortedKeyCompare
d8d0: 28 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70  (pCsr->pDb->xCmp
d8e0: 2c 20 69 54 6f 70 69 63 2c 20 70 4b 65 79 2c 20  , iTopic, pKey, 
d8f0: 6e 4b 65 79 2c 20 0a 20 20 20 20 20 20 20 20 70  nKey, .        p
d900: 4c 76 6c 2d 3e 69 53 70 6c 69 74 54 6f 70 69 63  Lvl->iSplitTopic
d910: 2c 20 70 4c 76 6c 2d 3e 70 53 70 6c 69 74 4b 65  , pLvl->pSplitKe
d920: 79 2c 20 70 4c 76 6c 2d 3e 6e 53 70 6c 69 74 4b  y, pLvl->nSplitK
d930: 65 79 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20  ey.    );.  }.. 
d940: 20 2f 2a 20 49 66 20 28 72 65 73 3c 30 29 2c 20   /* If (res<0), 
d950: 74 68 65 6e 20 6b 65 79 20 70 4b 65 79 2f 6e 4b  then key pKey/nK
d960: 65 79 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ey is smaller th
d970: 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79  an the split-key
d980: 20 28 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 69   (or this.  ** i
d990: 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 73 69 74  s not a composit
d9a0: 65 20 6c 65 76 65 6c 20 61 6e 64 20 74 68 65 72  e level and ther
d9b0: 65 20 69 73 20 6e 6f 20 73 70 6c 69 74 2d 6b 65  e is no split-ke
d9c0: 79 29 2e 20 53 65 61 72 63 68 20 74 68 65 20 0a  y). Search the .
d9d0: 20 20 2a 2a 20 6c 65 66 74 2d 68 61 6e 64 2d 73    ** left-hand-s
d9e0: 69 64 65 20 6f 66 20 74 68 65 20 6c 65 76 65 6c  ide of the level
d9f0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
da00: 2a 2f 0a 20 20 69 66 28 20 72 65 73 3c 30 20 29  */.  if( res<0 )
da10: 7b 0a 20 20 20 20 69 6e 74 20 69 50 74 72 20 3d  {.    int iPtr =
da20: 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 52 68 73   0;.    if( nRhs
da30: 3d 3d 30 20 29 20 69 50 74 72 20 3d 20 2a 70 69  ==0 ) iPtr = *pi
da40: 50 67 6e 6f 3b 0a 0a 20 20 20 20 72 63 20 3d 20  Pgno;..    rc = 
da50: 73 65 65 6b 49 6e 53 65 67 6d 65 6e 74 28 0a 20  seekInSegment(. 
da60: 20 20 20 20 20 20 20 70 43 73 72 2c 20 26 61 50         pCsr, &aP
da70: 74 72 5b 30 5d 2c 20 69 54 6f 70 69 63 2c 20 70  tr[0], iTopic, p
da80: 4b 65 79 2c 20 6e 4b 65 79 2c 20 69 50 74 72 2c  Key, nKey, iPtr,
da90: 20 65 53 65 65 6b 2c 20 26 69 4f 75 74 2c 20 26   eSeek, &iOut, &
daa0: 62 53 74 6f 70 0a 20 20 20 20 29 3b 0a 20 20 20  bStop.    );.   
dab0: 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
dac0: 26 26 20 6e 52 68 73 3e 30 20 26 26 20 65 53 65  && nRhs>0 && eSe
dad0: 65 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 47 45 20  ek==LSM_SEEK_GE 
dae0: 26 26 20 61 50 74 72 5b 30 5d 2e 70 50 67 3d 3d  && aPtr[0].pPg==
daf0: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  0 ){.      res =
db00: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
db10: 0a 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 7b  .  if( res>=0 ){
db20: 0a 20 20 20 20 69 6e 74 20 62 48 69 74 20 3d 20  .    int bHit = 
db30: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
db40: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 74     /* True if at
db50: 20 6c 65 61 73 74 20 6f 6e 65 20 72 68 73 20 69   least one rhs i
db60: 73 20 6e 6f 74 20 45 4f 46 20 2a 2f 0a 20 20 20  s not EOF */.   
db70: 20 69 6e 74 20 69 50 74 72 20 3d 20 2a 70 69 50   int iPtr = *piP
db80: 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  gno;.    int i;.
db90: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d      for(i=1; rc=
dba0: 3d 4c 53 4d 5f 4f 4b 20 26 26 20 69 3c 3d 6e 52  =LSM_OK && i<=nR
dbb0: 68 73 20 26 26 20 62 53 74 6f 70 3d 3d 30 3b 20  hs && bStop==0; 
dbc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 53 65 67 6d  i++){.      Segm
dbd0: 65 6e 74 50 74 72 20 2a 70 50 74 72 20 3d 20 26  entPtr *pPtr = &
dbe0: 61 50 74 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69  aPtr[i];.      i
dbf0: 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Out = 0;.      r
dc00: 63 20 3d 20 73 65 65 6b 49 6e 53 65 67 6d 65 6e  c = seekInSegmen
dc10: 74 28 0a 20 20 20 20 20 20 20 20 20 20 70 43 73  t(.          pCs
dc20: 72 2c 20 70 50 74 72 2c 20 69 54 6f 70 69 63 2c  r, pPtr, iTopic,
dc30: 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 69 50 74   pKey, nKey, iPt
dc40: 72 2c 20 65 53 65 65 6b 2c 20 26 69 4f 75 74 2c  r, eSeek, &iOut,
dc50: 20 26 62 53 74 6f 70 0a 20 20 20 20 20 20 29 3b   &bStop.      );
dc60: 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 4f  .      iPtr = iO
dc70: 75 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  ut;..      /* If
dc80: 20 74 68 65 20 73 65 67 6d 65 6e 74 2d 70 6f 69   the segment-poi
dc90: 6e 74 65 72 20 68 61 73 20 73 65 74 74 6c 65 64  nter has settled
dca0: 20 6f 6e 20 61 20 6b 65 79 20 74 68 61 74 20 69   on a key that i
dcb0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 0a 20  s smaller than. 
dcc0: 20 20 20 20 20 2a 2a 20 74 68 65 20 73 70 6c 69       ** the spli
dcd0: 74 6b 65 79 2c 20 69 6e 76 61 6c 69 64 61 74 65  tkey, invalidate
dce0: 20 74 68 65 20 73 65 67 6d 65 6e 74 2d 70 6f 69   the segment-poi
dcf0: 6e 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  nter.  */.      
dd00: 69 66 28 20 70 50 74 72 2d 3e 70 50 67 20 29 7b  if( pPtr->pPg ){
dd10: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73  .        res = s
dd20: 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65 28  ortedKeyCompare(
dd30: 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70 2c  pCsr->pDb->xCmp,
dd40: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 74   .            rt
dd50: 54 6f 70 69 63 28 70 50 74 72 2d 3e 65 54 79 70  Topic(pPtr->eTyp
dd60: 65 29 2c 20 70 50 74 72 2d 3e 70 4b 65 79 2c 20  e), pPtr->pKey, 
dd70: 70 50 74 72 2d 3e 6e 4b 65 79 2c 20 0a 20 20 20  pPtr->nKey, .   
dd80: 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69           pLvl->i
dd90: 53 70 6c 69 74 54 6f 70 69 63 2c 20 70 4c 76 6c  SplitTopic, pLvl
dda0: 2d 3e 70 53 70 6c 69 74 4b 65 79 2c 20 70 4c 76  ->pSplitKey, pLv
ddb0: 6c 2d 3e 6e 53 70 6c 69 74 4b 65 79 0a 20 20 20  l->nSplitKey.   
ddc0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
ddd0: 69 66 28 20 72 65 73 3c 30 20 29 20 73 65 67 6d  if( res<0 ) segm
dde0: 65 6e 74 50 74 72 52 65 73 65 74 28 70 50 74 72  entPtrReset(pPtr
ddf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
de00: 20 20 69 66 28 20 61 50 74 72 5b 69 5d 2e 70 4b    if( aPtr[i].pK
de10: 65 79 20 29 20 62 48 69 74 20 3d 20 31 3b 0a 20  ey ) bHit = 1;. 
de20: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
de30: 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 65 53 65 65  ==LSM_OK && eSee
de40: 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 4c 45 20 26  k==LSM_SEEK_LE &
de50: 26 20 62 48 69 74 3d 3d 30 20 29 7b 0a 20 20 20  & bHit==0 ){.   
de60: 20 20 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50     rc = segmentP
de70: 74 72 45 6e 64 28 70 43 73 72 2c 20 26 61 50 74  trEnd(pCsr, &aPt
de80: 72 5b 30 5d 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  r[0], 1);.    }.
de90: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 65    }..  assert( e
dea0: 53 65 65 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 45  Seek==LSM_SEEK_E
deb0: 51 20 7c 7c 20 62 53 74 6f 70 3d 3d 30 20 29 3b  Q || bStop==0 );
dec0: 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20 69 4f 75  .  *piPgno = iOu
ded0: 74 3b 0a 20 20 2a 70 62 53 74 6f 70 20 3d 20 62  t;.  *pbStop = b
dee0: 53 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 72  Stop;.  return r
def0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  c;.}..static voi
df00: 64 20 6d 75 6c 74 69 43 75 72 73 6f 72 47 65 74  d multiCursorGet
df10: 4b 65 79 28 0a 20 20 4d 75 6c 74 69 43 75 72 73  Key(.  MultiCurs
df20: 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20 69 6e 74  or *pCsr, .  int
df30: 20 69 4b 65 79 2c 0a 20 20 69 6e 74 20 2a 70 65   iKey,.  int *pe
df40: 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
df50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
df60: 20 4b 65 79 20 74 79 70 65 20 28 53 4f 52 54 45   Key type (SORTE
df70: 44 5f 57 52 49 54 45 20 65 74 63 2e 29 20 2a 2f  D_WRITE etc.) */
df80: 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4b 65 79 2c  .  void **ppKey,
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfa0: 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74     /* OUT: Point
dfb0: 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
dfc0: 74 61 69 6e 69 6e 67 20 6b 65 79 20 2a 2f 0a 20  taining key */. 
dfd0: 20 69 6e 74 20 2a 70 6e 4b 65 79 20 20 20 20 20   int *pnKey     
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
e000: 20 2a 70 70 4b 65 79 20 69 6e 20 62 79 74 65 73   *ppKey in bytes
e010: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65   */.){.  int nKe
e020: 79 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 70  y = 0;.  void *p
e030: 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65  Key = 0;.  int e
e040: 54 79 70 65 20 3d 20 30 3b 0a 0a 20 20 73 77 69  Type = 0;..  swi
e050: 74 63 68 28 20 69 4b 65 79 20 29 7b 0a 20 20 20  tch( iKey ){.   
e060: 20 63 61 73 65 20 43 55 52 53 4f 52 5f 44 41 54   case CURSOR_DAT
e070: 41 5f 54 52 45 45 30 3a 0a 20 20 20 20 63 61 73  A_TREE0:.    cas
e080: 65 20 43 55 52 53 4f 52 5f 44 41 54 41 5f 54 52  e CURSOR_DATA_TR
e090: 45 45 31 3a 20 7b 0a 20 20 20 20 20 20 54 72 65  EE1: {.      Tre
e0a0: 65 43 75 72 73 6f 72 20 2a 70 54 72 65 65 43 73  eCursor *pTreeCs
e0b0: 72 20 3d 20 70 43 73 72 2d 3e 61 70 54 72 65 65  r = pCsr->apTree
e0c0: 43 73 72 5b 69 4b 65 79 2d 43 55 52 53 4f 52 5f  Csr[iKey-CURSOR_
e0d0: 44 41 54 41 5f 54 52 45 45 30 5d 3b 0a 20 20 20  DATA_TREE0];.   
e0e0: 20 20 20 69 66 28 20 6c 73 6d 54 72 65 65 43 75     if( lsmTreeCu
e0f0: 72 73 6f 72 56 61 6c 69 64 28 70 54 72 65 65 43  rsorValid(pTreeC
e100: 73 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  sr) ){.        l
e110: 73 6d 54 72 65 65 43 75 72 73 6f 72 4b 65 79 28  smTreeCursorKey(
e120: 70 54 72 65 65 43 73 72 2c 20 26 65 54 79 70 65  pTreeCsr, &eType
e130: 2c 20 26 70 4b 65 79 2c 20 26 6e 4b 65 79 29 3b  , &pKey, &nKey);
e140: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e150: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
e160: 20 63 61 73 65 20 43 55 52 53 4f 52 5f 44 41 54   case CURSOR_DAT
e170: 41 5f 53 59 53 54 45 4d 3a 20 7b 0a 20 20 20 20  A_SYSTEM: {.    
e180: 20 20 53 6e 61 70 73 68 6f 74 20 2a 70 57 6f 72    Snapshot *pWor
e190: 6b 65 72 20 3d 20 70 43 73 72 2d 3e 70 44 62 2d  ker = pCsr->pDb-
e1a0: 3e 70 57 6f 72 6b 65 72 3b 0a 20 20 20 20 20 20  >pWorker;.      
e1b0: 69 66 28 20 70 57 6f 72 6b 65 72 20 26 26 20 28  if( pWorker && (
e1c0: 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 43 55  pCsr->flags & CU
e1d0: 52 53 4f 52 5f 46 4c 55 53 48 5f 46 52 45 45 4c  RSOR_FLUSH_FREEL
e1e0: 49 53 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IST) ){.        
e1f0: 69 6e 74 20 6e 45 6e 74 72 79 20 3d 20 70 57 6f  int nEntry = pWo
e200: 72 6b 65 72 2d 3e 66 72 65 65 6c 69 73 74 2e 6e  rker->freelist.n
e210: 45 6e 74 72 79 3b 0a 20 20 20 20 20 20 20 20 69  Entry;.        i
e220: 66 28 20 70 43 73 72 2d 3e 69 46 72 65 65 20 3c  f( pCsr->iFree <
e230: 20 28 6e 45 6e 74 72 79 2a 32 29 20 29 7b 0a 20   (nEntry*2) ){. 
e240: 20 20 20 20 20 20 20 20 20 46 72 65 65 6c 69 73           Freelis
e250: 74 45 6e 74 72 79 20 2a 61 45 6e 74 72 79 20 3d  tEntry *aEntry =
e260: 20 70 57 6f 72 6b 65 72 2d 3e 66 72 65 65 6c 69   pWorker->freeli
e270: 73 74 2e 61 45 6e 74 72 79 3b 0a 20 20 20 20 20  st.aEntry;.     
e280: 20 20 20 20 20 69 6e 74 20 69 20 3d 20 6e 45 6e       int i = nEn
e290: 74 72 79 20 2d 20 31 20 2d 20 28 70 43 73 72 2d  try - 1 - (pCsr-
e2a0: 3e 69 46 72 65 65 20 2f 20 32 29 3b 0a 20 20 20  >iFree / 2);.   
e2b0: 20 20 20 20 20 20 20 75 33 32 20 69 4b 65 79 20         u32 iKey 
e2c0: 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 0;..          
e2d0: 69 66 28 20 28 70 43 73 72 2d 3e 69 46 72 65 65  if( (pCsr->iFree
e2e0: 20 25 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   % 2) ){.       
e2f0: 20 20 20 20 20 65 54 79 70 65 20 3d 20 4c 53 4d       eType = LSM
e300: 5f 45 4e 44 5f 44 45 4c 45 54 45 7c 4c 53 4d 5f  _END_DELETE|LSM_
e310: 53 59 53 54 45 4d 4b 45 59 3b 0a 20 20 20 20 20  SYSTEMKEY;.     
e320: 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 61 45         iKey = aE
e330: 6e 74 72 79 5b 69 5d 2e 69 42 6c 6b 2d 31 3b 0a  ntry[i].iBlk-1;.
e340: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
e350: 69 66 28 20 61 45 6e 74 72 79 5b 69 5d 2e 69 49  if( aEntry[i].iI
e360: 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d>=0 ){.        
e370: 20 20 20 20 65 54 79 70 65 20 3d 20 4c 53 4d 5f      eType = LSM_
e380: 49 4e 53 45 52 54 7c 4c 53 4d 5f 53 59 53 54 45  INSERT|LSM_SYSTE
e390: 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20  MKEY;.          
e3a0: 20 20 69 4b 65 79 20 3d 20 61 45 6e 74 72 79 5b    iKey = aEntry[
e3b0: 69 5d 2e 69 42 6c 6b 3b 0a 0a 20 20 20 20 20 20  i].iBlk;..      
e3c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
e3d0: 69 6e 2d 6d 65 6d 6f 72 79 20 65 6e 74 72 79 20  in-memory entry 
e3e0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 66 6f  immediately befo
e3f0: 72 65 20 74 68 69 73 20 6f 6e 65 20 77 61 73 20  re this one was 
e400: 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  a.             *
e410: 2a 20 44 45 4c 45 54 45 2c 20 61 6e 64 20 74 68  * DELETE, and th
e420: 65 20 62 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 69  e block number i
e430: 73 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68  s one greater th
e440: 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  an the current. 
e450: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
e460: 6c 6f 63 6b 20 6e 75 6d 62 65 72 2c 20 6d 61 72  lock number, mar
e470: 6b 20 74 68 69 73 20 65 6e 74 72 79 20 61 73 20  k this entry as 
e480: 61 6e 20 22 65 6e 64 2d 64 65 6c 65 74 65 2d 72  an "end-delete-r
e490: 61 6e 67 65 22 2e 20 2a 2f 0a 20 20 20 20 20 20  ange". */.      
e4a0: 20 20 20 20 20 20 69 66 28 20 69 3c 28 6e 45 6e        if( i<(nEn
e4b0: 74 72 79 2d 31 29 20 26 26 20 61 45 6e 74 72 79  try-1) && aEntry
e4c0: 5b 69 2b 31 5d 2e 69 42 6c 6b 3d 3d 69 4b 65 79  [i+1].iBlk==iKey
e4d0: 2b 31 20 26 26 20 61 45 6e 74 72 79 5b 69 2b 31  +1 && aEntry[i+1
e4e0: 5d 2e 69 49 64 3c 30 20 29 7b 0a 20 20 20 20 20  ].iId<0 ){.     
e4f0: 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20 7c           eType |
e500: 3d 20 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45 54 45  = LSM_END_DELETE
e510: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
e520: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
e530: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 54  {.            eT
e540: 79 70 65 20 3d 20 4c 53 4d 5f 53 54 41 52 54 5f  ype = LSM_START_
e550: 44 45 4c 45 54 45 7c 4c 53 4d 5f 53 59 53 54 45  DELETE|LSM_SYSTE
e560: 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20  MKEY;.          
e570: 20 20 69 4b 65 79 20 3d 20 61 45 6e 74 72 79 5b    iKey = aEntry[
e580: 69 5d 2e 69 42 6c 6b 20 2b 20 31 3b 0a 20 20 20  i].iBlk + 1;.   
e590: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
e5a0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
e5b0: 2d 6d 65 6d 6f 72 79 20 65 6e 74 72 79 20 69 6d  -memory entry im
e5c0: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
e5d0: 74 68 69 73 20 6f 6e 65 20 69 73 20 61 0a 20 20  this one is a.  
e5e0: 20 20 20 20 20 20 20 20 2a 2a 20 44 45 4c 45 54          ** DELET
e5f0: 45 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 63 6b  E, and the block
e600: 20 6e 75 6d 62 65 72 20 69 73 20 6f 6e 65 20 6c   number is one l
e610: 65 73 73 20 74 68 61 6e 20 74 68 65 20 63 75 72  ess than the cur
e620: 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  rent.          *
e630: 2a 20 6b 65 79 2c 20 6d 61 72 6b 20 74 68 69 73  * key, mark this
e640: 20 65 6e 74 72 79 20 61 73 20 61 6e 20 22 73 74   entry as an "st
e650: 61 72 74 2d 64 65 6c 65 74 65 2d 72 61 6e 67 65  art-delete-range
e660: 22 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ".  */.         
e670: 20 69 66 28 20 69 3e 30 20 26 26 20 61 45 6e 74   if( i>0 && aEnt
e680: 72 79 5b 69 2d 31 5d 2e 69 42 6c 6b 3d 3d 69 4b  ry[i-1].iBlk==iK
e690: 65 79 2d 31 20 26 26 20 61 45 6e 74 72 79 5b 69  ey-1 && aEntry[i
e6a0: 2d 31 5d 2e 69 49 64 3c 30 20 29 7b 0a 20 20 20  -1].iId<0 ){.   
e6b0: 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20 7c           eType |
e6c0: 3d 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45  = LSM_START_DELE
e6d0: 54 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  TE;.          }.
e6e0: 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 20  .          pKey 
e6f0: 3d 20 70 43 73 72 2d 3e 70 53 79 73 74 65 6d 56  = pCsr->pSystemV
e700: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4b  al;.          nK
e710: 65 79 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  ey = 4;.        
e720: 20 20 6c 73 6d 50 75 74 55 33 32 28 70 4b 65 79    lsmPutU32(pKey
e730: 2c 20 7e 69 4b 65 79 29 3b 0a 20 20 20 20 20 20  , ~iKey);.      
e740: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e750: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
e760: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
e770: 20 20 20 20 20 69 6e 74 20 69 50 74 72 20 3d 20       int iPtr = 
e780: 69 4b 65 79 20 2d 20 43 55 52 53 4f 52 5f 44 41  iKey - CURSOR_DA
e790: 54 41 5f 53 45 47 4d 45 4e 54 3b 0a 20 20 20 20  TA_SEGMENT;.    
e7a0: 20 20 61 73 73 65 72 74 28 20 69 50 74 72 3e 3d    assert( iPtr>=
e7b0: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  0 );.      if( i
e7c0: 50 74 72 3d 3d 70 43 73 72 2d 3e 6e 50 74 72 20  Ptr==pCsr->nPtr 
e7d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
e7e0: 43 73 72 2d 3e 70 42 74 43 73 72 20 29 7b 0a 20  Csr->pBtCsr ){. 
e7f0: 20 20 20 20 20 20 20 20 20 70 4b 65 79 20 3d 20           pKey = 
e800: 70 43 73 72 2d 3e 70 42 74 43 73 72 2d 3e 70 4b  pCsr->pBtCsr->pK
e810: 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4b  ey;.          nK
e820: 65 79 20 3d 20 70 43 73 72 2d 3e 70 42 74 43 73  ey = pCsr->pBtCs
e830: 72 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  r->nKey;.       
e840: 20 20 20 65 54 79 70 65 20 3d 20 70 43 73 72 2d     eType = pCsr-
e850: 3e 70 42 74 43 73 72 2d 3e 65 54 79 70 65 3b 0a  >pBtCsr->eType;.
e860: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e870: 7d 65 6c 73 65 20 69 66 28 20 69 50 74 72 3c 70  }else if( iPtr<p
e880: 43 73 72 2d 3e 6e 50 74 72 20 29 7b 0a 20 20 20  Csr->nPtr ){.   
e890: 20 20 20 20 20 53 65 67 6d 65 6e 74 50 74 72 20       SegmentPtr 
e8a0: 2a 70 50 74 72 20 3d 20 26 70 43 73 72 2d 3e 61  *pPtr = &pCsr->a
e8b0: 50 74 72 5b 69 50 74 72 5d 3b 0a 20 20 20 20 20  Ptr[iPtr];.     
e8c0: 20 20 20 69 66 28 20 70 50 74 72 2d 3e 70 50 67     if( pPtr->pPg
e8d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4b   ){.          pK
e8e0: 65 79 20 3d 20 70 50 74 72 2d 3e 70 4b 65 79 3b  ey = pPtr->pKey;
e8f0: 0a 20 20 20 20 20 20 20 20 20 20 6e 4b 65 79 20  .          nKey 
e900: 3d 20 70 50 74 72 2d 3e 6e 4b 65 79 3b 0a 20 20  = pPtr->nKey;.  
e910: 20 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20          eType = 
e920: 70 50 74 72 2d 3e 65 54 79 70 65 3b 0a 20 20 20  pPtr->eType;.   
e930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e940: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e950: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 65 54  }.  }..  if( peT
e960: 79 70 65 20 29 20 2a 70 65 54 79 70 65 20 3d 20  ype ) *peType = 
e970: 65 54 79 70 65 3b 0a 20 20 69 66 28 20 70 6e 4b  eType;.  if( pnK
e980: 65 79 20 29 20 2a 70 6e 4b 65 79 20 3d 20 6e 4b  ey ) *pnKey = nK
e990: 65 79 3b 0a 20 20 69 66 28 20 70 70 4b 65 79 20  ey;.  if( ppKey 
e9a0: 29 20 2a 70 70 4b 65 79 20 3d 20 70 4b 65 79 3b  ) *ppKey = pKey;
e9b0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .}..static int s
e9c0: 6f 72 74 65 64 44 62 4b 65 79 43 6f 6d 70 61 72  ortedDbKeyCompar
e9d0: 65 28 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72  e(.  MultiCursor
e9e0: 20 2a 70 43 73 72 2c 0a 20 20 69 6e 74 20 69 4c   *pCsr,.  int iL
e9f0: 68 73 46 6c 61 67 73 2c 20 76 6f 69 64 20 2a 70  hsFlags, void *p
ea00: 4c 68 73 4b 65 79 2c 20 69 6e 74 20 6e 4c 68 73  LhsKey, int nLhs
ea10: 4b 65 79 2c 0a 20 20 69 6e 74 20 69 52 68 73 46  Key,.  int iRhsF
ea20: 6c 61 67 73 2c 20 76 6f 69 64 20 2a 70 52 68 73  lags, void *pRhs
ea30: 4b 65 79 2c 20 69 6e 74 20 6e 52 68 73 4b 65 79  Key, int nRhsKey
ea40: 0a 29 7b 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70  .){.  int (*xCmp
ea50: 29 28 76 6f 69 64 20 2a 2c 20 69 6e 74 2c 20 76  )(void *, int, v
ea60: 6f 69 64 20 2a 2c 20 69 6e 74 29 20 3d 20 70 43  oid *, int) = pC
ea70: 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70 3b 0a 20  sr->pDb->xCmp;. 
ea80: 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 2f 2a 20   int res;..  /* 
ea90: 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 73  Compare the keys
eaa0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
eab0: 73 79 73 74 65 6d 20 66 6c 61 67 2e 20 2a 2f 0a  system flag. */.
eac0: 20 20 72 65 73 20 3d 20 73 6f 72 74 65 64 4b 65    res = sortedKe
ead0: 79 43 6f 6d 70 61 72 65 28 78 43 6d 70 2c 20 0a  yCompare(xCmp, .
eae0: 20 20 20 20 72 74 54 6f 70 69 63 28 69 4c 68 73      rtTopic(iLhs
eaf0: 46 6c 61 67 73 29 2c 20 70 4c 68 73 4b 65 79 2c  Flags), pLhsKey,
eb00: 20 6e 4c 68 73 4b 65 79 2c 0a 20 20 20 20 72 74   nLhsKey,.    rt
eb10: 54 6f 70 69 63 28 69 52 68 73 46 6c 61 67 73 29  Topic(iRhsFlags)
eb20: 2c 20 70 52 68 73 4b 65 79 2c 20 6e 52 68 73 4b  , pRhsKey, nRhsK
eb30: 65 79 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ey.  );..  /* If
eb40: 20 61 20 6b 65 79 20 68 61 73 20 74 68 65 20 4c   a key has the L
eb50: 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54 45 20  SM_START_DELETE 
eb60: 66 6c 61 67 20 73 65 74 2c 20 62 75 74 20 6e 6f  flag set, but no
eb70: 74 20 74 68 65 20 4c 53 4d 5f 49 4e 53 45 52 54  t the LSM_INSERT
eb80: 20 6f 72 0a 20 20 2a 2a 20 4c 53 4d 5f 50 4f 49   or.  ** LSM_POI
eb90: 4e 54 5f 44 45 4c 45 54 45 20 66 6c 61 67 73 2c  NT_DELETE flags,
eba0: 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65   it is considere
ebb0: 64 20 61 20 64 65 6c 74 61 20 6c 61 72 67 65 72  d a delta larger
ebc0: 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 0a  . This prevents.
ebd0: 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69    ** the beginni
ebe0: 6e 67 20 6f 66 20 61 6e 20 6f 70 65 6e 2d 65 6e  ng of an open-en
ebf0: 64 65 64 20 73 65 74 20 66 72 6f 6d 20 6d 61 73  ded set from mas
ec00: 6b 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  king a database 
ec10: 65 6e 74 72 79 20 6f 72 0a 20 20 2a 2a 20 64 65  entry or.  ** de
ec20: 6c 65 74 65 20 61 74 20 61 20 6c 6f 77 65 72 20  lete at a lower 
ec30: 6c 65 76 65 6c 2e 20 20 2a 2f 0a 20 20 69 66 28  level.  */.  if(
ec40: 20 72 65 73 3d 3d 30 20 26 26 20 28 70 43 73 72   res==0 && (pCsr
ec50: 2d 3e 66 6c 61 67 73 20 26 20 43 55 52 53 4f 52  ->flags & CURSOR
ec60: 5f 49 47 4e 4f 52 45 5f 44 45 4c 45 54 45 29 20  _IGNORE_DELETE) 
ec70: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
ec80: 20 6d 20 3d 20 4c 53 4d 5f 50 4f 49 4e 54 5f 44   m = LSM_POINT_D
ec90: 45 4c 45 54 45 7c 4c 53 4d 5f 49 4e 53 45 52 54  ELETE|LSM_INSERT
eca0: 7c 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45 54 45 20  |LSM_END_DELETE 
ecb0: 7c 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54  |LSM_START_DELET
ecc0: 45 3b 0a 20 20 20 20 69 6e 74 20 69 44 65 6c 31  E;.    int iDel1
ecd0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 44   = 0;.    int iD
ece0: 65 6c 32 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  el2 = 0;..    if
ecf0: 28 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45  ( LSM_START_DELE
ed00: 54 45 3d 3d 28 69 4c 68 73 46 6c 61 67 73 20 26  TE==(iLhsFlags &
ed10: 20 6d 29 20 29 20 69 44 65 6c 31 20 3d 20 2b 31   m) ) iDel1 = +1
ed20: 3b 0a 20 20 20 20 69 66 28 20 4c 53 4d 5f 45 4e  ;.    if( LSM_EN
ed30: 44 5f 44 45 4c 45 54 45 20 20 3d 3d 28 69 4c 68  D_DELETE  ==(iLh
ed40: 73 46 6c 61 67 73 20 26 20 6d 29 20 29 20 69 44  sFlags & m) ) iD
ed50: 65 6c 31 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  el1 = -1;.    if
ed60: 28 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45  ( LSM_START_DELE
ed70: 54 45 3d 3d 28 69 52 68 73 46 6c 61 67 73 20 26  TE==(iRhsFlags &
ed80: 20 6d 29 20 29 20 69 44 65 6c 32 20 3d 20 2b 31   m) ) iDel2 = +1
ed90: 3b 0a 20 20 20 20 69 66 28 20 4c 53 4d 5f 45 4e  ;.    if( LSM_EN
eda0: 44 5f 44 45 4c 45 54 45 20 20 3d 3d 28 69 52 68  D_DELETE  ==(iRh
edb0: 73 46 6c 61 67 73 20 26 20 6d 29 20 29 20 69 44  sFlags & m) ) iD
edc0: 65 6c 32 20 3d 20 2d 31 3b 0a 0a 20 20 20 20 72  el2 = -1;..    r
edd0: 65 73 20 3d 20 28 69 44 65 6c 31 20 2d 20 69 44  es = (iDel1 - iD
ede0: 65 6c 32 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  el2);.  }..  ret
edf0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 73 74 61 74  urn res;.}..stat
ee00: 69 63 20 76 6f 69 64 20 6d 75 6c 74 69 43 75 72  ic void multiCur
ee10: 73 6f 72 44 6f 43 6f 6d 70 61 72 65 28 4d 75 6c  sorDoCompare(Mul
ee20: 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  tiCursor *pCsr, 
ee30: 69 6e 74 20 69 4f 75 74 2c 20 69 6e 74 20 62 52  int iOut, int bR
ee40: 65 76 65 72 73 65 29 7b 0a 20 20 69 6e 74 20 69  everse){.  int i
ee50: 31 3b 0a 20 20 69 6e 74 20 69 32 3b 0a 20 20 69  1;.  int i2;.  i
ee60: 6e 74 20 69 52 65 73 3b 0a 20 20 76 6f 69 64 20  nt iRes;.  void 
ee70: 2a 70 4b 65 79 31 3b 20 69 6e 74 20 6e 4b 65 79  *pKey1; int nKey
ee80: 31 3b 20 69 6e 74 20 65 54 79 70 65 31 3b 0a 20  1; int eType1;. 
ee90: 20 76 6f 69 64 20 2a 70 4b 65 79 32 3b 20 69 6e   void *pKey2; in
eea0: 74 20 6e 4b 65 79 32 3b 20 69 6e 74 20 65 54 79  t nKey2; int eTy
eeb0: 70 65 32 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  pe2;.  const int
eec0: 20 6d 75 6c 20 3d 20 28 62 52 65 76 65 72 73 65   mul = (bReverse
eed0: 20 3f 20 2d 31 20 3a 20 31 29 3b 0a 0a 20 20 61   ? -1 : 1);..  a
eee0: 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61 54 72  ssert( pCsr->aTr
eef0: 65 65 20 26 26 20 69 4f 75 74 3c 70 43 73 72 2d  ee && iOut<pCsr-
ef00: 3e 6e 54 72 65 65 20 29 3b 0a 20 20 69 66 28 20  >nTree );.  if( 
ef10: 69 4f 75 74 3e 3d 28 70 43 73 72 2d 3e 6e 54 72  iOut>=(pCsr->nTr
ef20: 65 65 2f 32 29 20 29 7b 0a 20 20 20 20 69 31 20  ee/2) ){.    i1 
ef30: 3d 20 28 69 4f 75 74 20 2d 20 70 43 73 72 2d 3e  = (iOut - pCsr->
ef40: 6e 54 72 65 65 2f 32 29 20 2a 20 32 3b 0a 20 20  nTree/2) * 2;.  
ef50: 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20    i2 = i1 + 1;. 
ef60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d   }else{.    i1 =
ef70: 20 70 43 73 72 2d 3e 61 54 72 65 65 5b 69 4f 75   pCsr->aTree[iOu
ef80: 74 2a 32 5d 3b 0a 20 20 20 20 69 32 20 3d 20 70  t*2];.    i2 = p
ef90: 43 73 72 2d 3e 61 54 72 65 65 5b 69 4f 75 74 2a  Csr->aTree[iOut*
efa0: 32 2b 31 5d 3b 0a 20 20 7d 0a 0a 20 20 6d 75 6c  2+1];.  }..  mul
efb0: 74 69 43 75 72 73 6f 72 47 65 74 4b 65 79 28 70  tiCursorGetKey(p
efc0: 43 73 72 2c 20 69 31 2c 20 26 65 54 79 70 65 31  Csr, i1, &eType1
efd0: 2c 20 26 70 4b 65 79 31 2c 20 26 6e 4b 65 79 31  , &pKey1, &nKey1
efe0: 29 3b 0a 20 20 6d 75 6c 74 69 43 75 72 73 6f 72  );.  multiCursor
eff0: 47 65 74 4b 65 79 28 70 43 73 72 2c 20 69 32 2c  GetKey(pCsr, i2,
f000: 20 26 65 54 79 70 65 32 2c 20 26 70 4b 65 79 32   &eType2, &pKey2
f010: 2c 20 26 6e 4b 65 79 32 29 3b 0a 0a 20 20 69 66  , &nKey2);..  if
f020: 28 20 70 4b 65 79 31 3d 3d 30 20 29 7b 0a 20 20  ( pKey1==0 ){.  
f030: 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d    iRes = i2;.  }
f040: 65 6c 73 65 20 69 66 28 20 70 4b 65 79 32 3d 3d  else if( pKey2==
f050: 30 20 29 7b 0a 20 20 20 20 69 52 65 73 20 3d 20  0 ){.    iRes = 
f060: 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  i1;.  }else{.   
f070: 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f   int res;..    /
f080: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
f090: 79 73 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  ys */.    res = 
f0a0: 73 6f 72 74 65 64 44 62 4b 65 79 43 6f 6d 70 61  sortedDbKeyCompa
f0b0: 72 65 28 70 43 73 72 2c 0a 20 20 20 20 20 20 20  re(pCsr,.       
f0c0: 20 65 54 79 70 65 31 2c 20 70 4b 65 79 31 2c 20   eType1, pKey1, 
f0d0: 6e 4b 65 79 31 2c 20 65 54 79 70 65 32 2c 20 70  nKey1, eType2, p
f0e0: 4b 65 79 32 2c 20 6e 4b 65 79 32 0a 20 20 20 20  Key2, nKey2.    
f0f0: 29 3b 0a 0a 20 20 20 20 72 65 73 20 3d 20 72 65  );..    res = re
f100: 73 20 2a 20 6d 75 6c 3b 0a 20 20 20 20 69 66 28  s * mul;.    if(
f110: 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
f120: 20 2f 2a 20 54 68 65 20 74 77 6f 20 6b 65 79 73   /* The two keys
f130: 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20   are identical. 
f140: 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 6d  Normally, this m
f150: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6b 65  eans that the ke
f160: 79 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20  y from.      ** 
f170: 74 68 65 20 6e 65 77 65 72 20 72 75 6e 20 63 6c  the newer run cl
f180: 6f 62 62 65 72 73 20 74 68 65 20 6f 6c 64 2e 20  obbers the old. 
f190: 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
f1a0: 6e 65 77 65 72 20 6b 65 79 20 69 73 20 61 0a 20  newer key is a. 
f1b0: 20 20 20 20 20 2a 2a 20 73 65 70 61 72 61 74 6f       ** separato
f1c0: 72 20 6b 65 79 2c 20 6f 72 20 61 20 72 61 6e 67  r key, or a rang
f1d0: 65 2d 64 65 6c 65 74 65 2d 62 6f 75 6e 64 61 72  e-delete-boundar
f1e0: 79 20 6f 6e 6c 79 2c 20 64 6f 20 6e 6f 74 20 61  y only, do not a
f1f0: 6c 6c 6f 77 20 69 74 0a 20 20 20 20 20 20 2a 2a  llow it.      **
f200: 20 74 6f 20 63 6c 6f 62 62 65 72 20 61 6e 20 6f   to clobber an o
f210: 6c 64 65 72 20 65 6e 74 72 79 2e 20 20 2a 2f 0a  lder entry.  */.
f220: 20 20 20 20 20 20 69 6e 74 20 6e 63 31 20 3d 20        int nc1 = 
f230: 28 65 54 79 70 65 31 20 26 20 28 4c 53 4d 5f 49  (eType1 & (LSM_I
f240: 4e 53 45 52 54 7c 4c 53 4d 5f 50 4f 49 4e 54 5f  NSERT|LSM_POINT_
f250: 44 45 4c 45 54 45 29 29 3d 3d 30 3b 0a 20 20 20  DELETE))==0;.   
f260: 20 20 20 69 6e 74 20 6e 63 32 20 3d 20 28 65 54     int nc2 = (eT
f270: 79 70 65 32 20 26 20 28 4c 53 4d 5f 49 4e 53 45  ype2 & (LSM_INSE
f280: 52 54 7c 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c  RT|LSM_POINT_DEL
f290: 45 54 45 29 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ETE))==0;.      
f2a0: 69 52 65 73 20 3d 20 28 6e 63 31 20 3e 20 6e 63  iRes = (nc1 > nc
f2b0: 32 29 20 3f 20 69 32 20 3a 20 69 31 3b 0a 20 20  2) ? i2 : i1;.  
f2c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3c    }else if( res<
f2d0: 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73 20  0 ){.      iRes 
f2e0: 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = i1;.    }else{
f2f0: 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 32  .      iRes = i2
f300: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
f310: 43 73 72 2d 3e 61 54 72 65 65 5b 69 4f 75 74 5d  Csr->aTree[iOut]
f320: 20 3d 20 69 52 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a   = iRes;.}../*.*
f330: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
f340: 61 64 76 61 6e 63 65 73 20 73 65 67 6d 65 6e 74  advances segment
f350: 20 70 6f 69 6e 74 65 72 20 69 50 74 72 20 62 65   pointer iPtr be
f360: 6c 6f 6e 67 69 6e 67 20 74 6f 20 6d 75 6c 74 69  longing to multi
f370: 2d 63 75 72 73 6f 72 0a 2a 2a 20 70 43 73 72 20  -cursor.** pCsr 
f380: 66 6f 72 77 61 72 64 20 28 62 52 65 76 65 72 73  forward (bRevers
f390: 65 3d 3d 30 29 20 6f 72 20 62 61 63 6b 77 61 72  e==0) or backwar
f3a0: 64 20 28 62 52 65 76 65 72 73 65 21 3d 30 29 2e  d (bReverse!=0).
f3b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
f3c0: 67 6d 65 6e 74 20 70 6f 69 6e 74 65 72 20 70 6f  gment pointer po
f3d0: 69 6e 74 73 20 74 6f 20 61 20 73 65 67 6d 65 6e  ints to a segmen
f3e0: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
f3f0: 66 20 61 20 63 6f 6d 70 6f 73 69 74 65 0a 2a 2a  f a composite.**
f400: 20 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68 65   level, then the
f410: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 70 65 63 69   following speci
f420: 61 6c 20 63 61 73 65 20 69 73 20 68 61 6e 64 6c  al case is handl
f430: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ed..**.**   * If
f440: 20 69 50 74 72 20 69 73 20 74 68 65 20 6c 68 73   iPtr is the lhs
f450: 20 6f 66 20 61 20 63 6f 6d 70 6f 73 69 74 65 20   of a composite 
f460: 6c 65 76 65 6c 2c 20 61 6e 64 20 74 68 65 20 63  level, and the c
f470: 75 72 73 6f 72 20 69 73 20 62 65 69 6e 67 0a 2a  ursor is being.*
f480: 2a 20 20 20 20 20 61 64 76 61 6e 63 65 64 20 66  *     advanced f
f490: 6f 72 77 61 72 64 73 2c 20 61 6e 64 20 73 65 67  orwards, and seg
f4a0: 6d 65 6e 74 20 69 50 74 72 20 69 73 20 61 74 20  ment iPtr is at 
f4b0: 45 4f 46 2c 20 6d 6f 76 65 20 61 6c 6c 20 70 6f  EOF, move all po
f4c0: 69 6e 74 65 72 73 0a 2a 2a 20 20 20 20 20 74 68  inters.**     th
f4d0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
f4e0: 20 72 68 73 20 73 65 67 6d 65 6e 74 73 20 6f 66   rhs segments of
f4f0: 20 74 68 65 20 73 61 6d 65 20 6c 65 76 65 6c 20   the same level 
f500: 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
f510: 20 20 20 20 6b 65 79 20 69 6e 20 74 68 65 69 72      key in their
f520: 20 72 65 73 70 65 63 74 69 76 65 20 64 61 74 61   respective data
f530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f540: 73 65 67 6d 65 6e 74 43 75 72 73 6f 72 41 64 76  segmentCursorAdv
f550: 61 6e 63 65 28 0a 20 20 4d 75 6c 74 69 43 75 72  ance(.  MultiCur
f560: 73 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20 69 6e  sor *pCsr, .  in
f570: 74 20 69 50 74 72 2c 0a 20 20 69 6e 74 20 62 52  t iPtr,.  int bR
f580: 65 76 65 72 73 65 0a 29 7b 0a 20 20 69 6e 74 20  everse.){.  int 
f590: 72 63 3b 0a 20 20 53 65 67 6d 65 6e 74 50 74 72  rc;.  SegmentPtr
f5a0: 20 2a 70 50 74 72 20 3d 20 26 70 43 73 72 2d 3e   *pPtr = &pCsr->
f5b0: 61 50 74 72 5b 69 50 74 72 5d 3b 0a 20 20 4c 65  aPtr[iPtr];.  Le
f5c0: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 70 50 74 72  vel *pLvl = pPtr
f5d0: 2d 3e 70 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20  ->pLevel;.  int 
f5e0: 62 43 6f 6d 70 6f 73 69 74 65 3b 20 20 20 20 20  bComposite;     
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f600: 72 75 65 20 69 66 20 70 50 74 72 20 69 73 20 70  rue if pPtr is p
f610: 61 72 74 20 6f 66 20 63 6f 6d 70 6f 73 69 74 65  art of composite
f620: 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 2f 2a 20   level */..  /* 
f630: 41 64 76 61 6e 63 65 20 74 68 65 20 73 65 67 6d  Advance the segm
f640: 65 6e 74 2d 70 6f 69 6e 74 65 72 20 6f 62 6a 65  ent-pointer obje
f650: 63 74 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 65  ct. */.  rc = se
f660: 67 6d 65 6e 74 50 74 72 41 64 76 61 6e 63 65 28  gmentPtrAdvance(
f670: 70 43 73 72 2c 20 70 50 74 72 2c 20 62 52 65 76  pCsr, pPtr, bRev
f680: 65 72 73 65 29 3b 0a 20 20 69 66 28 20 72 63 21  erse);.  if( rc!
f690: 3d 4c 53 4d 5f 4f 4b 20 29 20 72 65 74 75 72 6e  =LSM_OK ) return
f6a0: 20 72 63 3b 0a 0a 20 20 62 43 6f 6d 70 6f 73 69   rc;..  bComposi
f6b0: 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 52 69 67  te = (pLvl->nRig
f6c0: 68 74 3e 30 20 26 26 20 70 43 73 72 2d 3e 6e 50  ht>0 && pCsr->nP
f6d0: 74 72 3e 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 29  tr>pLvl->nRight)
f6e0: 3b 0a 20 20 69 66 28 20 62 43 6f 6d 70 6f 73 69  ;.  if( bComposi
f6f0: 74 65 20 26 26 20 70 50 74 72 2d 3e 70 50 67 3d  te && pPtr->pPg=
f700: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 46  =0 ){.    int bF
f710: 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ix = 0;.    if( 
f720: 28 62 52 65 76 65 72 73 65 3d 3d 30 29 3d 3d 28  (bReverse==0)==(
f730: 70 50 74 72 2d 3e 70 53 65 67 3d 3d 26 70 4c 76  pPtr->pSeg==&pLv
f740: 6c 2d 3e 6c 68 73 29 20 29 7b 0a 20 20 20 20 20  l->lhs) ){.     
f750: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66   int i;.      if
f760: 28 20 62 52 65 76 65 72 73 65 20 29 7b 0a 20 20  ( bReverse ){.  
f770: 20 20 20 20 20 20 53 65 67 6d 65 6e 74 50 74 72        SegmentPtr
f780: 20 2a 70 4c 68 73 20 3d 20 26 70 43 73 72 2d 3e   *pLhs = &pCsr->
f790: 61 50 74 72 5b 69 50 74 72 20 2d 20 31 20 2d 20  aPtr[iPtr - 1 - 
f7a0: 28 70 50 74 72 2d 3e 70 53 65 67 20 2d 20 70 4c  (pPtr->pSeg - pL
f7b0: 76 6c 2d 3e 61 52 68 73 29 5d 3b 0a 20 20 20 20  vl->aRhs)];.    
f7c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
f7d0: 4c 76 6c 2d 3e 6e 52 69 67 68 74 3b 20 69 2b 2b  Lvl->nRight; i++
f7e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
f7f0: 20 70 4c 68 73 5b 69 2b 31 5d 2e 70 50 67 20 29   pLhs[i+1].pPg )
f800: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
f810: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  }.        if( i=
f820: 3d 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 20 29 7b  =pLvl->nRight ){
f830: 0a 20 20 20 20 20 20 20 20 20 20 62 46 69 78 20  .          bFix 
f840: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 1;.          r
f850: 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 45 6e  c = segmentPtrEn
f860: 64 28 70 43 73 72 2c 20 70 4c 68 73 2c 20 31 29  d(pCsr, pLhs, 1)
f870: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f890: 20 62 46 69 78 20 3d 20 31 3b 0a 20 20 20 20 20   bFix = 1;.     
f8a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
f8b0: 4c 53 4d 5f 4f 4b 20 26 26 20 69 3c 70 4c 76 6c  LSM_OK && i<pLvl
f8c0: 2d 3e 6e 52 69 67 68 74 3b 20 69 2b 2b 29 7b 0a  ->nRight; i++){.
f8d0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
f8e0: 6f 72 74 65 64 52 68 73 46 69 72 73 74 28 70 43  ortedRhsFirst(pC
f8f0: 73 72 2c 20 70 4c 76 6c 2c 20 26 70 43 73 72 2d  sr, pLvl, &pCsr-
f900: 3e 61 50 74 72 5b 69 50 74 72 2b 31 2b 69 5d 29  >aPtr[iPtr+1+i])
f910: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f920: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
f930: 66 28 20 62 46 69 78 20 29 7b 0a 20 20 20 20 20  f( bFix ){.     
f940: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
f950: 72 28 69 3d 70 43 73 72 2d 3e 6e 54 72 65 65 2d  r(i=pCsr->nTree-
f960: 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
f970: 20 20 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f        multiCurso
f980: 72 44 6f 43 6f 6d 70 61 72 65 28 70 43 73 72 2c  rDoCompare(pCsr,
f990: 20 69 2c 20 62 52 65 76 65 72 73 65 29 3b 0a 20   i, bReverse);. 
f9a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f9b0: 0a 0a 23 69 66 20 30 0a 20 20 69 66 28 20 62 43  ..#if 0.  if( bC
f9c0: 6f 6d 70 6f 73 69 74 65 20 26 26 20 70 50 74 72  omposite && pPtr
f9d0: 2d 3e 70 53 65 67 3d 3d 26 70 4c 76 6c 2d 3e 6c  ->pSeg==&pLvl->l
f9e0: 68 73 20 20 20 20 20 20 20 2f 2a 20 6c 68 73 20  hs       /* lhs 
f9f0: 6f 66 20 63 6f 6d 70 6f 73 69 74 65 20 6c 65 76  of composite lev
fa00: 65 6c 20 2a 2f 0a 20 20 20 26 26 20 62 52 65 76  el */.   && bRev
fa10: 65 72 73 65 3d 3d 30 20 20 20 20 20 20 20 20 20  erse==0         
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa30: 20 20 20 20 20 20 20 2f 2a 20 63 73 72 20 61 64         /* csr ad
fa40: 76 61 6e 63 65 64 20 66 6f 72 77 61 72 64 73 20  vanced forwards 
fa50: 2a 2f 0a 20 20 20 26 26 20 70 50 74 72 2d 3e 70  */.   && pPtr->p
fa60: 50 67 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  Pg==0           
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa80: 20 20 20 20 2f 2a 20 73 65 67 6d 65 6e 74 20 61      /* segment a
fa90: 74 20 45 4f 46 20 2a 2f 0a 20 20 29 7b 0a 20 20  t EOF */.  ){.  
faa0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
fab0: 28 69 3d 30 3b 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  (i=0; rc==LSM_OK
fac0: 20 26 26 20 69 3c 70 4c 76 6c 2d 3e 6e 52 69 67   && i<pLvl->nRig
fad0: 68 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ht; i++){.      
fae0: 72 63 20 3d 20 73 6f 72 74 65 64 52 68 73 46 69  rc = sortedRhsFi
faf0: 72 73 74 28 70 43 73 72 2c 20 70 4c 76 6c 2c 20  rst(pCsr, pLvl, 
fb00: 26 70 43 73 72 2d 3e 61 50 74 72 5b 69 50 74 72  &pCsr->aPtr[iPtr
fb10: 2b 31 2b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  +1+i]);.    }.  
fb20: 20 20 66 6f 72 28 69 3d 70 43 73 72 2d 3e 6e 54    for(i=pCsr->nT
fb30: 72 65 65 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  ree-1; i>0; i--)
fb40: 7b 0a 20 20 20 20 20 20 6d 75 6c 74 69 43 75 72  {.      multiCur
fb50: 73 6f 72 44 6f 43 6f 6d 70 61 72 65 28 70 43 73  sorDoCompare(pCs
fb60: 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  r, i, 0);.    }.
fb70: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
fb80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
fb90: 69 63 20 76 6f 69 64 20 6d 63 75 72 73 6f 72 46  ic void mcursorF
fba0: 72 65 65 43 6f 6d 70 6f 6e 65 6e 74 73 28 4d 75  reeComponents(Mu
fbb0: 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 29  ltiCursor *pCsr)
fbc0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6c 73 6d  {.  int i;.  lsm
fbd0: 5f 65 6e 76 20 2a 70 45 6e 76 20 3d 20 70 43 73  _env *pEnv = pCs
fbe0: 72 2d 3e 70 44 62 2d 3e 70 45 6e 76 3b 0a 0a 20  r->pDb->pEnv;.. 
fbf0: 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 74 72   /* Close the tr
fc00: 65 65 20 63 75 72 73 6f 72 2c 20 69 66 20 61 6e  ee cursor, if an
fc10: 79 2e 20 2a 2f 0a 20 20 6c 73 6d 54 72 65 65 43  y. */.  lsmTreeC
fc20: 75 72 73 6f 72 44 65 73 74 72 6f 79 28 70 43 73  ursorDestroy(pCs
fc30: 72 2d 3e 61 70 54 72 65 65 43 73 72 5b 30 5d 29  r->apTreeCsr[0])
fc40: 3b 0a 20 20 6c 73 6d 54 72 65 65 43 75 72 73 6f  ;.  lsmTreeCurso
fc50: 72 44 65 73 74 72 6f 79 28 70 43 73 72 2d 3e 61  rDestroy(pCsr->a
fc60: 70 54 72 65 65 43 73 72 5b 31 5d 29 3b 0a 0a 20  pTreeCsr[1]);.. 
fc70: 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 73 65   /* Reset the se
fc80: 67 6d 65 6e 74 20 70 6f 69 6e 74 65 72 73 20 2a  gment pointers *
fc90: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
fca0: 43 73 72 2d 3e 6e 50 74 72 3b 20 69 2b 2b 29 7b  Csr->nPtr; i++){
fcb0: 0a 20 20 20 20 73 65 67 6d 65 6e 74 50 74 72 52  .    segmentPtrR
fcc0: 65 73 65 74 28 26 70 43 73 72 2d 3e 61 50 74 72  eset(&pCsr->aPtr
fcd0: 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  [i]);.  }..  /* 
fce0: 41 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 63  And the b-tree c
fcf0: 75 72 73 6f 72 2c 20 69 66 20 61 6e 79 20 2a 2f  ursor, if any */
fd00: 0a 20 20 62 74 72 65 65 43 75 72 73 6f 72 46 72  .  btreeCursorFr
fd10: 65 65 28 70 43 73 72 2d 3e 70 42 74 43 73 72 29  ee(pCsr->pBtCsr)
fd20: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6c 6c  ;..  /* Free all
fd30: 6f 63 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 6c 73  ocations */.  ls
fd40: 6d 46 72 65 65 28 70 45 6e 76 2c 20 70 43 73 72  mFree(pEnv, pCsr
fd50: 2d 3e 61 50 74 72 29 3b 0a 20 20 6c 73 6d 46 72  ->aPtr);.  lsmFr
fd60: 65 65 28 70 45 6e 76 2c 20 70 43 73 72 2d 3e 61  ee(pEnv, pCsr->a
fd70: 54 72 65 65 29 3b 0a 20 20 6c 73 6d 46 72 65 65  Tree);.  lsmFree
fd80: 28 70 45 6e 76 2c 20 70 43 73 72 2d 3e 70 53 79  (pEnv, pCsr->pSy
fd90: 73 74 65 6d 56 61 6c 29 3b 0a 0a 20 20 2f 2a 20  stemVal);..  /* 
fda0: 5a 65 72 6f 20 66 69 65 6c 64 73 20 2a 2f 0a 20  Zero fields */. 
fdb0: 20 70 43 73 72 2d 3e 6e 50 74 72 20 3d 20 30 3b   pCsr->nPtr = 0;
fdc0: 0a 20 20 70 43 73 72 2d 3e 61 50 74 72 20 3d 20  .  pCsr->aPtr = 
fdd0: 30 3b 0a 20 20 70 43 73 72 2d 3e 6e 54 72 65 65  0;.  pCsr->nTree
fde0: 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d 3e 61 54   = 0;.  pCsr->aT
fdf0: 72 65 65 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d  ree = 0;.  pCsr-
fe00: 3e 70 53 79 73 74 65 6d 56 61 6c 20 3d 20 30 3b  >pSystemVal = 0;
fe10: 0a 20 20 70 43 73 72 2d 3e 61 70 54 72 65 65 43  .  pCsr->apTreeC
fe20: 73 72 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 73  sr[0] = 0;.  pCs
fe30: 72 2d 3e 61 70 54 72 65 65 43 73 72 5b 31 5d 20  r->apTreeCsr[1] 
fe40: 3d 20 30 3b 0a 20 20 70 43 73 72 2d 3e 70 42 74  = 0;.  pCsr->pBt
fe50: 43 73 72 20 3d 20 30 3b 0a 7d 0a 0a 76 6f 69 64  Csr = 0;.}..void
fe60: 20 6c 73 6d 4d 43 75 72 73 6f 72 46 72 65 65 43   lsmMCursorFreeC
fe70: 61 63 68 65 28 6c 73 6d 5f 64 62 20 2a 70 44 62  ache(lsm_db *pDb
fe80: 29 7b 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72  ){.  MultiCursor
fe90: 20 2a 70 3b 0a 20 20 4d 75 6c 74 69 43 75 72 73   *p;.  MultiCurs
fea0: 6f 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  or *pNext;.  for
feb0: 28 70 3d 70 44 62 2d 3e 70 43 73 72 43 61 63 68  (p=pDb->pCsrCach
fec0: 65 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  e; p; p=pNext){.
fed0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
fee0: 4e 65 78 74 3b 0a 20 20 20 20 6c 73 6d 4d 43 75  Next;.    lsmMCu
fef0: 72 73 6f 72 43 6c 6f 73 65 28 70 2c 20 30 29 3b  rsorClose(p, 0);
ff00: 0a 20 20 7d 0a 20 20 70 44 62 2d 3e 70 43 73 72  .  }.  pDb->pCsr
ff10: 43 61 63 68 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Cache = 0;.}../*
ff20: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 63 75  .** Close the cu
ff30: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
ff40: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
ff50: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
ff60: 62 43 61 63 68 65 20 70 61 72 61 6d 65 74 65 72  bCache parameter
ff70: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 73   is true, then s
ff80: 68 69 66 74 20 74 68 65 20 63 75 72 73 6f 72 20  hift the cursor 
ff90: 74 6f 20 74 68 65 20 70 43 73 72 43 61 63 68 65  to the pCsrCache
ffa0: 0a 2a 2a 20 6c 69 73 74 20 66 6f 72 20 70 6f 73  .** list for pos
ffb0: 73 69 62 6c 65 20 72 65 75 73 65 20 69 6e 73 74  sible reuse inst
ffc0: 65 61 64 20 6f 66 20 61 63 74 75 61 6c 6c 79 20  ead of actually 
ffd0: 64 65 6c 65 74 69 6e 67 20 69 74 2e 0a 2a 2f 0a  deleting it..*/.
ffe0: 76 6f 69 64 20 6c 73 6d 4d 43 75 72 73 6f 72 43  void lsmMCursorC
fff0: 6c 6f 73 65 28 4d 75 6c 74 69 43 75 72 73 6f 72  lose(MultiCursor
10000 20 2a 70 43 73 72 2c 20 69 6e 74 20 62 43 61 63   *pCsr, int bCac
10010 68 65 29 7b 0a 20 20 69 66 28 20 70 43 73 72 20  he){.  if( pCsr 
10020 29 7b 0a 20 20 20 20 6c 73 6d 5f 64 62 20 2a 70  ){.    lsm_db *p
10030 44 62 20 3d 20 70 43 73 72 2d 3e 70 44 62 3b 0a  Db = pCsr->pDb;.
10040 20 20 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20      MultiCursor 
10050 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20  **pp;           
10060 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61    /* Iterator va
10070 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
10080 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6d 61 79  * The cursor may
10090 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 63   or may not be c
100a0 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66  urrently part of
100b0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
100c0 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
100d0 67 20 61 74 20 6c 73 6d 5f 64 62 2e 70 43 73 72  g at lsm_db.pCsr
100e0 2e 20 49 66 20 69 74 20 69 73 2c 20 65 78 74 72  . If it is, extr
100f0 61 63 74 20 69 74 2e 20 20 2a 2f 0a 20 20 20 20  act it.  */.    
10100 66 6f 72 28 70 70 3d 26 70 44 62 2d 3e 70 43 73  for(pp=&pDb->pCs
10110 72 3b 20 2a 70 70 3b 20 70 70 3d 26 28 28 2a 70  r; *pp; pp=&((*p
10120 70 29 2d 3e 70 4e 65 78 74 29 29 7b 0a 20 20 20  p)->pNext)){.   
10130 20 20 20 69 66 28 20 2a 70 70 3d 3d 70 43 73 72     if( *pp==pCsr
10140 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
10150 3d 20 70 43 73 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCsr->pNext;. 
10160 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10170 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10180 20 69 66 28 20 62 43 61 63 68 65 20 29 7b 0a 20   if( bCache ){. 
10190 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101b0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
101c0 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d  ate through segm
101d0 65 6e 74 2d 70 6f 69 6e 74 65 72 73 20 2a 2f 0a  ent-pointers */.
101e0 0a 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  .      /* Releas
101f0 65 20 61 6e 79 20 70 61 67 65 20 72 65 66 65 72  e any page refer
10200 65 6e 63 65 73 20 68 65 6c 64 20 62 79 20 74 68  ences held by th
10210 69 73 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20  is cursor. */.  
10220 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43 73      assert( !pCs
10230 72 2d 3e 70 42 74 43 73 72 20 29 3b 0a 20 20 20  r->pBtCsr );.   
10240 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
10250 73 72 2d 3e 6e 50 74 72 3b 20 69 2b 2b 29 7b 0a  sr->nPtr; i++){.
10260 20 20 20 20 20 20 20 20 53 65 67 6d 65 6e 74 50          SegmentP
10270 74 72 20 2a 70 50 74 72 20 3d 20 26 70 43 73 72  tr *pPtr = &pCsr
10280 2d 3e 61 50 74 72 5b 69 5d 3b 0a 20 20 20 20 20  ->aPtr[i];.     
10290 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65     lsmFsPageRele
102a0 61 73 65 28 70 50 74 72 2d 3e 70 50 67 29 3b 0a  ase(pPtr->pPg);.
102b0 20 20 20 20 20 20 20 20 70 50 74 72 2d 3e 70 50          pPtr->pP
102c0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  g = 0;.      }..
102d0 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74        /* Reset t
102e0 68 65 20 74 72 65 65 20 63 75 72 73 6f 72 73 20  he tree cursors 
102f0 2a 2f 0a 20 20 20 20 20 20 6c 73 6d 54 72 65 65  */.      lsmTree
10300 43 75 72 73 6f 72 52 65 73 65 74 28 70 43 73 72  CursorReset(pCsr
10310 2d 3e 61 70 54 72 65 65 43 73 72 5b 30 5d 29 3b  ->apTreeCsr[0]);
10320 0a 20 20 20 20 20 20 6c 73 6d 54 72 65 65 43 75  .      lsmTreeCu
10330 72 73 6f 72 52 65 73 65 74 28 70 43 73 72 2d 3e  rsorReset(pCsr->
10340 61 70 54 72 65 65 43 73 72 5b 31 5d 29 3b 0a 0a  apTreeCsr[1]);..
10350 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
10360 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
10370 43 73 72 43 61 63 68 65 20 6c 69 73 74 20 2a 2f  CsrCache list */
10380 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 70 4e 65  .      pCsr->pNe
10390 78 74 20 3d 20 70 44 62 2d 3e 70 43 73 72 43 61  xt = pDb->pCsrCa
103a0 63 68 65 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  che;.      pDb->
103b0 70 43 73 72 43 61 63 68 65 20 3d 20 70 43 73 72  pCsrCache = pCsr
103c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
103d0 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 61     /* Free the a
103e0 6c 6c 6f 63 61 74 69 6f 6e 20 75 73 65 64 20 74  llocation used t
103f0 6f 20 63 61 63 68 65 20 74 68 65 20 63 75 72 72  o cache the curr
10400 65 6e 74 20 6b 65 79 2c 20 69 66 20 61 6e 79 2e  ent key, if any.
10410 20 2a 2f 0a 20 20 20 20 20 20 73 6f 72 74 65 64   */.      sorted
10420 42 6c 6f 62 46 72 65 65 28 26 70 43 73 72 2d 3e  BlobFree(&pCsr->
10430 6b 65 79 29 3b 0a 20 20 20 20 20 20 73 6f 72 74  key);.      sort
10440 65 64 42 6c 6f 62 46 72 65 65 28 26 70 43 73 72  edBlobFree(&pCsr
10450 2d 3e 76 61 6c 29 3b 0a 0a 20 20 20 20 20 20 2f  ->val);..      /
10460 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6d 70 6f  * Free the compo
10470 6e 65 6e 74 20 63 75 72 73 6f 72 73 20 2a 2f 0a  nent cursors */.
10480 20 20 20 20 20 20 6d 63 75 72 73 6f 72 46 72 65        mcursorFre
10490 65 43 6f 6d 70 6f 6e 65 6e 74 73 28 70 43 73 72  eComponents(pCsr
104a0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 72 65  );..      /* Fre
104b0 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 72  e the cursor str
104c0 75 63 74 75 72 65 20 69 74 73 65 6c 66 20 2a 2f  ucture itself */
104d0 0a 20 20 20 20 20 20 6c 73 6d 46 72 65 65 28 70  .      lsmFree(p
104e0 44 62 2d 3e 70 45 6e 76 2c 20 70 43 73 72 29 3b  Db->pEnv, pCsr);
104f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64  .    }.  }.}..#d
10500 65 66 69 6e 65 20 54 52 45 45 5f 4e 4f 4e 45 20  efine TREE_NONE 
10510 30 0a 23 64 65 66 69 6e 65 20 54 52 45 45 5f 4f  0.#define TREE_O
10520 4c 44 20 20 31 0a 23 64 65 66 69 6e 65 20 54 52  LD  1.#define TR
10530 45 45 5f 42 4f 54 48 20 32 0a 0a 2f 2a 0a 2a 2a  EE_BOTH 2../*.**
10540 20 50 61 72 61 6d 65 74 65 72 20 65 54 72 65 65   Parameter eTree
10550 20 69 73 20 6f 6e 65 20 6f 66 20 54 52 45 45 5f   is one of TREE_
10560 4f 4c 44 20 6f 72 20 54 52 45 45 5f 42 4f 54 48  OLD or TREE_BOTH
10570 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10580 6d 75 6c 74 69 43 75 72 73 6f 72 41 64 64 54 72  multiCursorAddTr
10590 65 65 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  ee(MultiCursor *
105a0 70 43 73 72 2c 20 53 6e 61 70 73 68 6f 74 20 2a  pCsr, Snapshot *
105b0 70 53 6e 61 70 2c 20 69 6e 74 20 65 54 72 65 65  pSnap, int eTree
105c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  ){.  int rc = LS
105d0 4d 5f 4f 4b 3b 0a 20 20 6c 73 6d 5f 64 62 20 2a  M_OK;.  lsm_db *
105e0 64 62 20 3d 20 70 43 73 72 2d 3e 70 44 62 3b 0a  db = pCsr->pDb;.
105f0 0a 20 20 2f 2a 20 41 64 64 20 61 20 74 72 65 65  .  /* Add a tree
10600 20 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 27   cursor on the '
10610 6f 6c 64 27 20 74 72 65 65 2c 20 69 66 20 69 74  old' tree, if it
10620 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 69 66   exists. */.  if
10630 28 20 65 54 72 65 65 21 3d 54 52 45 45 5f 4e 4f  ( eTree!=TREE_NO
10640 4e 45 20 0a 20 20 20 26 26 20 6c 73 6d 54 72 65  NE .   && lsmTre
10650 65 48 61 73 4f 6c 64 28 64 62 29 20 0a 20 20 20  eHasOld(db) .   
10660 26 26 20 64 62 2d 3e 74 72 65 65 68 64 72 2e 69  && db->treehdr.i
10670 4f 6c 64 4c 6f 67 21 3d 70 53 6e 61 70 2d 3e 69  OldLog!=pSnap->i
10680 4c 6f 67 4f 66 66 20 0a 20 20 29 7b 0a 20 20 20  LogOff .  ){.   
10690 20 72 63 20 3d 20 6c 73 6d 54 72 65 65 43 75 72   rc = lsmTreeCur
106a0 73 6f 72 4e 65 77 28 64 62 2c 20 31 2c 20 26 70  sorNew(db, 1, &p
106b0 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72 5b 31  Csr->apTreeCsr[1
106c0 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  ]);.  }..  /* Ad
106d0 64 20 61 20 74 72 65 65 20 63 75 72 73 6f 72 20  d a tree cursor 
106e0 6f 6e 20 74 68 65 20 27 63 75 72 72 65 6e 74 27  on the 'current'
106f0 20 74 72 65 65 2c 20 69 66 20 72 65 71 75 69 72   tree, if requir
10700 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ed. */.  if( rc=
10710 3d 4c 53 4d 5f 4f 4b 20 26 26 20 65 54 72 65 65  =LSM_OK && eTree
10720 3d 3d 54 52 45 45 5f 42 4f 54 48 20 29 7b 0a 20  ==TREE_BOTH ){. 
10730 20 20 20 72 63 20 3d 20 6c 73 6d 54 72 65 65 43     rc = lsmTreeC
10740 75 72 73 6f 72 4e 65 77 28 64 62 2c 20 30 2c 20  ursorNew(db, 0, 
10750 26 70 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72  &pCsr->apTreeCsr
10760 5b 30 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  [0]);.  }..  ret
10770 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
10780 63 20 69 6e 74 20 6d 75 6c 74 69 43 75 72 73 6f  c int multiCurso
10790 72 41 64 64 52 68 73 28 4d 75 6c 74 69 43 75 72  rAddRhs(MultiCur
107a0 73 6f 72 20 2a 70 43 73 72 2c 20 4c 65 76 65 6c  sor *pCsr, Level
107b0 20 2a 70 4c 76 6c 29 7b 0a 20 20 69 6e 74 20 69   *pLvl){.  int i
107c0 3b 0a 20 20 69 6e 74 20 6e 52 68 73 20 3d 20 70  ;.  int nRhs = p
107d0 4c 76 6c 2d 3e 6e 52 69 67 68 74 3b 0a 0a 20 20  Lvl->nRight;..  
107e0 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 52  assert( pLvl->nR
107f0 69 67 68 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ight>0 );.  asse
10800 72 74 28 20 70 43 73 72 2d 3e 61 50 74 72 3d 3d  rt( pCsr->aPtr==
10810 30 20 29 3b 0a 20 20 70 43 73 72 2d 3e 61 50 74  0 );.  pCsr->aPt
10820 72 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72  r = lsmMallocZer
10830 6f 28 70 43 73 72 2d 3e 70 44 62 2d 3e 70 45 6e  o(pCsr->pDb->pEn
10840 76 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e  v, sizeof(Segmen
10850 74 50 74 72 29 20 2a 20 6e 52 68 73 29 3b 0a 20  tPtr) * nRhs);. 
10860 20 69 66 28 20 21 70 43 73 72 2d 3e 61 50 74 72   if( !pCsr->aPtr
10870 20 29 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4e 4f   ) return LSM_NO
10880 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 43 73 72  MEM_BKPT;.  pCsr
10890 2d 3e 6e 50 74 72 20 3d 20 6e 52 68 73 3b 0a 0a  ->nPtr = nRhs;..
108a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 68    for(i=0; i<nRh
108b0 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 73  s; i++){.    pCs
108c0 72 2d 3e 61 50 74 72 5b 69 5d 2e 70 53 65 67 20  r->aPtr[i].pSeg 
108d0 3d 20 26 70 4c 76 6c 2d 3e 61 52 68 73 5b 69 5d  = &pLvl->aRhs[i]
108e0 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 50 74 72  ;.    pCsr->aPtr
108f0 5b 69 5d 2e 70 4c 65 76 65 6c 20 3d 20 70 4c 76  [i].pLevel = pLv
10900 6c 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  l;.  }..  return
10910 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   LSM_OK;.}..stat
10920 69 63 20 76 6f 69 64 20 6d 75 6c 74 69 43 75 72  ic void multiCur
10930 73 6f 72 41 64 64 4f 6e 65 28 4d 75 6c 74 69 43  sorAddOne(MultiC
10940 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 4c 65 76  ursor *pCsr, Lev
10950 65 6c 20 2a 70 4c 76 6c 2c 20 69 6e 74 20 2a 70  el *pLvl, int *p
10960 52 63 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d  Rc){.  if( *pRc=
10970 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  =LSM_OK ){.    i
10980 6e 74 20 69 50 74 72 20 3d 20 70 43 73 72 2d 3e  nt iPtr = pCsr->
10990 6e 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b  nPtr;.    int i;
109a0 0a 20 20 20 20 70 43 73 72 2d 3e 61 50 74 72 5b  .    pCsr->aPtr[
109b0 69 50 74 72 5d 2e 70 4c 65 76 65 6c 20 3d 20 70  iPtr].pLevel = p
109c0 4c 76 6c 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61  Lvl;.    pCsr->a
109d0 50 74 72 5b 69 50 74 72 5d 2e 70 53 65 67 20 3d  Ptr[iPtr].pSeg =
109e0 20 26 70 4c 76 6c 2d 3e 6c 68 73 3b 0a 20 20 20   &pLvl->lhs;.   
109f0 20 69 50 74 72 2b 2b 3b 0a 20 20 20 20 66 6f 72   iPtr++;.    for
10a00 28 69 3d 30 3b 20 69 3c 70 4c 76 6c 2d 3e 6e 52  (i=0; i<pLvl->nR
10a10 69 67 68 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ight; i++){.    
10a20 20 20 70 43 73 72 2d 3e 61 50 74 72 5b 69 50 74    pCsr->aPtr[iPt
10a30 72 5d 2e 70 4c 65 76 65 6c 20 3d 20 70 4c 76 6c  r].pLevel = pLvl
10a40 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 61 50  ;.      pCsr->aP
10a50 74 72 5b 69 50 74 72 5d 2e 70 53 65 67 20 3d 20  tr[iPtr].pSeg = 
10a60 26 70 4c 76 6c 2d 3e 61 52 68 73 5b 69 5d 3b 0a  &pLvl->aRhs[i];.
10a70 20 20 20 20 20 20 69 50 74 72 2b 2b 3b 0a 20 20        iPtr++;.  
10a80 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4c 76    }..    if( pLv
10a90 6c 2d 3e 6e 52 69 67 68 74 20 26 26 20 70 4c 76  l->nRight && pLv
10aa0 6c 2d 3e 70 53 70 6c 69 74 4b 65 79 3d 3d 30 20  l->pSplitKey==0 
10ab0 29 7b 0a 20 20 20 20 20 20 73 6f 72 74 65 64 53  ){.      sortedS
10ac0 70 6c 69 74 6b 65 79 28 70 43 73 72 2d 3e 70 44  plitkey(pCsr->pD
10ad0 62 2c 20 70 4c 76 6c 2c 20 70 52 63 29 3b 0a 20  b, pLvl, pRc);. 
10ae0 20 20 20 7d 0a 20 20 20 20 70 43 73 72 2d 3e 6e     }.    pCsr->n
10af0 50 74 72 20 3d 20 69 50 74 72 3b 0a 20 20 7d 0a  Ptr = iPtr;.  }.
10b00 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  }..static int mu
10b10 6c 74 69 43 75 72 73 6f 72 41 64 64 41 6c 6c 28  ltiCursorAddAll(
10b20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73  MultiCursor *pCs
10b30 72 2c 20 53 6e 61 70 73 68 6f 74 20 2a 70 53 6e  r, Snapshot *pSn
10b40 61 70 29 7b 0a 20 20 4c 65 76 65 6c 20 2a 70 4c  ap){.  Level *pL
10b50 76 6c 3b 0a 20 20 69 6e 74 20 6e 50 74 72 20 3d  vl;.  int nPtr =
10b60 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c   0;.  int rc = L
10b70 53 4d 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 70 4c  SM_OK;..  for(pL
10b80 76 6c 3d 70 53 6e 61 70 2d 3e 70 4c 65 76 65 6c  vl=pSnap->pLevel
10b90 3b 20 70 4c 76 6c 3b 20 70 4c 76 6c 3d 70 4c 76  ; pLvl; pLvl=pLv
10ba0 6c 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  l->pNext){.    /
10bb0 2a 20 49 66 20 74 68 65 20 4c 45 56 45 4c 5f 49  * If the LEVEL_I
10bc0 4e 43 4f 4d 50 4c 45 54 45 20 66 6c 61 67 20 69  NCOMPLETE flag i
10bd0 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73  s set, then this
10be0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
10bf0 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  ng.    ** called
10c00 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72   (indirectly) fr
10c10 6f 6d 20 77 69 74 68 69 6e 20 61 20 73 6f 72 74  om within a sort
10c20 65 64 4e 65 77 54 6f 70 6c 65 76 65 6c 28 29 20  edNewToplevel() 
10c30 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 63  call to.    ** c
10c40 6f 6e 73 74 72 75 63 74 20 70 4c 76 6c 2e 20 49  onstruct pLvl. I
10c50 6e 20 74 68 69 73 20 63 61 73 65 20 69 67 6e 6f  n this case igno
10c60 72 65 20 70 4c 76 6c 20 2d 20 74 68 69 73 20 63  re pLvl - this c
10c70 75 72 73 6f 72 20 69 73 20 67 6f 69 6e 67 20 74  ursor is going t
10c80 6f 0a 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64  o.    ** be used
10c90 20 74 6f 20 72 65 74 72 69 65 76 65 20 61 20 66   to retrieve a f
10ca0 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 66 72  reelist entry fr
10cb0 6f 6d 20 74 68 65 20 4c 53 4d 2c 20 61 6e 64 20  om the LSM, and 
10cc0 74 68 65 20 70 61 72 74 69 61 6c 6c 79 0a 20 20  the partially.  
10cd0 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 20 6c 65    ** complete le
10ce0 76 65 6c 20 6d 61 79 20 63 6f 6e 66 75 73 65 20  vel may confuse 
10cf0 69 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  it.  */.    if( 
10d00 70 4c 76 6c 2d 3e 66 6c 61 67 73 20 26 20 4c 45  pLvl->flags & LE
10d10 56 45 4c 5f 49 4e 43 4f 4d 50 4c 45 54 45 20 29  VEL_INCOMPLETE )
10d20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e   continue;.    n
10d30 50 74 72 20 2b 3d 20 28 31 20 2b 20 70 4c 76 6c  Ptr += (1 + pLvl
10d40 2d 3e 6e 52 69 67 68 74 29 3b 0a 20 20 7d 0a 0a  ->nRight);.  }..
10d50 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
10d60 61 50 74 72 3d 3d 30 20 29 3b 0a 20 20 70 43 73  aPtr==0 );.  pCs
10d70 72 2d 3e 61 50 74 72 20 3d 20 6c 73 6d 4d 61 6c  r->aPtr = lsmMal
10d80 6c 6f 63 5a 65 72 6f 52 63 28 70 43 73 72 2d 3e  locZeroRc(pCsr->
10d90 70 44 62 2d 3e 70 45 6e 76 2c 20 73 69 7a 65 6f  pDb->pEnv, sizeo
10da0 66 28 53 65 67 6d 65 6e 74 50 74 72 29 20 2a 20  f(SegmentPtr) * 
10db0 6e 50 74 72 2c 20 26 72 63 29 3b 0a 0a 20 20 66  nPtr, &rc);..  f
10dc0 6f 72 28 70 4c 76 6c 3d 70 53 6e 61 70 2d 3e 70  or(pLvl=pSnap->p
10dd0 4c 65 76 65 6c 3b 20 70 4c 76 6c 3b 20 70 4c 76  Level; pLvl; pLv
10de0 6c 3d 70 4c 76 6c 2d 3e 70 4e 65 78 74 29 7b 0a  l=pLvl->pNext){.
10df0 20 20 20 20 69 66 28 20 28 70 4c 76 6c 2d 3e 66      if( (pLvl->f
10e00 6c 61 67 73 20 26 20 4c 45 56 45 4c 5f 49 4e 43  lags & LEVEL_INC
10e10 4f 4d 50 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20  OMPLETE)==0 ){. 
10e20 20 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f 72       multiCursor
10e30 41 64 64 4f 6e 65 28 70 43 73 72 2c 20 70 4c 76  AddOne(pCsr, pLv
10e40 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  l, &rc);.    }. 
10e50 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
10e60 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .}..static int m
10e70 75 6c 74 69 43 75 72 73 6f 72 49 6e 69 74 28 4d  ultiCursorInit(M
10e80 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72  ultiCursor *pCsr
10e90 2c 20 53 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61  , Snapshot *pSna
10ea0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
10eb0 72 63 20 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72  rc = multiCursor
10ec0 41 64 64 41 6c 6c 28 70 43 73 72 2c 20 70 53 6e  AddAll(pCsr, pSn
10ed0 61 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 4c  ap);.  if( rc==L
10ee0 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  SM_OK ){.    rc 
10ef0 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72 41 64 64  = multiCursorAdd
10f00 54 72 65 65 28 70 43 73 72 2c 20 70 53 6e 61 70  Tree(pCsr, pSnap
10f10 2c 20 54 52 45 45 5f 42 4f 54 48 29 3b 0a 20 20  , TREE_BOTH);.  
10f20 7d 0a 20 20 70 43 73 72 2d 3e 66 6c 61 67 73 20  }.  pCsr->flags 
10f30 7c 3d 20 28 43 55 52 53 4f 52 5f 49 47 4e 4f 52  |= (CURSOR_IGNOR
10f40 45 5f 53 59 53 54 45 4d 20 7c 20 43 55 52 53 4f  E_SYSTEM | CURSO
10f50 52 5f 49 47 4e 4f 52 45 5f 44 45 4c 45 54 45 29  R_IGNORE_DELETE)
10f60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
10f70 0a 0a 73 74 61 74 69 63 20 4d 75 6c 74 69 43 75  ..static MultiCu
10f80 72 73 6f 72 20 2a 6d 75 6c 74 69 43 75 72 73 6f  rsor *multiCurso
10f90 72 4e 65 77 28 6c 73 6d 5f 64 62 20 2a 64 62 2c  rNew(lsm_db *db,
10fa0 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 4d 75   int *pRc){.  Mu
10fb0 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 3b  ltiCursor *pCsr;
10fc0 0a 20 20 70 43 73 72 20 3d 20 28 4d 75 6c 74 69  .  pCsr = (Multi
10fd0 43 75 72 73 6f 72 20 2a 29 6c 73 6d 4d 61 6c 6c  Cursor *)lsmMall
10fe0 6f 63 5a 65 72 6f 52 63 28 64 62 2d 3e 70 45 6e  ocZeroRc(db->pEn
10ff0 76 2c 20 73 69 7a 65 6f 66 28 4d 75 6c 74 69 43  v, sizeof(MultiC
11000 75 72 73 6f 72 29 2c 20 70 52 63 29 3b 0a 20 20  ursor), pRc);.  
11010 69 66 28 20 70 43 73 72 20 29 7b 0a 20 20 20 20  if( pCsr ){.    
11020 70 43 73 72 2d 3e 70 4e 65 78 74 20 3d 20 64 62  pCsr->pNext = db
11030 2d 3e 70 43 73 72 3b 0a 20 20 20 20 64 62 2d 3e  ->pCsr;.    db->
11040 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 20  pCsr = pCsr;.   
11050 20 70 43 73 72 2d 3e 70 44 62 20 3d 20 64 62 3b   pCsr->pDb = db;
11060 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43  .  }.  return pC
11070 73 72 3b 0a 7d 0a 0a 0a 76 6f 69 64 20 6c 73 6d  sr;.}...void lsm
11080 53 6f 72 74 65 64 52 65 6d 61 70 28 6c 73 6d 5f  SortedRemap(lsm_
11090 64 62 20 2a 70 44 62 29 7b 0a 20 20 4d 75 6c 74  db *pDb){.  Mult
110a0 69 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20  iCursor *pCsr;. 
110b0 20 66 6f 72 28 70 43 73 72 3d 70 44 62 2d 3e 70   for(pCsr=pDb->p
110c0 43 73 72 3b 20 70 43 73 72 3b 20 70 43 73 72 3d  Csr; pCsr; pCsr=
110d0 70 43 73 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCsr->pNext){.  
110e0 20 20 69 6e 74 20 69 50 74 72 3b 0a 20 20 20 20    int iPtr;.    
110f0 69 66 28 20 70 43 73 72 2d 3e 70 42 74 43 73 72  if( pCsr->pBtCsr
11100 20 29 7b 0a 20 20 20 20 20 20 62 74 72 65 65 43   ){.      btreeC
11110 75 72 73 6f 72 4c 6f 61 64 4b 65 79 28 70 43 73  ursorLoadKey(pCs
11120 72 2d 3e 70 42 74 43 73 72 29 3b 0a 20 20 20 20  r->pBtCsr);.    
11130 7d 0a 20 20 20 20 66 6f 72 28 69 50 74 72 3d 30  }.    for(iPtr=0
11140 3b 20 69 50 74 72 3c 70 43 73 72 2d 3e 6e 50 74  ; iPtr<pCsr->nPt
11150 72 3b 20 69 50 74 72 2b 2b 29 7b 0a 20 20 20 20  r; iPtr++){.    
11160 20 20 73 65 67 6d 65 6e 74 50 74 72 4c 6f 61 64    segmentPtrLoad
11170 43 65 6c 6c 28 26 70 43 73 72 2d 3e 61 50 74 72  Cell(&pCsr->aPtr
11180 5b 69 50 74 72 5d 2c 20 70 43 73 72 2d 3e 61 50  [iPtr], pCsr->aP
11190 74 72 5b 69 50 74 72 5d 2e 69 43 65 6c 6c 29 3b  tr[iPtr].iCell);
111a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
111b0 61 74 69 63 20 76 6f 69 64 20 6d 75 6c 74 69 43  atic void multiC
111c0 75 72 73 6f 72 52 65 61 64 53 65 70 61 72 61 74  ursorReadSeparat
111d0 6f 72 73 28 4d 75 6c 74 69 43 75 72 73 6f 72 20  ors(MultiCursor 
111e0 2a 70 43 73 72 29 7b 0a 20 20 69 66 28 20 70 43  *pCsr){.  if( pC
111f0 73 72 2d 3e 6e 50 74 72 3e 30 20 29 7b 0a 20 20  sr->nPtr>0 ){.  
11200 20 20 70 43 73 72 2d 3e 66 6c 61 67 73 20 7c 3d    pCsr->flags |=
11210 20 43 55 52 53 4f 52 5f 52 45 41 44 5f 53 45 50   CURSOR_READ_SEP
11220 41 52 41 54 4f 52 53 3b 0a 20 20 7d 0a 7d 0a 0a  ARATORS;.  }.}..
11230 2f 2a 0a 2a 2a 20 48 61 76 65 20 74 68 69 73 20  /*.** Have this 
11240 63 75 72 73 6f 72 20 73 6b 69 70 20 6f 76 65 72  cursor skip over
11250 20 53 4f 52 54 45 44 5f 44 45 4c 45 54 45 20 65   SORTED_DELETE e
11260 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
11270 63 20 76 6f 69 64 20 6d 75 6c 74 69 43 75 72 73  c void multiCurs
11280 6f 72 49 67 6e 6f 72 65 44 65 6c 65 74 65 28 4d  orIgnoreDelete(M
11290 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72  ultiCursor *pCsr
112a0 29 7b 0a 20 20 69 66 28 20 70 43 73 72 20 29 20  ){.  if( pCsr ) 
112b0 70 43 73 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43  pCsr->flags |= C
112c0 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 44 45 4c  URSOR_IGNORE_DEL
112d0 45 54 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  ETE;.}../*.** If
112e0 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20   the free-block 
112f0 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74  list is not empt
11300 79 2c 20 74 68 65 6e 20 68 61 76 65 20 74 68 69  y, then have thi
11310 73 20 63 75 72 73 6f 72 20 76 69 73 69 74 20 61  s cursor visit a
11320 20 6b 65 79 0a 2a 2a 20 77 69 74 68 20 28 61 29   key.** with (a)
11330 20 74 68 65 20 73 79 73 74 65 6d 20 62 69 74 20   the system bit 
11340 73 65 74 2c 20 61 6e 64 20 28 62 29 20 74 68 65  set, and (b) the
11350 20 6b 65 79 20 22 46 52 45 45 4c 49 53 54 22 20   key "FREELIST" 
11360 61 6e 64 20 28 63 29 20 61 20 76 61 6c 75 65 20  and (c) a value 
11370 0a 2a 2a 20 62 6c 6f 62 20 63 6f 6e 74 61 69 6e  .** blob contain
11380 69 6e 67 20 74 68 65 20 73 65 72 69 61 6c 69 7a  ing the serializ
11390 65 64 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69  ed free-block li
113a0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
113b0 74 20 6d 75 6c 74 69 43 75 72 73 6f 72 56 69 73  t multiCursorVis
113c0 69 74 46 72 65 65 6c 69 73 74 28 4d 75 6c 74 69  itFreelist(Multi
113d0 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
113e0 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b   int rc = LSM_OK
113f0 3b 0a 20 20 70 43 73 72 2d 3e 66 6c 61 67 73 20  ;.  pCsr->flags 
11400 7c 3d 20 43 55 52 53 4f 52 5f 46 4c 55 53 48 5f  |= CURSOR_FLUSH_
11410 46 52 45 45 4c 49 53 54 3b 0a 20 20 70 43 73 72  FREELIST;.  pCsr
11420 2d 3e 70 53 79 73 74 65 6d 56 61 6c 20 3d 20 6c  ->pSystemVal = l
11430 73 6d 4d 61 6c 6c 6f 63 52 63 28 70 43 73 72 2d  smMallocRc(pCsr-
11440 3e 70 44 62 2d 3e 70 45 6e 76 2c 20 34 20 2b 20  >pDb->pEnv, 4 + 
11450 38 2c 20 26 72 63 29 3b 0a 20 20 72 65 74 75 72  8, &rc);.  retur
11460 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
11470 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
11480 72 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  rn a new databas
11490 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
114a0 54 68 69 73 20 6d 65 74 68 6f 64 20 73 68 6f 75  This method shou
114b0 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
114c0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 75 73  d to allocate us
114d0 65 72 20 63 75 72 73 6f 72 73 2e 20 41 73 20 69  er cursors. As i
114e0 74 20 6d 61 79 0a 2a 2a 20 72 65 63 79 63 6c 65  t may.** recycle
114f0 20 61 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6c   a cursor from l
11500 73 6d 5f 64 62 2e 70 43 73 72 43 61 63 68 65 2e  sm_db.pCsrCache.
11510 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 4d 43 75 72 73  .*/.int lsmMCurs
11520 6f 72 4e 65 77 28 0a 20 20 6c 73 6d 5f 64 62 20  orNew(.  lsm_db 
11530 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
11540 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
11550 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
11560 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 2a 70   MultiCursor **p
11570 70 43 73 72 20 20 20 20 20 20 20 20 20 20 20 20  pCsr            
11580 20 2f 2a 20 4f 55 54 3a 20 41 6c 6c 6f 63 61 74   /* OUT: Allocat
11590 65 64 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ed cursor */.){.
115a0 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70    MultiCursor *p
115b0 43 73 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Csr = 0;.  int r
115c0 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20 20 69  c = LSM_OK;..  i
115d0 66 28 20 70 44 62 2d 3e 70 43 73 72 43 61 63 68  f( pDb->pCsrCach
115e0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 4f 6c  e ){.    int bOl
115f0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
11600 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
11610 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f 6c  f there is an ol
11620 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65  d in-memory tree
11630 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f   */..    /* Remo
11640 76 65 20 61 20 63 75 72 73 6f 72 20 66 72 6f 6d  ve a cursor from
11650 20 74 68 65 20 70 43 73 72 43 61 63 68 65 20 6c   the pCsrCache l
11660 69 73 74 20 61 6e 64 20 61 64 64 20 69 74 20 74  ist and add it t
11670 6f 20 74 68 65 20 6f 70 65 6e 20 6c 69 73 74 2e  o the open list.
11680 20 2a 2f 0a 20 20 20 20 70 43 73 72 20 3d 20 70   */.    pCsr = p
11690 44 62 2d 3e 70 43 73 72 43 61 63 68 65 3b 0a 20  Db->pCsrCache;. 
116a0 20 20 20 70 44 62 2d 3e 70 43 73 72 43 61 63 68     pDb->pCsrCach
116b0 65 20 3d 20 70 43 73 72 2d 3e 70 4e 65 78 74 3b  e = pCsr->pNext;
116c0 0a 20 20 20 20 70 43 73 72 2d 3e 70 4e 65 78 74  .    pCsr->pNext
116d0 20 3d 20 70 44 62 2d 3e 70 43 73 72 3b 0a 20 20   = pDb->pCsr;.  
116e0 20 20 70 44 62 2d 3e 70 43 73 72 20 3d 20 70 43    pDb->pCsr = pC
116f0 73 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  sr;..    /* The 
11700 63 75 72 73 6f 72 20 63 61 6e 20 61 6c 6d 6f 73  cursor can almos
11710 74 20 62 65 20 75 73 65 64 20 61 73 20 69 73 2c  t be used as is,
11720 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
11730 20 6f 6c 64 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20   old in-memory. 
11740 20 20 20 2a 2a 20 74 72 65 65 20 63 75 72 73 6f     ** tree curso
11750 72 20 6d 61 79 20 62 65 20 70 72 65 73 65 6e 74  r may be present
11760 20 61 6e 64 20 6e 6f 74 20 72 65 71 75 69 72 65   and not require
11770 64 2c 20 6f 72 20 72 65 71 75 69 72 65 64 20 61  d, or required a
11780 6e 64 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 70 72  nd not.    ** pr
11790 65 73 65 6e 74 2e 20 46 69 78 20 74 68 69 73 20  esent. Fix this 
117a0 69 66 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f  if required.  */
117b0 0a 20 20 20 20 62 4f 6c 64 20 3d 20 28 6c 73 6d  .    bOld = (lsm
117c0 54 72 65 65 48 61 73 4f 6c 64 28 70 44 62 29 20  TreeHasOld(pDb) 
117d0 26 26 20 70 44 62 2d 3e 74 72 65 65 68 64 72 2e  && pDb->treehdr.
117e0 69 4f 6c 64 4c 6f 67 21 3d 70 44 62 2d 3e 70 43  iOldLog!=pDb->pC
117f0 6c 69 65 6e 74 2d 3e 69 4c 6f 67 4f 66 66 29 3b  lient->iLogOff);
11800 0a 20 20 20 20 69 66 28 20 21 62 4f 6c 64 20 26  .    if( !bOld &
11810 26 20 70 43 73 72 2d 3e 61 70 54 72 65 65 43 73  & pCsr->apTreeCs
11820 72 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 6c 73  r[1] ){.      ls
11830 6d 54 72 65 65 43 75 72 73 6f 72 44 65 73 74 72  mTreeCursorDestr
11840 6f 79 28 70 43 73 72 2d 3e 61 70 54 72 65 65 43  oy(pCsr->apTreeC
11850 73 72 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 43  sr[1]);.      pC
11860 73 72 2d 3e 61 70 54 72 65 65 43 73 72 5b 31 5d  sr->apTreeCsr[1]
11870 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
11880 69 66 28 20 62 4f 6c 64 20 26 26 20 21 70 43 73  if( bOld && !pCs
11890 72 2d 3e 61 70 54 72 65 65 43 73 72 5b 31 5d 20  r->apTreeCsr[1] 
118a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 73  ){.      rc = ls
118b0 6d 54 72 65 65 43 75 72 73 6f 72 4e 65 77 28 70  mTreeCursorNew(p
118c0 44 62 2c 20 31 2c 20 26 70 43 73 72 2d 3e 61 70  Db, 1, &pCsr->ap
118d0 54 72 65 65 43 73 72 5b 31 5d 29 3b 0a 20 20 20  TreeCsr[1]);.   
118e0 20 7d 0a 0a 20 20 20 20 70 43 73 72 2d 3e 66 6c   }..    pCsr->fl
118f0 61 67 73 20 3d 20 28 43 55 52 53 4f 52 5f 49 47  ags = (CURSOR_IG
11900 4e 4f 52 45 5f 53 59 53 54 45 4d 20 7c 20 43 55  NORE_SYSTEM | CU
11910 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 44 45 4c 45  RSOR_IGNORE_DELE
11920 54 45 29 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  TE);..  }else{. 
11930 20 20 20 70 43 73 72 20 3d 20 6d 75 6c 74 69 43     pCsr = multiC
11940 75 72 73 6f 72 4e 65 77 28 70 44 62 2c 20 26 72  ursorNew(pDb, &r
11950 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  c);.    if( rc==
11960 4c 53 4d 5f 4f 4b 20 29 20 72 63 20 3d 20 6d 75  LSM_OK ) rc = mu
11970 6c 74 69 43 75 72 73 6f 72 49 6e 69 74 28 70 43  ltiCursorInit(pC
11980 73 72 2c 20 70 44 62 2d 3e 70 43 6c 69 65 6e 74  sr, pDb->pClient
11990 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
119a0 21 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=LSM_OK ){.    
119b0 6c 73 6d 4d 43 75 72 73 6f 72 43 6c 6f 73 65 28  lsmMCursorClose(
119c0 70 43 73 72 2c 20 30 29 3b 0a 20 20 20 20 70 43  pCsr, 0);.    pC
119d0 73 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  sr = 0;.  }.  as
119e0 73 65 72 74 28 20 28 72 63 3d 3d 4c 53 4d 5f 4f  sert( (rc==LSM_O
119f0 4b 29 3d 3d 28 70 43 73 72 21 3d 30 29 20 29 3b  K)==(pCsr!=0) );
11a00 0a 20 20 2a 70 70 43 73 72 20 3d 20 70 43 73 72  .  *ppCsr = pCsr
11a10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11a20 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  ..static int mul
11a30 74 69 43 75 72 73 6f 72 47 65 74 56 61 6c 28 0a  tiCursorGetVal(.
11a40 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70    MultiCursor *p
11a50 43 73 72 2c 20 0a 20 20 69 6e 74 20 69 56 61 6c  Csr, .  int iVal
11a60 2c 20 0a 20 20 76 6f 69 64 20 2a 2a 70 70 56 61  , .  void **ppVa
11a70 6c 2c 20 0a 20 20 69 6e 74 20 2a 70 6e 56 61 6c  l, .  int *pnVal
11a80 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c  .){.  int rc = L
11a90 53 4d 5f 4f 4b 3b 0a 0a 20 20 2a 70 70 56 61 6c  SM_OK;..  *ppVal
11aa0 20 3d 20 30 3b 0a 20 20 2a 70 6e 56 61 6c 20 3d   = 0;.  *pnVal =
11ab0 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 69   0;..  switch( i
11ac0 56 61 6c 20 29 7b 0a 20 20 20 20 63 61 73 65 20  Val ){.    case 
11ad0 43 55 52 53 4f 52 5f 44 41 54 41 5f 54 52 45 45  CURSOR_DATA_TREE
11ae0 30 3a 0a 20 20 20 20 63 61 73 65 20 43 55 52 53  0:.    case CURS
11af0 4f 52 5f 44 41 54 41 5f 54 52 45 45 31 3a 20 7b  OR_DATA_TREE1: {
11b00 0a 20 20 20 20 20 20 54 72 65 65 43 75 72 73 6f  .      TreeCurso
11b10 72 20 2a 70 54 72 65 65 43 73 72 20 3d 20 70 43  r *pTreeCsr = pC
11b20 73 72 2d 3e 61 70 54 72 65 65 43 73 72 5b 69 56  sr->apTreeCsr[iV
11b30 61 6c 2d 43 55 52 53 4f 52 5f 44 41 54 41 5f 54  al-CURSOR_DATA_T
11b40 52 45 45 30 5d 3b 0a 20 20 20 20 20 20 69 66 28  REE0];.      if(
11b50 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 56 61   lsmTreeCursorVa
11b60 6c 69 64 28 70 54 72 65 65 43 73 72 29 20 29 7b  lid(pTreeCsr) ){
11b70 0a 20 20 20 20 20 20 20 20 6c 73 6d 54 72 65 65  .        lsmTree
11b80 43 75 72 73 6f 72 56 61 6c 75 65 28 70 54 72 65  CursorValue(pTre
11b90 65 43 73 72 2c 20 70 70 56 61 6c 2c 20 70 6e 56  eCsr, ppVal, pnV
11ba0 61 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  al);.      }else
11bb0 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 56 61 6c  {.        *ppVal
11bc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2a 70   = 0;.        *p
11bd0 6e 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nVal = 0;.      
11be0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11bf0 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 43     }..    case C
11c00 55 52 53 4f 52 5f 44 41 54 41 5f 53 59 53 54 45  URSOR_DATA_SYSTE
11c10 4d 3a 20 7b 0a 20 20 20 20 20 20 53 6e 61 70 73  M: {.      Snaps
11c20 68 6f 74 20 2a 70 57 6f 72 6b 65 72 20 3d 20 70  hot *pWorker = p
11c30 43 73 72 2d 3e 70 44 62 2d 3e 70 57 6f 72 6b 65  Csr->pDb->pWorke
11c40 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 6f  r;.      if( pWo
11c50 72 6b 65 72 20 0a 20 20 20 20 20 20 20 26 26 20  rker .       && 
11c60 28 70 43 73 72 2d 3e 69 46 72 65 65 20 25 20 32  (pCsr->iFree % 2
11c70 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )==0.       && p
11c80 43 73 72 2d 3e 69 46 72 65 65 20 3c 20 28 70 57  Csr->iFree < (pW
11c90 6f 72 6b 65 72 2d 3e 66 72 65 65 6c 69 73 74 2e  orker->freelist.
11ca0 6e 45 6e 74 72 79 2a 32 29 0a 20 20 20 20 20 20  nEntry*2).      
11cb0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
11cc0 45 6e 74 72 79 20 3d 20 70 57 6f 72 6b 65 72 2d  Entry = pWorker-
11cd0 3e 66 72 65 65 6c 69 73 74 2e 6e 45 6e 74 72 79  >freelist.nEntry
11ce0 20 2d 20 31 20 2d 20 28 70 43 73 72 2d 3e 69 46   - 1 - (pCsr->iF
11cf0 72 65 65 20 2f 20 32 29 3b 0a 20 20 20 20 20 20  ree / 2);.      
11d00 20 20 75 38 20 2a 61 56 61 6c 20 3d 20 26 28 28    u8 *aVal = &((
11d10 75 38 20 2a 29 28 70 43 73 72 2d 3e 70 53 79 73  u8 *)(pCsr->pSys
11d20 74 65 6d 56 61 6c 29 29 5b 34 5d 3b 0a 20 20 20  temVal))[4];.   
11d30 20 20 20 20 20 6c 73 6d 50 75 74 55 36 34 28 61       lsmPutU64(a
11d40 56 61 6c 2c 20 70 57 6f 72 6b 65 72 2d 3e 66 72  Val, pWorker->fr
11d50 65 65 6c 69 73 74 2e 61 45 6e 74 72 79 5b 69 45  eelist.aEntry[iE
11d60 6e 74 72 79 5d 2e 69 49 64 29 3b 0a 20 20 20 20  ntry].iId);.    
11d70 20 20 20 20 2a 70 70 56 61 6c 20 3d 20 61 56 61      *ppVal = aVa
11d80 6c 3b 0a 20 20 20 20 20 20 20 20 2a 70 6e 56 61  l;.        *pnVa
11d90 6c 20 3d 20 38 3b 0a 20 20 20 20 20 20 7d 0a 20  l = 8;.      }. 
11da0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11db0 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  }..    default: 
11dc0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72  {.      int iPtr
11dd0 20 3d 20 69 56 61 6c 2d 43 55 52 53 4f 52 5f 44   = iVal-CURSOR_D
11de0 41 54 41 5f 53 45 47 4d 45 4e 54 3b 0a 20 20 20  ATA_SEGMENT;.   
11df0 20 20 20 69 66 28 20 69 50 74 72 3c 70 43 73 72     if( iPtr<pCsr
11e00 2d 3e 6e 50 74 72 20 29 7b 0a 20 20 20 20 20 20  ->nPtr ){.      
11e10 20 20 53 65 67 6d 65 6e 74 50 74 72 20 2a 70 50    SegmentPtr *pP
11e20 74 72 20 3d 20 26 70 43 73 72 2d 3e 61 50 74 72  tr = &pCsr->aPtr
11e30 5b 69 50 74 72 5d 3b 0a 20 20 20 20 20 20 20 20  [iPtr];.        
11e40 69 66 28 20 70 50 74 72 2d 3e 70 50 67 20 29 7b  if( pPtr->pPg ){
11e50 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 56 61  .          *ppVa
11e60 6c 20 3d 20 70 50 74 72 2d 3e 70 56 61 6c 3b 0a  l = pPtr->pVal;.
11e70 20 20 20 20 20 20 20 20 20 20 2a 70 6e 56 61 6c            *pnVal
11e80 20 3d 20 70 50 74 72 2d 3e 6e 56 61 6c 3b 0a 20   = pPtr->nVal;. 
11e90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11ea0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
11eb0 73 65 72 74 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  sert( rc==LSM_OK
11ec0 20 7c 7c 20 28 2a 70 70 56 61 6c 3d 3d 30 20 26   || (*ppVal==0 &
11ed0 26 20 2a 70 6e 56 61 6c 3d 3d 30 29 20 29 3b 0a  & *pnVal==0) );.
11ee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11ef0 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
11f00 43 75 72 73 6f 72 41 64 76 61 6e 63 65 28 4d 75  CursorAdvance(Mu
11f10 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  ltiCursor *pCsr,
11f20 20 69 6e 74 20 62 52 65 76 65 72 73 65 29 3b 0a   int bReverse);.
11f30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11f40 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
11f50 79 20 77 6f 72 6b 65 72 20 63 6f 6e 6e 65 63 74  y worker connect
11f60 69 6f 6e 73 20 74 6f 20 77 61 6c 6b 20 74 68 65  ions to walk the
11f70 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20   part of the.** 
11f80 66 72 65 65 2d 6c 69 73 74 20 73 74 6f 72 65 64  free-list stored
11f90 20 77 69 74 68 69 6e 20 74 68 65 20 4c 53 4d 20   within the LSM 
11fa0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 0a  data structure..
11fb0 2a 2f 0a 69 6e 74 20 6c 73 6d 53 6f 72 74 65 64  */.int lsmSorted
11fc0 57 61 6c 6b 46 72 65 65 6c 69 73 74 28 0a 20 20  WalkFreelist(.  
11fd0 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 20 20 20  lsm_db *pDb,    
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ff0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
12000 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  le */.  int bRev
12010 65 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  erse,           
12020 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12030 74 6f 20 69 74 65 72 61 74 65 20 66 72 6f 6d 20  to iterate from 
12040 6c 61 72 67 65 73 74 20 74 6f 20 73 6d 61 6c 6c  largest to small
12050 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  est */.  int (*x
12060 29 28 76 6f 69 64 20 2a 2c 20 69 6e 74 2c 20 69  )(void *, int, i
12070 36 34 29 2c 20 20 20 20 20 2f 2a 20 43 61 6c 6c  64),     /* Call
12080 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  back function */
12090 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 20 20 20  .  void *pCtx   
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
120c0 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
120d0 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  callback */.){. 
120e0 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43   MultiCursor *pC
120f0 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sr;             
12100 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64 20   /* Cursor used 
12110 74 6f 20 72 65 61 64 20 64 62 20 2a 2f 0a 20 20  to read db */.  
12120 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b  int rc = LSM_OK;
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
12150 2f 0a 20 20 53 6e 61 70 73 68 6f 74 20 2a 70 53  /.  Snapshot *pS
12160 6e 61 70 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  nap = 0;..  asse
12170 72 74 28 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72  rt( pDb->pWorker
12180 20 29 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 62   );.  if( pDb->b
12190 49 6e 63 72 4d 65 72 67 65 20 29 7b 0a 20 20 20  IncrMerge ){.   
121a0 20 72 63 20 3d 20 6c 73 6d 43 68 65 63 6b 70 6f   rc = lsmCheckpo
121b0 69 6e 74 44 65 73 65 72 69 61 6c 69 7a 65 28 70  intDeserialize(p
121c0 44 62 2c 20 30 2c 20 70 44 62 2d 3e 70 53 68 6d  Db, 0, pDb->pShm
121d0 68 64 72 2d 3e 61 53 6e 61 70 31 2c 20 26 70 53  hdr->aSnap1, &pS
121e0 6e 61 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nap);.    if( rc
121f0 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72 65 74 75 72  !=LSM_OK ) retur
12200 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  n rc;.  }else{. 
12210 20 20 20 70 53 6e 61 70 20 3d 20 70 44 62 2d 3e     pSnap = pDb->
12220 70 57 6f 72 6b 65 72 3b 0a 20 20 7d 0a 0a 20 20  pWorker;.  }..  
12230 70 43 73 72 20 3d 20 6d 75 6c 74 69 43 75 72 73  pCsr = multiCurs
12240 6f 72 4e 65 77 28 70 44 62 2c 20 26 72 63 29 3b  orNew(pDb, &rc);
12250 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20  .  if( pCsr ){. 
12260 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72     rc = multiCur
12270 73 6f 72 41 64 64 41 6c 6c 28 70 43 73 72 2c 20  sorAddAll(pCsr, 
12280 70 53 6e 61 70 29 3b 0a 20 20 20 20 70 43 73 72  pSnap);.    pCsr
12290 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 55 52 53 4f  ->flags |= CURSO
122a0 52 5f 49 47 4e 4f 52 45 5f 44 45 4c 45 54 45 3b  R_IGNORE_DELETE;
122b0 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
122c0 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
122d0 69 66 28 20 62 52 65 76 65 72 73 65 3d 3d 30 20  if( bReverse==0 
122e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 73  ){.      rc = ls
122f0 6d 4d 43 75 72 73 6f 72 4c 61 73 74 28 70 43 73  mMCursorLast(pCs
12300 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
12310 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 4d 43 75       rc = lsmMCu
12320 72 73 6f 72 53 65 65 6b 28 70 43 73 72 2c 20 31  rsorSeek(pCsr, 1
12330 2c 20 22 22 2c 20 30 2c 20 4c 53 4d 5f 53 45 45  , "", 0, LSM_SEE
12340 4b 5f 47 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  K_GE);.    }..  
12350 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 4c 53 4d    while( rc==LSM
12360 5f 4f 4b 20 26 26 20 6c 73 6d 4d 43 75 72 73 6f  _OK && lsmMCurso
12370 72 56 61 6c 69 64 28 70 43 73 72 29 20 26 26 20  rValid(pCsr) && 
12380 72 74 49 73 53 79 73 74 65 6d 28 70 43 73 72 2d  rtIsSystem(pCsr-
12390 3e 65 54 79 70 65 29 20 29 7b 0a 20 20 20 20 20  >eType) ){.     
123a0 20 76 6f 69 64 20 2a 70 4b 65 79 3b 20 69 6e 74   void *pKey; int
123b0 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 76 6f 69   nKey;.      voi
123c0 64 20 2a 70 56 61 6c 3b 20 69 6e 74 20 6e 56 61  d *pVal; int nVa
123d0 6c 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  l;..      rc = l
123e0 73 6d 4d 43 75 72 73 6f 72 4b 65 79 28 70 43 73  smMCursorKey(pCs
123f0 72 2c 20 26 70 4b 65 79 2c 20 26 6e 4b 65 79 29  r, &pKey, &nKey)
12400 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
12410 4c 53 4d 5f 4f 4b 20 29 20 72 63 20 3d 20 6c 73  LSM_OK ) rc = ls
12420 6d 4d 43 75 72 73 6f 72 56 61 6c 75 65 28 70 43  mMCursorValue(pC
12430 73 72 2c 20 26 70 56 61 6c 2c 20 26 6e 56 61 6c  sr, &pVal, &nVal
12440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
12450 3d 4c 53 4d 5f 4f 4b 20 26 26 20 28 6e 4b 65 79  =LSM_OK && (nKey
12460 21 3d 34 20 7c 7c 20 6e 56 61 6c 21 3d 38 29 20  !=4 || nVal!=8) 
12470 29 20 72 63 20 3d 20 4c 53 4d 5f 43 4f 52 52 55  ) rc = LSM_CORRU
12480 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 20 20  PT_BKPT;..      
12490 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  if( rc==LSM_OK )
124a0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 42  {.        int iB
124b0 6c 6b 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20  lk;.        i64 
124c0 69 53 6e 61 70 3b 0a 20 20 20 20 20 20 20 20 69  iSnap;.        i
124d0 42 6c 6b 20 3d 20 28 69 6e 74 29 28 7e 28 6c 73  Blk = (int)(~(ls
124e0 6d 47 65 74 55 33 32 28 28 75 38 20 2a 29 70 4b  mGetU32((u8 *)pK
124f0 65 79 29 29 29 3b 0a 20 20 20 20 20 20 20 20 69  ey)));.        i
12500 53 6e 61 70 20 3d 20 28 69 36 34 29 6c 73 6d 47  Snap = (i64)lsmG
12510 65 74 55 36 34 28 28 75 38 20 2a 29 70 56 61 6c  etU64((u8 *)pVal
12520 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  );.        if( x
12530 28 70 43 74 78 2c 20 69 42 6c 6b 2c 20 69 53 6e  (pCtx, iBlk, iSn
12540 61 70 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ap) ) break;.   
12550 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 43       rc = multiC
12560 75 72 73 6f 72 41 64 76 61 6e 63 65 28 70 43 73  ursorAdvance(pCs
12570 72 2c 20 21 62 52 65 76 65 72 73 65 29 3b 0a 20  r, !bReverse);. 
12580 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
12590 0a 0a 20 20 6c 73 6d 4d 43 75 72 73 6f 72 43 6c  ..  lsmMCursorCl
125a0 6f 73 65 28 70 43 73 72 2c 20 30 29 3b 0a 20 20  ose(pCsr, 0);.  
125b0 69 66 28 20 70 53 6e 61 70 21 3d 70 44 62 2d 3e  if( pSnap!=pDb->
125c0 70 57 6f 72 6b 65 72 20 29 7b 0a 20 20 20 20 6c  pWorker ){.    l
125d0 73 6d 46 72 65 65 53 6e 61 70 73 68 6f 74 28 70  smFreeSnapshot(p
125e0 44 62 2d 3e 70 45 6e 76 2c 20 70 53 6e 61 70 29  Db->pEnv, pSnap)
125f0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
12600 72 63 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 53 6f  rc;.}..int lsmSo
12610 72 74 65 64 4c 6f 61 64 46 72 65 65 6c 69 73 74  rtedLoadFreelist
12620 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c  (.  lsm_db *pDb,
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12640 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12650 68 61 6e 64 6c 65 20 28 6d 75 73 74 20 62 65 20  handle (must be 
12660 77 6f 72 6b 65 72 29 20 2a 2f 0a 20 20 76 6f 69  worker) */.  voi
12670 64 20 2a 2a 70 70 56 61 6c 2c 20 20 20 20 20 20  d **ppVal,      
12680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12690 4f 55 54 3a 20 42 6c 6f 62 20 63 6f 6e 74 61 69  OUT: Blob contai
126a0 6e 69 6e 67 20 4c 53 4d 20 66 72 65 65 2d 6c 69  ning LSM free-li
126b0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 56  st */.  int *pnV
126c0 61 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  al              
126d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
126e0 53 69 7a 65 20 6f 66 20 2a 70 70 56 61 6c 20 62  Size of *ppVal b
126f0 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  lob in bytes */.
12700 29 7b 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72  ){.  MultiCursor
12710 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20 20   *pCsr;         
12720 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 75       /* Cursor u
12730 73 65 64 20 74 6f 20 72 65 74 72 65 69 76 65 20  sed to retreive 
12740 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
12750 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20  nt rc = LSM_OK; 
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12770 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
12780 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
12790 3e 70 57 6f 72 6b 65 72 20 29 3b 0a 20 20 61 73  >pWorker );.  as
127a0 73 65 72 74 28 20 2a 70 70 56 61 6c 3d 3d 30 20  sert( *ppVal==0 
127b0 26 26 20 2a 70 6e 56 61 6c 3d 3d 30 20 29 3b 0a  && *pnVal==0 );.
127c0 0a 20 20 70 43 73 72 20 3d 20 6d 75 6c 74 69 43  .  pCsr = multiC
127d0 75 72 73 6f 72 4e 65 77 28 70 44 62 2c 20 26 72  ursorNew(pDb, &r
127e0 63 29 3b 0a 20 20 69 66 28 20 70 43 73 72 20 29  c);.  if( pCsr )
127f0 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
12800 43 75 72 73 6f 72 41 64 64 41 6c 6c 28 70 43 73  CursorAddAll(pCs
12810 72 2c 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 29  r, pDb->pWorker)
12820 3b 0a 20 20 20 20 70 43 73 72 2d 3e 66 6c 61 67  ;.    pCsr->flag
12830 73 20 7c 3d 20 43 55 52 53 4f 52 5f 49 47 4e 4f  s |= CURSOR_IGNO
12840 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 20  RE_DELETE;.  }. 
12850 20 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f   .  if( rc==LSM_
12860 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c  OK ){.    rc = l
12870 73 6d 4d 43 75 72 73 6f 72 4c 61 73 74 28 70 43  smMCursorLast(pC
12880 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  sr);.    if( rc=
12890 3d 4c 53 4d 5f 4f 4b 20 0a 20 20 20 20 20 26 26  =LSM_OK .     &&
128a0 20 72 74 49 73 57 72 69 74 65 28 70 43 73 72 2d   rtIsWrite(pCsr-
128b0 3e 65 54 79 70 65 29 20 26 26 20 72 74 49 73 53  >eType) && rtIsS
128c0 79 73 74 65 6d 28 70 43 73 72 2d 3e 65 54 79 70  ystem(pCsr->eTyp
128d0 65 29 0a 20 20 20 20 20 26 26 20 70 43 73 72 2d  e).     && pCsr-
128e0 3e 6b 65 79 2e 6e 44 61 74 61 3d 3d 38 20 0a 20  >key.nData==8 . 
128f0 20 20 20 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70      && 0==memcmp
12900 28 70 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74 61  (pCsr->key.pData
12910 2c 20 22 46 52 45 45 4c 49 53 54 22 2c 20 38 29  , "FREELIST", 8)
12920 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 76 6f  .    ){.      vo
12930 69 64 20 2a 70 56 61 6c 3b 20 69 6e 74 20 6e 56  id *pVal; int nV
12940 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56  al;         /* V
12950 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 64  alue read from d
12960 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
12970 20 72 63 20 3d 20 6c 73 6d 4d 43 75 72 73 6f 72   rc = lsmMCursor
12980 56 61 6c 75 65 28 70 43 73 72 2c 20 26 70 56 61  Value(pCsr, &pVa
12990 6c 2c 20 26 6e 56 61 6c 29 3b 0a 20 20 20 20 20  l, &nVal);.     
129a0 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
129b0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 56 61  ){.        *ppVa
129c0 6c 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 52 63 28  l = lsmMallocRc(
129d0 70 44 62 2d 3e 70 45 6e 76 2c 20 6e 56 61 6c 2c  pDb->pEnv, nVal,
129e0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
129f0 66 28 20 2a 70 70 56 61 6c 20 29 7b 0a 20 20 20  f( *ppVal ){.   
12a00 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 2a 70         memcpy(*p
12a10 70 56 61 6c 2c 20 70 56 61 6c 2c 20 6e 56 61 6c  pVal, pVal, nVal
12a20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e  );.          *pn
12a30 56 61 6c 20 3d 20 6e 56 61 6c 3b 0a 20 20 20 20  Val = nVal;.    
12a40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12a50 20 20 7d 0a 0a 20 20 20 20 6c 73 6d 4d 43 75 72    }..    lsmMCur
12a60 73 6f 72 43 6c 6f 73 65 28 70 43 73 72 2c 20 30  sorClose(pCsr, 0
12a70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
12a80 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
12a90 6e 74 20 6d 75 6c 74 69 43 75 72 73 6f 72 41 6c  nt multiCursorAl
12aa0 6c 6f 63 54 72 65 65 28 4d 75 6c 74 69 43 75 72  locTree(MultiCur
12ab0 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e  sor *pCsr){.  in
12ac0 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20  t rc = LSM_OK;. 
12ad0 20 69 66 28 20 70 43 73 72 2d 3e 61 54 72 65 65   if( pCsr->aTree
12ae0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
12af0 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
12b00 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
12b10 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
12b20 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 20 20 69 6e  locate */.    in
12b30 74 20 6e 4d 69 6e 3b 20 20 20 20 20 20 20 20 20  t nMin;         
12b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12b50 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  otal number of c
12b60 75 72 73 6f 72 73 20 62 65 69 6e 67 20 6d 65 72  ursors being mer
12b70 67 65 64 20 2a 2f 0a 0a 20 20 20 20 6e 4d 69 6e  ged */..    nMin
12b80 20 3d 20 43 55 52 53 4f 52 5f 44 41 54 41 5f 53   = CURSOR_DATA_S
12b90 45 47 4d 45 4e 54 20 2b 20 70 43 73 72 2d 3e 6e  EGMENT + pCsr->n
12ba0 50 74 72 20 2b 20 28 70 43 73 72 2d 3e 70 42 74  Ptr + (pCsr->pBt
12bb0 43 73 72 21 3d 30 29 3b 0a 20 20 20 20 70 43 73  Csr!=0);.    pCs
12bc0 72 2d 3e 6e 54 72 65 65 20 3d 20 32 3b 0a 20 20  r->nTree = 2;.  
12bd0 20 20 77 68 69 6c 65 28 20 70 43 73 72 2d 3e 6e    while( pCsr->n
12be0 54 72 65 65 3c 6e 4d 69 6e 20 29 7b 0a 20 20 20  Tree<nMin ){.   
12bf0 20 20 20 70 43 73 72 2d 3e 6e 54 72 65 65 20 3d     pCsr->nTree =
12c00 20 70 43 73 72 2d 3e 6e 54 72 65 65 2a 32 3b 0a   pCsr->nTree*2;.
12c10 20 20 20 20 7d 0a 0a 20 20 20 20 6e 42 79 74 65      }..    nByte
12c20 20 3d 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70   = sizeof(int)*p
12c30 43 73 72 2d 3e 6e 54 72 65 65 2a 32 3b 0a 20 20  Csr->nTree*2;.  
12c40 20 20 70 43 73 72 2d 3e 61 54 72 65 65 20 3d 20    pCsr->aTree = 
12c50 28 69 6e 74 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63  (int *)lsmMalloc
12c60 5a 65 72 6f 52 63 28 70 43 73 72 2d 3e 70 44 62  ZeroRc(pCsr->pDb
12c70 2d 3e 70 45 6e 76 2c 20 6e 42 79 74 65 2c 20 26  ->pEnv, nByte, &
12c80 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
12c90 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
12ca0 76 6f 69 64 20 6d 75 6c 74 69 43 75 72 73 6f 72  void multiCursor
12cb0 43 61 63 68 65 4b 65 79 28 4d 75 6c 74 69 43 75  CacheKey(MultiCu
12cc0 72 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20  rsor *pCsr, int 
12cd0 2a 70 52 63 29 7b 0a 20 20 69 66 28 20 2a 70 52  *pRc){.  if( *pR
12ce0 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20  c==LSM_OK ){.   
12cf0 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20   void *pKey;.   
12d00 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 6d   int nKey;.    m
12d10 75 6c 74 69 43 75 72 73 6f 72 47 65 74 4b 65 79  ultiCursorGetKey
12d20 28 70 43 73 72 2c 20 70 43 73 72 2d 3e 61 54 72  (pCsr, pCsr->aTr
12d30 65 65 5b 31 5d 2c 20 26 70 43 73 72 2d 3e 65 54  ee[1], &pCsr->eT
12d40 79 70 65 2c 20 26 70 4b 65 79 2c 20 26 6e 4b 65  ype, &pKey, &nKe
12d50 79 29 3b 0a 20 20 20 20 2a 70 52 63 20 3d 20 73  y);.    *pRc = s
12d60 6f 72 74 65 64 42 6c 6f 62 53 65 74 28 70 43 73  ortedBlobSet(pCs
12d70 72 2d 3e 70 44 62 2d 3e 70 45 6e 76 2c 20 26 70  r->pDb->pEnv, &p
12d80 43 73 72 2d 3e 6b 65 79 2c 20 70 4b 65 79 2c 20  Csr->key, pKey, 
12d90 6e 4b 65 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  nKey);.  }.}..#i
12da0 66 64 65 66 20 4c 53 4d 5f 44 45 42 55 47 5f 45  fdef LSM_DEBUG_E
12db0 58 50 45 4e 53 49 56 45 0a 73 74 61 74 69 63 20  XPENSIVE.static 
12dc0 76 6f 69 64 20 61 73 73 65 72 74 43 75 72 73 6f  void assertCurso
12dd0 72 54 72 65 65 28 4d 75 6c 74 69 43 75 72 73 6f  rTree(MultiCurso
12de0 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20  r *pCsr){.  int 
12df0 62 52 65 76 20 3d 20 21 21 28 70 43 73 72 2d 3e  bRev = !!(pCsr->
12e00 66 6c 61 67 73 20 26 20 43 55 52 53 4f 52 5f 50  flags & CURSOR_P
12e10 52 45 56 5f 4f 4b 29 3b 0a 20 20 69 6e 74 20 2a  REV_OK);.  int *
12e20 61 53 61 76 65 20 3d 20 70 43 73 72 2d 3e 61 54  aSave = pCsr->aT
12e30 72 65 65 3b 0a 20 20 69 6e 74 20 6e 53 61 76 65  ree;.  int nSave
12e40 20 3d 20 70 43 73 72 2d 3e 6e 54 72 65 65 3b 0a   = pCsr->nTree;.
12e50 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 43 73    int rc;..  pCs
12e60 72 2d 3e 61 54 72 65 65 20 3d 20 30 3b 0a 20 20  r->aTree = 0;.  
12e70 70 43 73 72 2d 3e 6e 54 72 65 65 20 3d 20 30 3b  pCsr->nTree = 0;
12e80 0a 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72  .  rc = multiCur
12e90 73 6f 72 41 6c 6c 6f 63 54 72 65 65 28 70 43 73  sorAllocTree(pCs
12ea0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53  r);.  if( rc==LS
12eb0 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  M_OK ){.    int 
12ec0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 43 73  i;.    for(i=pCs
12ed0 72 2d 3e 6e 54 72 65 65 2d 31 3b 20 69 3e 30 3b  r->nTree-1; i>0;
12ee0 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6d 75 6c   i--){.      mul
12ef0 74 69 43 75 72 73 6f 72 44 6f 43 6f 6d 70 61 72  tiCursorDoCompar
12f00 65 28 70 43 73 72 2c 20 69 2c 20 62 52 65 76 29  e(pCsr, i, bRev)
12f10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
12f20 65 72 74 28 20 6e 53 61 76 65 3d 3d 70 43 73 72  ert( nSave==pCsr
12f30 2d 3e 6e 54 72 65 65 20 0a 20 20 20 20 20 20 20  ->nTree .       
12f40 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 53   && 0==memcmp(aS
12f50 61 76 65 2c 20 70 43 73 72 2d 3e 61 54 72 65 65  ave, pCsr->aTree
12f60 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 53  , sizeof(int)*nS
12f70 61 76 65 29 0a 20 20 20 20 29 3b 0a 0a 20 20 20  ave).    );..   
12f80 20 6c 73 6d 46 72 65 65 28 70 43 73 72 2d 3e 70   lsmFree(pCsr->p
12f90 44 62 2d 3e 70 45 6e 76 2c 20 70 43 73 72 2d 3e  Db->pEnv, pCsr->
12fa0 61 54 72 65 65 29 3b 0a 20 20 7d 0a 0a 20 20 70  aTree);.  }..  p
12fb0 43 73 72 2d 3e 61 54 72 65 65 20 3d 20 61 53 61  Csr->aTree = aSa
12fc0 76 65 3b 0a 20 20 70 43 73 72 2d 3e 6e 54 72 65  ve;.  pCsr->nTre
12fd0 65 20 3d 20 6e 53 61 76 65 3b 0a 7d 0a 23 65 6c  e = nSave;.}.#el
12fe0 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
12ff0 72 74 43 75 72 73 6f 72 54 72 65 65 28 78 29 0a  rtCursorTree(x).
13000 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
13010 6e 74 20 6d 63 75 72 73 6f 72 4c 6f 63 61 74 69  nt mcursorLocati
13020 6f 6e 4f 6b 28 4d 75 6c 74 69 43 75 72 73 6f 72  onOk(MultiCursor
13030 20 2a 70 43 73 72 2c 20 69 6e 74 20 62 44 65 6c   *pCsr, int bDel
13040 65 74 65 4f 6b 29 7b 0a 20 20 69 6e 74 20 65 54  eteOk){.  int eT
13050 79 70 65 20 3d 20 70 43 73 72 2d 3e 65 54 79 70  ype = pCsr->eTyp
13060 65 3b 0a 20 20 69 6e 74 20 69 4b 65 79 3b 0a 20  e;.  int iKey;. 
13070 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 64   int i;.  int rd
13080 6d 61 73 6b 3b 0a 20 20 0a 20 20 61 73 73 65 72  mask;.  .  asser
13090 74 28 20 70 43 73 72 2d 3e 66 6c 61 67 73 20 26  t( pCsr->flags &
130a0 20 28 43 55 52 53 4f 52 5f 4e 45 58 54 5f 4f 4b   (CURSOR_NEXT_OK
130b0 7c 43 55 52 53 4f 52 5f 50 52 45 56 5f 4f 4b 29  |CURSOR_PREV_OK)
130c0 20 29 3b 0a 20 20 61 73 73 65 72 74 43 75 72 73   );.  assertCurs
130d0 6f 72 54 72 65 65 28 70 43 73 72 29 3b 0a 0a 20  orTree(pCsr);.. 
130e0 20 72 64 6d 61 73 6b 20 3d 20 28 70 43 73 72 2d   rdmask = (pCsr-
130f0 3e 66 6c 61 67 73 20 26 20 43 55 52 53 4f 52 5f  >flags & CURSOR_
13100 4e 45 58 54 5f 4f 4b 29 20 3f 20 4c 53 4d 5f 45  NEXT_OK) ? LSM_E
13110 4e 44 5f 44 45 4c 45 54 45 20 3a 20 4c 53 4d 5f  ND_DELETE : LSM_
13120 53 54 41 52 54 5f 44 45 4c 45 54 45 3b 0a 0a 20  START_DELETE;.. 
13130 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
13140 72 20 64 6f 65 73 20 6e 6f 74 20 63 75 72 72 65  r does not curre
13150 6e 74 6c 79 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ntly point to an
13160 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
13170 20 6b 65 79 20 28 69 2e 65 2e 0a 20 20 2a 2a 20   key (i.e..  ** 
13180 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64  it points to a d
13190 65 6c 65 74 65 20 6b 65 79 2c 20 6f 72 20 74 68  elete key, or th
131a0 65 20 73 74 61 72 74 20 6f 72 20 65 6e 64 20 6f  e start or end o
131b0 66 20 61 20 72 61 6e 67 65 2d 64 65 6c 65 74 65  f a range-delete
131c0 29 2c 20 61 6e 64 0a 20 20 2a 2a 20 74 68 65 20  ), and.  ** the 
131d0 43 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 44 45  CURSOR_IGNORE_DE
131e0 4c 45 54 45 20 66 6c 61 67 20 69 73 20 73 65 74  LETE flag is set
131f0 2c 20 73 6b 69 70 20 70 61 73 74 20 74 68 69 73  , skip past this
13200 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 69 66   entry.  */.  if
13210 28 20 28 70 43 73 72 2d 3e 66 6c 61 67 73 20 26  ( (pCsr->flags &
13220 20 43 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 44   CURSOR_IGNORE_D
13230 45 4c 45 54 45 29 20 26 26 20 62 44 65 6c 65 74  ELETE) && bDelet
13240 65 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  eOk==0 ){.    if
13250 28 20 28 65 54 79 70 65 20 26 20 4c 53 4d 5f 49  ( (eType & LSM_I
13260 4e 53 45 52 54 29 3d 3d 30 20 29 20 72 65 74 75  NSERT)==0 ) retu
13270 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
13280 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  If the cursor po
13290 69 6e 74 73 20 74 6f 20 61 20 73 79 73 74 65 6d  ints to a system
132a0 20 6b 65 79 20 28 66 72 65 65 2d 6c 69 73 74 20   key (free-list 
132b0 65 6e 74 72 79 29 2c 20 61 6e 64 20 74 68 65 0a  entry), and the.
132c0 20 20 2a 2a 20 43 55 52 53 4f 52 5f 49 47 4e 4f    ** CURSOR_IGNO
132d0 52 45 5f 53 59 53 54 45 4d 20 66 6c 61 67 20 69  RE_SYSTEM flag i
132e0 73 20 73 65 74 2c 20 73 6b 69 70 20 74 68 69 65  s set, skip thie
132f0 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 69 66   entry.  */.  if
13300 28 20 28 70 43 73 72 2d 3e 66 6c 61 67 73 20 26  ( (pCsr->flags &
13310 20 43 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 53   CURSOR_IGNORE_S
13320 59 53 54 45 4d 29 20 26 26 20 72 74 54 6f 70 69  YSTEM) && rtTopi
13330 63 28 65 54 79 70 65 29 21 3d 30 20 29 7b 0a 20  c(eType)!=0 ){. 
13340 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
13350 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
13360 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
13370 20 66 69 72 65 73 20 61 73 73 65 72 74 28 29 20   fires assert() 
13380 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 63 68  statements to ch
13390 65 63 6b 20 6f 6e 65 20 6f 66 20 74 68 65 20 61  eck one of the a
133a0 73 73 75 6d 70 74 69 6f 6e 73 0a 20 20 2a 2a 20  ssumptions.  ** 
133b0 69 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 62  in the comment b
133c0 65 6c 6f 77 20 2d 20 74 68 61 74 20 69 66 20 74  elow - that if t
133d0 68 65 20 6c 68 73 20 73 75 62 2d 63 75 72 73 6f  he lhs sub-curso
133e0 72 20 6f 66 20 61 20 6c 65 76 65 6c 20 75 6e 64  r of a level und
133f0 65 72 67 6f 69 6e 67 0a 20 20 2a 2a 20 61 20 6d  ergoing.  ** a m
13400 65 72 67 65 20 69 73 20 76 61 6c 69 64 2c 20 74  erge is valid, t
13410 68 65 6e 20 61 6c 6c 20 74 68 65 20 72 68 73 20  hen all the rhs 
13420 73 75 62 2d 63 75 72 73 6f 72 73 20 6d 75 73 74  sub-cursors must
13430 20 62 65 20 61 74 20 45 4f 46 2e 20 0a 20 20 2a   be at EOF. .  *
13440 2a 0a 20 20 2a 2a 20 41 6c 73 6f 20 61 73 73 65  *.  ** Also asse
13450 72 74 20 74 68 61 74 20 61 6c 6c 20 72 68 73 20  rt that all rhs 
13460 73 75 62 2d 63 75 72 73 6f 72 73 20 61 72 65 20  sub-cursors are 
13470 65 69 74 68 65 72 20 61 74 20 45 4f 46 20 6f 72  either at EOF or
13480 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 61   point to.  ** a
13490 20 6b 65 79 20 74 68 61 74 20 69 73 20 6e 6f 74   key that is not
134a0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c   less than the l
134b0 65 76 65 6c 20 73 70 6c 69 74 2d 6b 65 79 2e 20  evel split-key. 
134c0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
134d0 3c 70 43 73 72 2d 3e 6e 50 74 72 3b 20 69 2b 2b  <pCsr->nPtr; i++
134e0 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 50 74  ){.    SegmentPt
134f0 72 20 2a 70 50 74 72 20 3d 20 26 70 43 73 72 2d  r *pPtr = &pCsr-
13500 3e 61 50 74 72 5b 69 5d 3b 0a 20 20 20 20 4c 65  >aPtr[i];.    Le
13510 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 70 50 74 72  vel *pLvl = pPtr
13520 2d 3e 70 4c 65 76 65 6c 3b 0a 20 20 20 20 69 66  ->pLevel;.    if
13530 28 20 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 20 26  ( pLvl->nRight &
13540 26 20 70 50 74 72 2d 3e 70 50 67 20 29 7b 0a 20  & pPtr->pPg ){. 
13550 20 20 20 20 20 69 66 28 20 70 50 74 72 2d 3e 70       if( pPtr->p
13560 53 65 67 3d 3d 26 70 4c 76 6c 2d 3e 6c 68 73 20  Seg==&pLvl->lhs 
13570 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
13580 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
13590 30 3b 20 6a 3c 70 4c 76 6c 2d 3e 6e 52 69 67 68  0; j<pLvl->nRigh
135a0 74 3b 20 6a 2b 2b 29 20 61 73 73 65 72 74 28 20  t; j++) assert( 
135b0 70 50 74 72 5b 6a 2b 31 5d 2e 70 50 67 3d 3d 30  pPtr[j+1].pPg==0
135c0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
135d0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
135e0 20 3d 20 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70   = sortedKeyComp
135f0 61 72 65 28 70 43 73 72 2d 3e 70 44 62 2d 3e 78  are(pCsr->pDb->x
13600 43 6d 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Cmp, .          
13610 20 20 72 74 54 6f 70 69 63 28 70 50 74 72 2d 3e    rtTopic(pPtr->
13620 65 54 79 70 65 29 2c 20 70 50 74 72 2d 3e 70 4b  eType), pPtr->pK
13630 65 79 2c 20 70 50 74 72 2d 3e 6e 4b 65 79 2c 0a  ey, pPtr->nKey,.
13640 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c              pLvl
13650 2d 3e 69 53 70 6c 69 74 54 6f 70 69 63 2c 20 70  ->iSplitTopic, p
13660 4c 76 6c 2d 3e 70 53 70 6c 69 74 4b 65 79 2c 20  Lvl->pSplitKey, 
13670 70 4c 76 6c 2d 3e 6e 53 70 6c 69 74 4b 65 79 0a  pLvl->nSplitKey.
13680 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
13690 20 20 20 61 73 73 65 72 74 28 20 72 65 73 3e 3d     assert( res>=
136a0 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
136b0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
136c0 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 69 66   /* Now check if
136d0 20 74 68 69 73 20 6b 65 79 20 68 61 73 20 61 6c   this key has al
136e0 72 65 61 64 79 20 62 65 65 6e 20 64 65 6c 65 74  ready been delet
136f0 65 64 20 62 79 20 61 20 72 61 6e 67 65 2d 64 65  ed by a range-de
13700 6c 65 74 65 2e 20 49 66 20 0a 20 20 2a 2a 20 73  lete. If .  ** s
13710 6f 2c 20 73 6b 69 70 20 70 61 73 74 20 69 74 2e  o, skip past it.
13720 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 73 75 6d  .  **.  ** Assum
13730 65 2c 20 66 6f 72 20 74 68 65 20 6d 6f 6d 65 6e  e, for the momen
13740 74 2c 20 74 68 61 74 20 74 68 65 20 74 72 65 65  t, that the tree
13750 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6c 65 76   contains no lev
13760 65 6c 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 20  els currently . 
13770 20 2a 2a 20 75 6e 64 65 72 67 6f 69 6e 67 20 69   ** undergoing i
13780 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65  ncremental merge
13790 2c 20 61 6e 64 20 74 68 61 74 20 74 68 69 73 20  , and that this 
137a0 63 75 72 73 6f 72 20 69 73 20 69 74 65 72 61 74  cursor is iterat
137b0 69 6e 67 20 66 6f 72 77 61 72 64 73 0a 20 20 2a  ing forwards.  *
137c0 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  * through the da
137d0 74 61 62 61 73 65 20 6b 65 79 73 2e 20 54 68 65  tabase keys. The
137e0 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
137f0 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6b 65  y points to a ke
13800 79 20 69 6e 0a 20 20 2a 2a 20 6c 65 76 65 6c 20  y in.  ** level 
13810 4c 2e 20 54 68 69 73 20 6b 65 79 20 68 61 73 20  L. This key has 
13820 61 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 6c  already been del
13830 65 74 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74  eted if any of t
13840 68 65 20 73 75 62 2d 63 75 72 73 6f 72 73 0a 20  he sub-cursors. 
13850 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
13860 6f 20 6c 65 76 65 6c 73 20 6e 65 77 65 72 20 74  o levels newer t
13870 68 61 6e 20 4c 20 28 6f 72 20 74 6f 20 74 68 65  han L (or to the
13880 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65 29   in-memory tree)
13890 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 61   point to.  ** a
138a0 20 6b 65 79 20 67 72 65 61 74 65 72 20 74 68 61   key greater tha
138b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6b 65  n the current ke
138c0 79 20 77 69 74 68 20 74 68 65 20 4c 53 4d 5f 45  y with the LSM_E
138d0 4e 44 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 73  ND_DELETE flag s
138e0 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72  et..  **.  ** Or
138f0 2c 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  , if the cursor 
13900 69 73 20 69 74 65 72 61 74 69 6e 67 20 62 61 63  is iterating bac
13910 6b 77 61 72 64 73 20 74 68 72 6f 75 67 68 20 64  kwards through d
13920 61 74 61 20 6b 65 79 73 2c 20 69 66 20 61 6e 79  ata keys, if any
13930 0a 20 20 2a 2a 20 73 75 63 68 20 73 75 62 2d 63  .  ** such sub-c
13940 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  ursor points to 
13950 61 20 6b 65 79 20 73 6d 61 6c 6c 65 72 20 74 68  a key smaller th
13960 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6b  an the current k
13970 65 79 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ey with the.  **
13980 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54   LSM_START_DELET
13990 45 20 66 6c 61 67 20 73 65 74 2e 0a 20 20 2a 2a  E flag set..  **
139a0 0a 20 20 2a 2a 20 57 68 79 20 69 74 20 77 6f 72  .  ** Why it wor
139b0 6b 73 20 77 69 74 68 20 6c 65 76 65 6c 73 20 75  ks with levels u
139c0 6e 64 65 72 67 6f 69 6e 67 20 61 20 6d 65 72 67  ndergoing a merg
139d0 65 20 74 6f 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  e too:.  **.  **
139e0 20 57 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69   When a cursor i
139f0 74 65 72 61 74 65 73 20 66 6f 72 77 61 72 64 73  terates forwards
13a00 2c 20 74 68 65 20 73 75 62 2d 63 75 72 73 6f 72  , the sub-cursor
13a10 73 20 66 6f 72 20 74 68 65 20 72 68 73 20 6f 66  s for the rhs of
13a20 20 61 20 0a 20 20 2a 2a 20 6c 65 76 65 6c 20 61   a .  ** level a
13a30 72 65 20 6f 6e 6c 79 20 61 63 74 69 76 61 74 65  re only activate
13a40 64 20 6f 6e 63 65 20 74 68 65 20 6c 68 73 20 72  d once the lhs r
13a50 65 61 63 68 65 73 20 45 4f 46 2e 20 53 6f 20 77  eaches EOF. So w
13a60 68 65 6e 20 69 74 65 72 61 74 69 6e 67 0a 20 20  hen iterating.  
13a70 2a 2a 20 66 6f 72 77 61 72 64 73 2c 20 74 68 65  ** forwards, the
13a80 20 6b 65 79 73 20 76 69 73 69 74 65 64 20 61 72   keys visited ar
13a90 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 66  e the same as if
13aa0 20 74 68 65 20 6c 65 76 65 6c 20 77 61 73 20 63   the level was c
13ab0 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 6d  ompletely.  ** m
13ac0 65 72 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  erged..  **.  **
13ad0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
13ae0 73 20 69 74 65 72 61 74 69 6e 67 20 62 61 63 6b  s iterating back
13af0 77 61 72 64 73 2c 20 74 68 65 6e 20 74 68 65 20  wards, then the 
13b00 6c 68 73 20 73 75 62 2d 63 75 72 73 6f 72 20 69  lhs sub-cursor i
13b10 73 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 69 74  s not .  ** init
13b20 69 61 6c 69 7a 65 64 20 75 6e 74 69 6c 20 74 68  ialized until th
13b30 65 20 6c 61 73 74 20 6f 66 20 74 68 65 20 72 68  e last of the rh
13b40 73 20 73 75 62 2d 63 75 72 73 6f 72 73 20 68 61  s sub-cursors ha
13b50 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 20  s reached EOF.. 
13b60 20 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79   ** Additionally
13b70 2c 20 69 66 20 74 68 65 20 53 54 41 52 54 5f 44  , if the START_D
13b80 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 73 65  ELETE flag is se
13b90 74 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 65 6e  t on the last en
13ba0 74 72 79 20 28 69 6e 0a 20 20 2a 2a 20 72 65 76  try (in.  ** rev
13bb0 65 72 73 65 20 6f 72 64 65 72 20 2d 20 73 6f 20  erse order - so 
13bc0 74 68 65 20 65 6e 74 72 79 20 77 69 74 68 20 74  the entry with t
13bd0 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 29  he smallest key)
13be0 20 6f 66 20 61 20 72 68 73 20 73 75 62 2d 63 75   of a rhs sub-cu
13bf0 72 73 6f 72 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  rsor,.  ** then 
13c00 61 20 70 73 65 75 64 6f 2d 6b 65 79 20 65 71 75  a pseudo-key equ
13c10 61 6c 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 73  al to the levels
13c20 20 73 70 6c 69 74 2d 6b 65 79 20 77 69 74 68 20   split-key with 
13c30 74 68 65 20 45 4e 44 5f 44 45 4c 45 54 45 0a 20  the END_DELETE. 
13c40 20 2a 2a 20 66 6c 61 67 20 73 65 74 20 69 73 20   ** flag set is 
13c50 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20 73  visited by the s
13c60 75 62 2d 63 75 72 73 6f 72 2e 0a 20 20 2a 2f 20  ub-cursor..  */ 
13c70 0a 20 20 69 4b 65 79 20 3d 20 70 43 73 72 2d 3e  .  iKey = pCsr->
13c80 61 54 72 65 65 5b 31 5d 3b 0a 20 20 66 6f 72 28  aTree[1];.  for(
13c90 69 3d 30 3b 20 69 3c 69 4b 65 79 3b 20 69 2b 2b  i=0; i<iKey; i++
13ca0 29 7b 0a 20 20 20 20 69 6e 74 20 63 73 72 66 6c  ){.    int csrfl
13cb0 61 67 73 3b 0a 20 20 20 20 6d 75 6c 74 69 43 75  ags;.    multiCu
13cc0 72 73 6f 72 47 65 74 4b 65 79 28 70 43 73 72 2c  rsorGetKey(pCsr,
13cd0 20 69 2c 20 26 63 73 72 66 6c 61 67 73 2c 20 30   i, &csrflags, 0
13ce0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72  , 0);.    if( (r
13cf0 64 6d 61 73 6b 20 26 20 63 73 72 66 6c 61 67 73  dmask & csrflags
13d00 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
13d10 20 69 6e 74 20 53 44 5f 45 44 20 3d 20 28 4c 53   int SD_ED = (LS
13d20 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54 45 7c 4c  M_START_DELETE|L
13d30 53 4d 5f 45 4e 44 5f 44 45 4c 45 54 45 29 3b 0a  SM_END_DELETE);.
13d40 20 20 20 20 20 20 69 66 28 20 28 63 73 72 66 6c        if( (csrfl
13d50 61 67 73 20 26 20 53 44 5f 45 44 29 3d 3d 53 44  ags & SD_ED)==SD
13d60 5f 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  _ED .       || (
13d70 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 43 55  pCsr->flags & CU
13d80 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 44 45 4c 45  RSOR_IGNORE_DELE
13d90 54 45 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a  TE)==0.      ){.
13da0 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4b          void *pK
13db0 65 79 3b 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20  ey; int nKey;.  
13dc0 20 20 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f        multiCurso
13dd0 72 47 65 74 4b 65 79 28 70 43 73 72 2c 20 69 2c  rGetKey(pCsr, i,
13de0 20 30 2c 20 26 70 4b 65 79 2c 20 26 6e 4b 65 79   0, &pKey, &nKey
13df0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30  );.        if( 0
13e00 3d 3d 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61  ==sortedKeyCompa
13e10 72 65 28 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43  re(pCsr->pDb->xC
13e20 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mp,.            
13e30 20 20 72 74 54 6f 70 69 63 28 65 54 79 70 65 29    rtTopic(eType)
13e40 2c 20 70 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74  , pCsr->key.pDat
13e50 61 2c 20 70 43 73 72 2d 3e 6b 65 79 2e 6e 44 61  a, pCsr->key.nDa
13e60 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta,.            
13e70 20 20 72 74 54 6f 70 69 63 28 63 73 72 66 6c 61    rtTopic(csrfla
13e80 67 73 29 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 0a  gs), pKey, nKey.
13e90 20 20 20 20 20 20 20 20 29 29 7b 0a 20 20 20 20          )){.    
13ea0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
13eb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13ec0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  }.      return 0
13ed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13ee0 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 63 75  * The current cu
13ef0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 73  rsor position is
13f00 20 6f 6e 65 20 74 68 69 73 20 63 75 72 73 6f 72   one this cursor
13f10 20 73 68 6f 75 6c 64 20 76 69 73 69 74 2e 20 52   should visit. R
13f20 65 74 75 72 6e 20 31 2e 20 2a 2f 0a 20 20 72 65  eturn 1. */.  re
13f30 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69  turn 1;.}..stati
13f40 63 20 69 6e 74 20 6d 75 6c 74 69 43 75 72 73 6f  c int multiCurso
13f50 72 53 65 74 75 70 54 72 65 65 28 4d 75 6c 74 69  rSetupTree(Multi
13f60 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e  Cursor *pCsr, in
13f70 74 20 62 52 65 76 29 7b 0a 20 20 69 6e 74 20 72  t bRev){.  int r
13f80 63 3b 0a 0a 20 20 72 63 20 3d 20 6d 75 6c 74 69  c;..  rc = multi
13f90 43 75 72 73 6f 72 41 6c 6c 6f 63 54 72 65 65 28  CursorAllocTree(
13fa0 70 43 73 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCsr);.  if( rc=
13fb0 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  =LSM_OK ){.    i
13fc0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
13fd0 70 43 73 72 2d 3e 6e 54 72 65 65 2d 31 3b 20 69  pCsr->nTree-1; i
13fe0 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
13ff0 6d 75 6c 74 69 43 75 72 73 6f 72 44 6f 43 6f 6d  multiCursorDoCom
14000 70 61 72 65 28 70 43 73 72 2c 20 69 2c 20 62 52  pare(pCsr, i, bR
14010 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ev);.    }.  }..
14020 20 20 61 73 73 65 72 74 43 75 72 73 6f 72 54 72    assertCursorTr
14030 65 65 28 70 43 73 72 29 3b 0a 20 20 6d 75 6c 74  ee(pCsr);.  mult
14040 69 43 75 72 73 6f 72 43 61 63 68 65 4b 65 79 28  iCursorCacheKey(
14050 70 43 73 72 2c 20 26 72 63 29 3b 0a 0a 20 20 69  pCsr, &rc);..  i
14060 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  f( rc==LSM_OK &&
14070 20 6d 63 75 72 73 6f 72 4c 6f 63 61 74 69 6f 6e   mcursorLocation
14080 4f 6b 28 70 43 73 72 2c 20 30 29 3d 3d 30 20 29  Ok(pCsr, 0)==0 )
14090 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
140a0 43 75 72 73 6f 72 41 64 76 61 6e 63 65 28 70 43  CursorAdvance(pC
140b0 73 72 2c 20 62 52 65 76 29 3b 0a 20 20 7d 0a 20  sr, bRev);.  }. 
140c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
140d0 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
140e0 43 75 72 73 6f 72 45 6e 64 28 4d 75 6c 74 69 43  CursorEnd(MultiC
140f0 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74  ursor *pCsr, int
14100 20 62 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 72   bLast){.  int r
14110 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 6e  c = LSM_OK;.  in
14120 74 20 69 3b 0a 0a 20 20 70 43 73 72 2d 3e 66 6c  t i;..  pCsr->fl
14130 61 67 73 20 26 3d 20 7e 28 43 55 52 53 4f 52 5f  ags &= ~(CURSOR_
14140 4e 45 58 54 5f 4f 4b 20 7c 20 43 55 52 53 4f 52  NEXT_OK | CURSOR
14150 5f 50 52 45 56 5f 4f 4b 29 3b 0a 20 20 70 43 73  _PREV_OK);.  pCs
14160 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 62 4c 61  r->flags |= (bLa
14170 73 74 20 3f 20 43 55 52 53 4f 52 5f 50 52 45 56  st ? CURSOR_PREV
14180 5f 4f 4b 20 3a 20 43 55 52 53 4f 52 5f 4e 45 58  _OK : CURSOR_NEX
14190 54 5f 4f 4b 29 3b 0a 20 20 70 43 73 72 2d 3e 69  T_OK);.  pCsr->i
141a0 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Free = 0;..  /* 
141b0 50 6f 73 69 74 69 6f 6e 20 74 68 65 20 74 77 6f  Position the two
141c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65 20   in-memory tree 
141d0 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 66 6f 72  cursors */.  for
141e0 28 69 3d 30 3b 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  (i=0; rc==LSM_OK
141f0 20 26 26 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20   && i<2; i++){. 
14200 20 20 20 69 66 28 20 70 43 73 72 2d 3e 61 70 54     if( pCsr->apT
14210 72 65 65 43 73 72 5b 69 5d 20 29 7b 0a 20 20 20  reeCsr[i] ){.   
14220 20 20 20 72 63 20 3d 20 6c 73 6d 54 72 65 65 43     rc = lsmTreeC
14230 75 72 73 6f 72 45 6e 64 28 70 43 73 72 2d 3e 61  ursorEnd(pCsr->a
14240 70 54 72 65 65 43 73 72 5b 69 5d 2c 20 62 4c 61  pTreeCsr[i], bLa
14250 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  st);.    }.  }..
14260 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 4c    for(i=0; rc==L
14270 53 4d 5f 4f 4b 20 26 26 20 69 3c 70 43 73 72 2d  SM_OK && i<pCsr-
14280 3e 6e 50 74 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nPtr; i++){.   
14290 20 53 65 67 6d 65 6e 74 50 74 72 20 2a 70 50 74   SegmentPtr *pPt
142a0 72 20 3d 20 26 70 43 73 72 2d 3e 61 50 74 72 5b  r = &pCsr->aPtr[
142b0 69 5d 3b 0a 20 20 20 20 4c 65 76 65 6c 20 2a 70  i];.    Level *p
142c0 4c 76 6c 20 3d 20 70 50 74 72 2d 3e 70 4c 65 76  Lvl = pPtr->pLev
142d0 65 6c 3b 0a 20 20 20 20 69 6e 74 20 69 52 68 73  el;.    int iRhs
142e0 3b 0a 20 20 20 20 69 6e 74 20 62 48 69 74 20 3d  ;.    int bHit =
142f0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 62 4c 61   0;..    if( bLa
14300 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  st ){.      for(
14310 69 52 68 73 3d 30 3b 20 69 52 68 73 3c 70 4c 76  iRhs=0; iRhs<pLv
14320 6c 2d 3e 6e 52 69 67 68 74 20 26 26 20 72 63 3d  l->nRight && rc=
14330 3d 4c 53 4d 5f 4f 4b 3b 20 69 52 68 73 2b 2b 29  =LSM_OK; iRhs++)
14340 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
14350 65 67 6d 65 6e 74 50 74 72 45 6e 64 28 70 43 73  egmentPtrEnd(pCs
14360 72 2c 20 26 70 50 74 72 5b 69 52 68 73 2b 31 5d  r, &pPtr[iRhs+1]
14370 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
14380 28 20 70 50 74 72 5b 69 52 68 73 2b 31 5d 2e 70  ( pPtr[iRhs+1].p
14390 50 67 20 29 20 62 48 69 74 20 3d 20 31 3b 0a 20  Pg ) bHit = 1;. 
143a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
143b0 20 62 48 69 74 3d 3d 30 20 26 26 20 72 63 3d 3d   bHit==0 && rc==
143c0 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  LSM_OK ){.      
143d0 20 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74    rc = segmentPt
143e0 72 45 6e 64 28 70 43 73 72 2c 20 70 50 74 72 2c  rEnd(pCsr, pPtr,
143f0 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
14400 7b 0a 20 20 20 20 20 20 20 20 73 65 67 6d 65 6e  {.        segmen
14410 74 50 74 72 52 65 73 65 74 28 70 50 74 72 29 3b  tPtrReset(pPtr);
14420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
14430 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4c  se{.      int bL
14440 68 73 20 3d 20 28 70 50 74 72 2d 3e 70 53 65 67  hs = (pPtr->pSeg
14450 3d 3d 26 70 4c 76 6c 2d 3e 6c 68 73 29 3b 0a 20  ==&pLvl->lhs);. 
14460 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 74       assert( pPt
14470 72 2d 3e 70 53 65 67 3d 3d 26 70 4c 76 6c 2d 3e  r->pSeg==&pLvl->
14480 6c 68 73 20 7c 7c 20 70 50 74 72 2d 3e 70 53 65  lhs || pPtr->pSe
14490 67 3d 3d 26 70 4c 76 6c 2d 3e 61 52 68 73 5b 30  g==&pLvl->aRhs[0
144a0 5d 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ] );..      if( 
144b0 62 4c 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  bLhs ){.        
144c0 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 45  rc = segmentPtrE
144d0 6e 64 28 70 43 73 72 2c 20 70 50 74 72 2c 20 30  nd(pCsr, pPtr, 0
144e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
144f0 50 74 72 2d 3e 70 4b 65 79 20 29 20 62 48 69 74  Ptr->pKey ) bHit
14500 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
14510 20 20 20 20 66 6f 72 28 69 52 68 73 3d 30 3b 20      for(iRhs=0; 
14520 69 52 68 73 3c 70 4c 76 6c 2d 3e 6e 52 69 67 68  iRhs<pLvl->nRigh
14530 74 20 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 3b  t && rc==LSM_OK;
14540 20 69 52 68 73 2b 2b 29 7b 0a 20 20 20 20 20 20   iRhs++){.      
14550 20 20 69 66 28 20 62 48 69 74 20 29 7b 0a 20 20    if( bHit ){.  
14560 20 20 20 20 20 20 20 20 73 65 67 6d 65 6e 74 50          segmentP
14570 74 72 52 65 73 65 74 28 26 70 50 74 72 5b 69 52  trReset(&pPtr[iR
14580 68 73 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  hs+1]);.        
14590 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
145a0 20 72 63 20 3d 20 73 6f 72 74 65 64 52 68 73 46   rc = sortedRhsF
145b0 69 72 73 74 28 70 43 73 72 2c 20 70 4c 76 6c 2c  irst(pCsr, pLvl,
145c0 20 26 70 50 74 72 5b 69 52 68 73 2b 62 4c 68 73   &pPtr[iRhs+bLhs
145d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
145e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
145f0 69 20 2b 3d 20 70 4c 76 6c 2d 3e 6e 52 69 67 68  i += pLvl->nRigh
14600 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 64  t;.  }..  /* And
14610 20 74 68 65 20 62 2d 74 72 65 65 20 63 75 72 73   the b-tree curs
14620 6f 72 2c 20 69 66 20 61 70 70 6c 69 63 61 62 6c  or, if applicabl
14630 65 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 4c  e */.  if( rc==L
14640 53 4d 5f 4f 4b 20 26 26 20 70 43 73 72 2d 3e 70  SM_OK && pCsr->p
14650 42 74 43 73 72 20 29 7b 0a 20 20 20 20 61 73 73  BtCsr ){.    ass
14660 65 72 74 28 20 62 4c 61 73 74 3d 3d 30 20 29 3b  ert( bLast==0 );
14670 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43  .    rc = btreeC
14680 75 72 73 6f 72 46 69 72 73 74 28 70 43 73 72 2d  ursorFirst(pCsr-
14690 3e 70 42 74 43 73 72 29 3b 0a 20 20 7d 0a 0a 20  >pBtCsr);.  }.. 
146a0 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
146b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
146c0 69 43 75 72 73 6f 72 53 65 74 75 70 54 72 65 65  iCursorSetupTree
146d0 28 70 43 73 72 2c 20 62 4c 61 73 74 29 3b 0a 20  (pCsr, bLast);. 
146e0 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72   }.  .  return r
146f0 63 3b 0a 7d 0a 0a 0a 69 6e 74 20 6d 63 75 72 73  c;.}...int mcurs
14700 6f 72 53 61 76 65 28 4d 75 6c 74 69 43 75 72 73  orSave(MultiCurs
14710 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74  or *pCsr){.  int
14720 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20   rc = LSM_OK;.  
14730 69 66 28 20 70 43 73 72 2d 3e 61 54 72 65 65 20  if( pCsr->aTree 
14740 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 72 65 65  ){.    int iTree
14750 20 3d 20 70 43 73 72 2d 3e 61 54 72 65 65 5b 31   = pCsr->aTree[1
14760 5d 3b 0a 20 20 20 20 69 66 28 20 69 54 72 65 65  ];.    if( iTree
14770 3d 3d 43 55 52 53 4f 52 5f 44 41 54 41 5f 54 52  ==CURSOR_DATA_TR
14780 45 45 30 20 7c 7c 20 69 54 72 65 65 3d 3d 43 55  EE0 || iTree==CU
14790 52 53 4f 52 5f 44 41 54 41 5f 54 52 45 45 31 20  RSOR_DATA_TREE1 
147a0 29 7b 0a 20 20 20 20 20 20 6d 75 6c 74 69 43 75  ){.      multiCu
147b0 72 73 6f 72 43 61 63 68 65 4b 65 79 28 70 43 73  rsorCacheKey(pCs
147c0 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  r, &rc);.    }. 
147d0 20 7d 0a 20 20 6d 63 75 72 73 6f 72 46 72 65 65   }.  mcursorFree
147e0 43 6f 6d 70 6f 6e 65 6e 74 73 28 70 43 73 72 29  Components(pCsr)
147f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14800 0a 0a 69 6e 74 20 6d 63 75 72 73 6f 72 52 65 73  ..int mcursorRes
14810 74 6f 72 65 28 6c 73 6d 5f 64 62 20 2a 70 44 62  tore(lsm_db *pDb
14820 2c 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70  , MultiCursor *p
14830 43 73 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Csr){.  int rc;.
14840 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72 73    rc = multiCurs
14850 6f 72 49 6e 69 74 28 70 43 73 72 2c 20 70 44 62  orInit(pCsr, pDb
14860 2d 3e 70 43 6c 69 65 6e 74 29 3b 0a 20 20 69 66  ->pClient);.  if
14870 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20  ( rc==LSM_OK && 
14880 70 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74 61 20  pCsr->key.pData 
14890 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 4d  ){.    rc = lsmM
148a0 43 75 72 73 6f 72 53 65 65 6b 28 70 43 73 72 2c  CursorSeek(pCsr,
148b0 20 0a 20 20 20 20 20 20 20 20 20 72 74 54 6f 70   .         rtTop
148c0 69 63 28 70 43 73 72 2d 3e 65 54 79 70 65 29 2c  ic(pCsr->eType),
148d0 20 70 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74 61   pCsr->key.pData
148e0 2c 20 70 43 73 72 2d 3e 6b 65 79 2e 6e 44 61 74  , pCsr->key.nDat
148f0 61 2c 20 2b 31 0a 20 20 20 20 29 3b 0a 20 20 7d  a, +1.    );.  }
14900 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14910 0a 69 6e 74 20 6c 73 6d 53 61 76 65 43 75 72 73  .int lsmSaveCurs
14920 6f 72 73 28 6c 73 6d 5f 64 62 20 2a 70 44 62 29  ors(lsm_db *pDb)
14930 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d  {.  int rc = LSM
14940 5f 4f 4b 3b 0a 20 20 4d 75 6c 74 69 43 75 72 73  _OK;.  MultiCurs
14950 6f 72 20 2a 70 43 73 72 3b 0a 0a 20 20 66 6f 72  or *pCsr;..  for
14960 28 70 43 73 72 3d 70 44 62 2d 3e 70 43 73 72 3b  (pCsr=pDb->pCsr;
14970 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70   rc==LSM_OK && p
14980 43 73 72 3b 20 70 43 73 72 3d 70 43 73 72 2d 3e  Csr; pCsr=pCsr->
14990 70 4e 65 78 74 29 7b 0a 20 20 20 20 72 63 20 3d  pNext){.    rc =
149a0 20 6d 63 75 72 73 6f 72 53 61 76 65 28 70 43 73   mcursorSave(pCs
149b0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
149c0 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 52   rc;.}..int lsmR
149d0 65 73 74 6f 72 65 43 75 72 73 6f 72 73 28 6c 73  estoreCursors(ls
149e0 6d 5f 64 62 20 2a 70 44 62 29 7b 0a 20 20 69 6e  m_db *pDb){.  in
149f0 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20  t rc = LSM_OK;. 
14a00 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43   MultiCursor *pC
14a10 73 72 3b 0a 0a 20 20 66 6f 72 28 70 43 73 72 3d  sr;..  for(pCsr=
14a20 70 44 62 2d 3e 70 43 73 72 3b 20 72 63 3d 3d 4c  pDb->pCsr; rc==L
14a30 53 4d 5f 4f 4b 20 26 26 20 70 43 73 72 3b 20 70  SM_OK && pCsr; p
14a40 43 73 72 3d 70 43 73 72 2d 3e 70 4e 65 78 74 29  Csr=pCsr->pNext)
14a50 7b 0a 20 20 20 20 72 63 20 3d 20 6d 63 75 72 73  {.    rc = mcurs
14a60 6f 72 52 65 73 74 6f 72 65 28 70 44 62 2c 20 70  orRestore(pDb, p
14a70 43 73 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Csr);.  }.  retu
14a80 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 6c 73  rn rc;.}..int ls
14a90 6d 4d 43 75 72 73 6f 72 46 69 72 73 74 28 4d 75  mMCursorFirst(Mu
14aa0 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 29  ltiCursor *pCsr)
14ab0 7b 0a 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69  {.  return multi
14ac0 43 75 72 73 6f 72 45 6e 64 28 70 43 73 72 2c 20  CursorEnd(pCsr, 
14ad0 30 29 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 4d 43  0);.}..int lsmMC
14ae0 75 72 73 6f 72 4c 61 73 74 28 4d 75 6c 74 69 43  ursorLast(MultiC
14af0 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20  ursor *pCsr){.  
14b00 72 65 74 75 72 6e 20 6d 75 6c 74 69 43 75 72 73  return multiCurs
14b10 6f 72 45 6e 64 28 70 43 73 72 2c 20 31 29 3b 0a  orEnd(pCsr, 1);.
14b20 7d 0a 0a 6c 73 6d 5f 64 62 20 2a 6c 73 6d 4d 43  }..lsm_db *lsmMC
14b30 75 72 73 6f 72 44 62 28 4d 75 6c 74 69 43 75 72  ursorDb(MultiCur
14b40 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 72 65  sor *pCsr){.  re
14b50 74 75 72 6e 20 70 43 73 72 2d 3e 70 44 62 3b 0a  turn pCsr->pDb;.
14b60 7d 0a 0a 76 6f 69 64 20 6c 73 6d 4d 43 75 72 73  }..void lsmMCurs
14b70 6f 72 52 65 73 65 74 28 4d 75 6c 74 69 43 75 72  orReset(MultiCur
14b80 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e  sor *pCsr){.  in
14b90 74 20 69 3b 0a 20 20 6c 73 6d 54 72 65 65 43 75  t i;.  lsmTreeCu
14ba0 72 73 6f 72 52 65 73 65 74 28 70 43 73 72 2d 3e  rsorReset(pCsr->
14bb0 61 70 54 72 65 65 43 73 72 5b 30 5d 29 3b 0a 20  apTreeCsr[0]);. 
14bc0 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 52 65   lsmTreeCursorRe
14bd0 73 65 74 28 70 43 73 72 2d 3e 61 70 54 72 65 65  set(pCsr->apTree
14be0 43 73 72 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69  Csr[1]);.  for(i
14bf0 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 50 74 72  =0; i<pCsr->nPtr
14c00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 65 67 6d  ; i++){.    segm
14c10 65 6e 74 50 74 72 52 65 73 65 74 28 26 70 43 73  entPtrReset(&pCs
14c20 72 2d 3e 61 50 74 72 5b 69 5d 29 3b 0a 20 20 7d  r->aPtr[i]);.  }
14c30 0a 20 20 70 43 73 72 2d 3e 6b 65 79 2e 6e 44 61  .  pCsr->key.nDa
14c40 74 61 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  ta = 0;.}..stati
14c50 63 20 69 6e 74 20 74 72 65 65 43 75 72 73 6f 72  c int treeCursor
14c60 53 65 65 6b 28 0a 20 20 4d 75 6c 74 69 43 75 72  Seek(.  MultiCur
14c70 73 6f 72 20 2a 70 43 73 72 2c 0a 20 20 54 72 65  sor *pCsr,.  Tre
14c80 65 43 75 72 73 6f 72 20 2a 70 54 72 65 65 43 73  eCursor *pTreeCs
14c90 72 2c 20 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79  r, .  void *pKey
14ca0 2c 20 69 6e 74 20 6e 4b 65 79 2c 20 0a 20 20 69  , int nKey, .  i
14cb0 6e 74 20 65 53 65 65 6b 2c 0a 20 20 69 6e 74 20  nt eSeek,.  int 
14cc0 2a 70 62 53 74 6f 70 0a 29 7b 0a 20 20 69 6e 74  *pbStop.){.  int
14cd0 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20   rc = LSM_OK;.  
14ce0 69 66 28 20 70 54 72 65 65 43 73 72 20 29 7b 0a  if( pTreeCsr ){.
14cf0 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b      int res = 0;
14d00 0a 20 20 20 20 6c 73 6d 54 72 65 65 43 75 72 73  .    lsmTreeCurs
14d10 6f 72 53 65 65 6b 28 70 54 72 65 65 43 73 72 2c  orSeek(pTreeCsr,
14d20 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 26 72 65   pKey, nKey, &re
14d30 73 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  s);.    switch( 
14d40 65 53 65 65 6b 20 29 7b 0a 20 20 20 20 20 20 63  eSeek ){.      c
14d50 61 73 65 20 4c 53 4d 5f 53 45 45 4b 5f 45 51 3a  ase LSM_SEEK_EQ:
14d60 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65   {.        int e
14d70 54 79 70 65 20 3d 20 6c 73 6d 54 72 65 65 43 75  Type = lsmTreeCu
14d80 72 73 6f 72 46 6c 61 67 73 28 70 54 72 65 65 43  rsorFlags(pTreeC
14d90 73 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  sr);.        if(
14da0 20 28 72 65 73 3c 30 20 26 26 20 28 65 54 79 70   (res<0 && (eTyp
14db0 65 20 26 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45  e & LSM_START_DE
14dc0 4c 45 54 45 29 29 0a 20 20 20 20 20 20 20 20 20  LETE)).         
14dd0 7c 7c 20 28 72 65 73 3e 30 20 26 26 20 28 65 54  || (res>0 && (eT
14de0 79 70 65 20 26 20 4c 53 4d 5f 45 4e 44 5f 44 45  ype & LSM_END_DE
14df0 4c 45 54 45 29 29 0a 20 20 20 20 20 20 20 20 20  LETE)).         
14e00 7c 7c 20 28 72 65 73 3d 3d 30 20 26 26 20 28 65  || (res==0 && (e
14e10 54 79 70 65 20 26 20 4c 53 4d 5f 50 4f 49 4e 54  Type & LSM_POINT
14e20 5f 44 45 4c 45 54 45 29 29 0a 20 20 20 20 20 20  _DELETE)).      
14e30 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a    ){.          *
14e40 70 62 53 74 6f 70 20 3d 20 31 3b 0a 20 20 20 20  pbStop = 1;.    
14e50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
14e60 73 3d 3d 30 20 26 26 20 28 65 54 79 70 65 20 26  s==0 && (eType &
14e70 20 4c 53 4d 5f 49 4e 53 45 52 54 29 20 29 7b 0a   LSM_INSERT) ){.
14e80 20 20 20 20 20 20 20 20 20 20 6c 73 6d 5f 65 6e            lsm_en
14e90 76 20 2a 70 45 6e 76 20 3d 20 70 43 73 72 2d 3e  v *pEnv = pCsr->
14ea0 70 44 62 2d 3e 70 45 6e 76 3b 0a 20 20 20 20 20  pDb->pEnv;.     
14eb0 20 20 20 20 20 76 6f 69 64 20 2a 70 3b 20 69 6e       void *p; in
14ec0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  t n;         /* 
14ed0 4b 65 79 2f 76 61 6c 75 65 20 66 72 6f 6d 20 74  Key/value from t
14ee0 72 65 65 2d 63 75 72 73 6f 72 20 2a 2f 0a 20 20  ree-cursor */.  
14ef0 20 20 20 20 20 20 20 20 2a 70 62 53 74 6f 70 20          *pbStop 
14f00 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
14f10 43 73 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 55  Csr->flags |= CU
14f20 52 53 4f 52 5f 53 45 45 4b 5f 45 51 3b 0a 20 20  RSOR_SEEK_EQ;.  
14f30 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d          rc = lsm
14f40 54 72 65 65 43 75 72 73 6f 72 4b 65 79 28 70 54  TreeCursorKey(pT
14f50 72 65 65 43 73 72 2c 20 26 70 43 73 72 2d 3e 65  reeCsr, &pCsr->e
14f60 54 79 70 65 2c 20 26 70 2c 20 26 6e 29 3b 0a 20  Type, &p, &n);. 
14f70 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
14f80 3d 4c 53 4d 5f 4f 4b 20 29 20 72 63 20 3d 20 73  =LSM_OK ) rc = s
14f90 6f 72 74 65 64 42 6c 6f 62 53 65 74 28 70 45 6e  ortedBlobSet(pEn
14fa0 76 2c 20 26 70 43 73 72 2d 3e 6b 65 79 2c 20 70  v, &pCsr->key, p
14fb0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , n);.          
14fc0 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  if( rc==LSM_OK )
14fd0 20 72 63 20 3d 20 6c 73 6d 54 72 65 65 43 75 72   rc = lsmTreeCur
14fe0 73 6f 72 56 61 6c 75 65 28 70 54 72 65 65 43 73  sorValue(pTreeCs
14ff0 72 2c 20 26 70 2c 20 26 6e 29 3b 0a 20 20 20 20  r, &p, &n);.    
15000 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53        if( rc==LS
15010 4d 5f 4f 4b 20 29 20 72 63 20 3d 20 73 6f 72 74  M_OK ) rc = sort
15020 65 64 42 6c 6f 62 53 65 74 28 70 45 6e 76 2c 20  edBlobSet(pEnv, 
15030 26 70 43 73 72 2d 3e 76 61 6c 2c 20 70 2c 20 6e  &pCsr->val, p, n
15040 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15050 20 20 20 20 20 6c 73 6d 54 72 65 65 43 75 72 73       lsmTreeCurs
15060 6f 72 52 65 73 65 74 28 70 54 72 65 65 43 73 72  orReset(pTreeCsr
15070 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
15080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15090 63 61 73 65 20 4c 53 4d 5f 53 45 45 4b 5f 47 45  case LSM_SEEK_GE
150a0 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  :.        if( re
150b0 73 3c 30 20 26 26 20 6c 73 6d 54 72 65 65 43 75  s<0 && lsmTreeCu
150c0 72 73 6f 72 56 61 6c 69 64 28 70 54 72 65 65 43  rsorValid(pTreeC
150d0 73 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sr) ){.         
150e0 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 4e 65   lsmTreeCursorNe
150f0 78 74 28 70 54 72 65 65 43 73 72 29 3b 0a 20 20  xt(pTreeCsr);.  
15100 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15110 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66  break;.      def
15120 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 69 66  ault:.        if
15130 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20  ( res>0 ){.     
15140 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 73 6d       assert( lsm
15150 54 72 65 65 43 75 72 73 6f 72 56 61 6c 69 64 28  TreeCursorValid(
15160 70 54 72 65 65 43 73 72 29 20 29 3b 0a 20 20 20  pTreeCsr) );.   
15170 20 20 20 20 20 20 20 6c 73 6d 54 72 65 65 43 75         lsmTreeCu
15180 72 73 6f 72 50 72 65 76 28 70 54 72 65 65 43 73  rsorPrev(pTreeCs
15190 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
151a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
151b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
151c0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65  rc;.}.../*.** Se
151d0 65 6b 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  ek the cursor..*
151e0 2f 0a 69 6e 74 20 6c 73 6d 4d 43 75 72 73 6f 72  /.int lsmMCursor
151f0 53 65 65 6b 28 0a 20 20 4d 75 6c 74 69 43 75 72  Seek(.  MultiCur
15200 73 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20 69 6e  sor *pCsr, .  in
15210 74 20 69 54 6f 70 69 63 2c 20 0a 20 20 76 6f 69  t iTopic, .  voi
15220 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65  d *pKey, int nKe
15230 79 2c 20 0a 20 20 69 6e 74 20 65 53 65 65 6b 0a  y, .  int eSeek.
15240 29 7b 0a 20 20 69 6e 74 20 65 45 53 65 65 6b 20  ){.  int eESeek 
15250 3d 20 65 53 65 65 6b 3b 20 20 20 20 20 20 20 20  = eSeek;        
15260 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76       /* Effectiv
15270 65 20 65 53 65 65 6b 20 70 61 72 61 6d 65 74 65  e eSeek paramete
15280 72 20 2a 2f 0a 20 20 69 6e 74 20 62 53 74 6f 70  r */.  int bStop
15290 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
152a0 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
152b0 20 74 72 75 65 20 74 6f 20 68 61 6c 74 20 73 65   true to halt se
152c0 61 72 63 68 20 6f 70 65 72 61 74 69 6f 6e 20 2a  arch operation *
152d0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d  /.  int rc = LSM
152e0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
152f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
15300 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72  de */.  int iPtr
15310 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
15320 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
15330 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
15340 67 68 20 70 43 73 72 2d 3e 61 50 74 72 5b 5d 20  gh pCsr->aPtr[] 
15350 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 67 6e 6f 20  */.  Pgno iPgno 
15360 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
15370 20 20 20 20 20 2f 2a 20 46 43 20 70 6f 69 6e 74       /* FC point
15380 65 72 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61  er value */..  a
15390 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61 70 54  ssert( pCsr->apT
153a0 72 65 65 43 73 72 5b 30 5d 3d 3d 30 20 7c 7c 20  reeCsr[0]==0 || 
153b0 69 54 6f 70 69 63 3d 3d 30 20 29 3b 0a 20 20 61  iTopic==0 );.  a
153c0 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61 70 54  ssert( pCsr->apT
153d0 72 65 65 43 73 72 5b 31 5d 3d 3d 30 20 7c 7c 20  reeCsr[1]==0 || 
153e0 69 54 6f 70 69 63 3d 3d 30 20 29 3b 0a 0a 20 20  iTopic==0 );..  
153f0 69 66 28 20 65 45 53 65 65 6b 3d 3d 4c 53 4d 5f  if( eESeek==LSM_
15400 53 45 45 4b 5f 4c 45 46 41 53 54 20 29 20 65 45  SEEK_LEFAST ) eE
15410 53 65 65 6b 20 3d 20 4c 53 4d 5f 53 45 45 4b 5f  Seek = LSM_SEEK_
15420 4c 45 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  LE;..  assert( e
15430 45 53 65 65 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f  ESeek==LSM_SEEK_
15440 45 51 20 7c 7c 20 65 45 53 65 65 6b 3d 3d 4c 53  EQ || eESeek==LS
15450 4d 5f 53 45 45 4b 5f 4c 45 20 7c 7c 20 65 45 53  M_SEEK_LE || eES
15460 65 65 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 47 45  eek==LSM_SEEK_GE
15470 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
15480 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 43 55 52  Csr->flags & CUR
15490 53 4f 52 5f 46 4c 55 53 48 5f 46 52 45 45 4c 49  SOR_FLUSH_FREELI
154a0 53 54 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ST)==0 );.  asse
154b0 72 74 28 20 70 43 73 72 2d 3e 6e 50 74 72 3d 3d  rt( pCsr->nPtr==
154c0 30 20 7c 7c 20 70 43 73 72 2d 3e 61 50 74 72 5b  0 || pCsr->aPtr[
154d0 30 5d 2e 70 4c 65 76 65 6c 20 29 3b 0a 0a 20 20  0].pLevel );..  
154e0 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pCsr->flags &= ~
154f0 28 43 55 52 53 4f 52 5f 4e 45 58 54 5f 4f 4b 20  (CURSOR_NEXT_OK 
15500 7c 20 43 55 52 53 4f 52 5f 50 52 45 56 5f 4f 4b  | CURSOR_PREV_OK
15510 20 7c 20 43 55 52 53 4f 52 5f 53 45 45 4b 5f 45   | CURSOR_SEEK_E
15520 51 29 3b 0a 20 20 72 63 20 3d 20 74 72 65 65 43  Q);.  rc = treeC
15530 75 72 73 6f 72 53 65 65 6b 28 70 43 73 72 2c 20  ursorSeek(pCsr, 
15540 70 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72 5b  pCsr->apTreeCsr[
15550 30 5d 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  0], pKey, nKey, 
15560 65 45 53 65 65 6b 2c 20 26 62 53 74 6f 70 29 3b  eESeek, &bStop);
15570 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f  .  if( rc==LSM_O
15580 4b 20 26 26 20 62 53 74 6f 70 3d 3d 30 20 29 7b  K && bStop==0 ){
15590 0a 20 20 20 20 72 63 20 3d 20 74 72 65 65 43 75  .    rc = treeCu
155a0 72 73 6f 72 53 65 65 6b 28 70 43 73 72 2c 20 70  rsorSeek(pCsr, p
155b0 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72 5b 31  Csr->apTreeCsr[1
155c0 5d 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 65  ], pKey, nKey, e
155d0 45 53 65 65 6b 2c 20 26 62 53 74 6f 70 29 3b 0a  ESeek, &bStop);.
155e0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 6b 20 61    }..  /* Seek a
155f0 6c 6c 20 73 65 67 6d 65 6e 74 20 70 6f 69 6e 74  ll segment point
15600 65 72 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 50  ers. */.  for(iP
15610 74 72 3d 30 3b 20 69 50 74 72 3c 70 43 73 72 2d  tr=0; iPtr<pCsr-
15620 3e 6e 50 74 72 20 26 26 20 72 63 3d 3d 4c 53 4d  >nPtr && rc==LSM
15630 5f 4f 4b 20 26 26 20 62 53 74 6f 70 3d 3d 30 3b  _OK && bStop==0;
15640 20 69 50 74 72 2b 2b 29 7b 0a 20 20 20 20 53 65   iPtr++){.    Se
15650 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 20 3d  gmentPtr *pPtr =
15660 20 26 70 43 73 72 2d 3e 61 50 74 72 5b 69 50 74   &pCsr->aPtr[iPt
15670 72 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r];.    assert( 
15680 70 50 74 72 2d 3e 70 53 65 67 3d 3d 26 70 50 74  pPtr->pSeg==&pPt
15690 72 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68 73 20 29  r->pLevel->lhs )
156a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 65 65 6b 49  ;.    rc = seekI
156b0 6e 4c 65 76 65 6c 28 70 43 73 72 2c 20 70 50 74  nLevel(pCsr, pPt
156c0 72 2c 20 65 45 53 65 65 6b 2c 20 69 54 6f 70 69  r, eESeek, iTopi
156d0 63 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 26  c, pKey, nKey, &
156e0 69 50 67 6e 6f 2c 20 26 62 53 74 6f 70 29 3b 0a  iPgno, &bStop);.
156f0 20 20 20 20 69 50 74 72 20 2b 3d 20 70 50 74 72      iPtr += pPtr
15700 2d 3e 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74  ->pLevel->nRight
15710 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 53 65  ;.  }..  if( eSe
15720 65 6b 21 3d 4c 53 4d 5f 53 45 45 4b 5f 45 51 20  ek!=LSM_SEEK_EQ 
15730 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c  ){.    if( rc==L
15740 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  SM_OK ){.      r
15750 63 20 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72 41  c = multiCursorA
15760 6c 6c 6f 63 54 72 65 65 28 70 43 73 72 29 3b 0a  llocTree(pCsr);.
15770 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
15780 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
15790 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
157a0 6f 72 28 69 3d 70 43 73 72 2d 3e 6e 54 72 65 65  or(i=pCsr->nTree
157b0 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
157c0 20 20 20 20 20 20 20 6d 75 6c 74 69 43 75 72 73         multiCurs
157d0 6f 72 44 6f 43 6f 6d 70 61 72 65 28 70 43 73 72  orDoCompare(pCsr
157e0 2c 20 69 2c 20 65 45 53 65 65 6b 3d 3d 4c 53 4d  , i, eESeek==LSM
157f0 5f 53 45 45 4b 5f 4c 45 29 3b 0a 20 20 20 20 20  _SEEK_LE);.     
15800 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 53 65   }.      if( eSe
15810 65 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 47 45 20  ek==LSM_SEEK_GE 
15820 29 20 70 43 73 72 2d 3e 66 6c 61 67 73 20 7c 3d  ) pCsr->flags |=
15830 20 43 55 52 53 4f 52 5f 4e 45 58 54 5f 4f 4b 3b   CURSOR_NEXT_OK;
15840 0a 20 20 20 20 20 20 69 66 28 20 65 53 65 65 6b  .      if( eSeek
15850 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 4c 45 20 29 20  ==LSM_SEEK_LE ) 
15860 70 43 73 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43  pCsr->flags |= C
15870 55 52 53 4f 52 5f 50 52 45 56 5f 4f 4b 3b 0a 20  URSOR_PREV_OK;. 
15880 20 20 20 7d 0a 0a 20 20 20 20 6d 75 6c 74 69 43     }..    multiC
15890 75 72 73 6f 72 43 61 63 68 65 4b 65 79 28 70 43  ursorCacheKey(pC
158a0 73 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  sr, &rc);.    if
158b0 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20  ( rc==LSM_OK && 
158c0 65 53 65 65 6b 21 3d 4c 53 4d 5f 53 45 45 4b 5f  eSeek!=LSM_SEEK_
158d0 4c 45 46 41 53 54 20 26 26 20 30 3d 3d 6d 63 75  LEFAST && 0==mcu
158e0 72 73 6f 72 4c 6f 63 61 74 69 6f 6e 4f 6b 28 70  rsorLocationOk(p
158f0 43 73 72 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  Csr, 0) ){.     
15900 20 73 77 69 74 63 68 28 20 65 45 53 65 65 6b 20   switch( eESeek 
15910 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  ){.        case 
15920 4c 53 4d 5f 53 45 45 4b 5f 45 51 3a 0a 20 20 20  LSM_SEEK_EQ:.   
15930 20 20 20 20 20 20 20 6c 73 6d 4d 43 75 72 73 6f         lsmMCurso
15940 72 52 65 73 65 74 28 70 43 73 72 29 3b 0a 20 20  rReset(pCsr);.  
15950 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15960 20 20 20 20 20 20 20 63 61 73 65 20 4c 53 4d 5f         case LSM_
15970 53 45 45 4b 5f 47 45 3a 0a 20 20 20 20 20 20 20  SEEK_GE:.       
15980 20 20 20 72 63 20 3d 20 6c 73 6d 4d 43 75 72 73     rc = lsmMCurs
15990 6f 72 4e 65 78 74 28 70 43 73 72 29 3b 0a 20 20  orNext(pCsr);.  
159a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
159b0 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
159c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c            rc = l
159d0 73 6d 4d 43 75 72 73 6f 72 50 72 65 76 28 70 43  smMCursorPrev(pC
159e0 73 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  sr);.          b
159f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15a00 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
15a10 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d  n rc;.}..int lsm
15a20 4d 43 75 72 73 6f 72 56 61 6c 69 64 28 4d 75 6c  MCursorValid(Mul
15a30 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b  tiCursor *pCsr){
15a40 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a  .  int res = 0;.
15a50 20 20 69 66 28 20 70 43 73 72 2d 3e 66 6c 61 67    if( pCsr->flag
15a60 73 20 26 20 43 55 52 53 4f 52 5f 53 45 45 4b 5f  s & CURSOR_SEEK_
15a70 45 51 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  EQ ){.    res = 
15a80 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
15a90 43 73 72 2d 3e 61 54 72 65 65 20 29 7b 0a 20 20  Csr->aTree ){.  
15aa0 20 20 69 6e 74 20 69 4b 65 79 20 3d 20 70 43 73    int iKey = pCs
15ab0 72 2d 3e 61 54 72 65 65 5b 31 5d 3b 0a 20 20 20  r->aTree[1];.   
15ac0 20 69 66 28 20 69 4b 65 79 3d 3d 43 55 52 53 4f   if( iKey==CURSO
15ad0 52 5f 44 41 54 41 5f 54 52 45 45 30 20 7c 7c 20  R_DATA_TREE0 || 
15ae0 69 4b 65 79 3d 3d 43 55 52 53 4f 52 5f 44 41 54  iKey==CURSOR_DAT
15af0 41 5f 54 52 45 45 31 20 29 7b 0a 20 20 20 20 20  A_TREE1 ){.     
15b00 20 72 65 73 20 3d 20 6c 73 6d 54 72 65 65 43 75   res = lsmTreeCu
15b10 72 73 6f 72 56 61 6c 69 64 28 70 43 73 72 2d 3e  rsorValid(pCsr->
15b20 61 70 54 72 65 65 43 73 72 5b 69 4b 65 79 2d 43  apTreeCsr[iKey-C
15b30 55 52 53 4f 52 5f 44 41 54 41 5f 54 52 45 45 30  URSOR_DATA_TREE0
15b40 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
15b50 20 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b       void *pKey;
15b60 20 0a 20 20 20 20 20 20 6d 75 6c 74 69 43 75 72   .      multiCur
15b70 73 6f 72 47 65 74 4b 65 79 28 70 43 73 72 2c 20  sorGetKey(pCsr, 
15b80 69 4b 65 79 2c 20 30 2c 20 26 70 4b 65 79 2c 20  iKey, 0, &pKey, 
15b90 30 29 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  0);.      res = 
15ba0 70 4b 65 79 21 3d 30 3b 0a 20 20 20 20 7d 0a 20  pKey!=0;.    }. 
15bb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b   }.  return res;
15bc0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .}..static int m
15bd0 63 75 72 73 6f 72 41 64 76 61 6e 63 65 4f 6b 28  cursorAdvanceOk(
15be0 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  .  MultiCursor *
15bf0 70 43 73 72 2c 20 0a 20 20 69 6e 74 20 62 52 65  pCsr, .  int bRe
15c00 76 65 72 73 65 2c 0a 20 20 69 6e 74 20 2a 70 52  verse,.  int *pR
15c10 63 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4e 65  c.){.  void *pNe
15c20 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
15c30 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
15c40 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
15c50 61 69 6e 69 6e 67 20 6e 65 77 20 6b 65 79 20 2a  aining new key *
15c60 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20  /.  int nNew;   
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
15c90 75 66 66 65 72 20 70 4e 65 77 20 69 6e 20 62 79  uffer pNew in by
15ca0 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 4e 65  tes */.  int eNe
15cb0 77 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  wType;          
15cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
15cd0 20 6f 66 20 6e 65 77 20 72 65 63 6f 72 64 20 2a   of new record *
15ce0 2f 0a 0a 20 20 69 66 28 20 2a 70 52 63 20 29 20  /..  if( *pRc ) 
15cf0 72 65 74 75 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20  return 1;..  /* 
15d00 43 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e  Check the curren
15d10 74 20 6b 65 79 20 76 61 6c 75 65 2e 20 49 66 20  t key value. If 
15d20 69 74 20 69 73 20 6e 6f 74 20 67 72 65 61 74 65  it is not greate
15d30 72 20 74 68 61 6e 20 28 69 66 20 62 52 65 76 65  r than (if bReve
15d40 72 73 65 3d 3d 30 29 0a 20 20 2a 2a 20 6f 72 20  rse==0).  ** or 
15d50 6c 65 73 73 20 74 68 61 6e 20 28 69 66 20 62 52  less than (if bR
15d60 65 76 65 72 73 65 21 3d 30 29 20 74 68 65 20 6b  everse!=0) the k
15d70 65 79 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63  ey currently cac
15d80 68 65 64 20 69 6e 20 70 43 73 72 2d 3e 6b 65 79  hed in pCsr->key
15d90 2c 20 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  , .  ** then the
15da0 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20   cursor has not 
15db0 79 65 74 20 62 65 65 6e 20 73 75 63 63 65 73 73  yet been success
15dc0 66 75 6c 6c 79 20 61 64 76 61 6e 63 65 64 2e 20  fully advanced. 
15dd0 20 0a 20 20 2a 2f 0a 20 20 6d 75 6c 74 69 43 75   .  */.  multiCu
15de0 72 73 6f 72 47 65 74 4b 65 79 28 70 43 73 72 2c  rsorGetKey(pCsr,
15df0 20 70 43 73 72 2d 3e 61 54 72 65 65 5b 31 5d 2c   pCsr->aTree[1],
15e00 20 26 65 4e 65 77 54 79 70 65 2c 20 26 70 4e 65   &eNewType, &pNe
15e10 77 2c 20 26 6e 4e 65 77 29 3b 0a 20 20 69 66 28  w, &nNew);.  if(
15e20 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74   pNew ){.    int
15e30 20 74 79 70 65 6d 61 73 6b 20 3d 20 28 70 43 73   typemask = (pCs
15e40 72 2d 3e 66 6c 61 67 73 20 26 20 43 55 52 53 4f  r->flags & CURSO
15e50 52 5f 49 47 4e 4f 52 45 5f 44 45 4c 45 54 45 29  R_IGNORE_DELETE)
15e60 20 3f 20 7e 28 30 29 20 3a 20 4c 53 4d 5f 53 59   ? ~(0) : LSM_SY
15e70 53 54 45 4d 4b 45 59 3b 0a 20 20 20 20 69 6e 74  STEMKEY;.    int
15e80 20 72 65 73 20 3d 20 73 6f 72 74 65 64 44 62 4b   res = sortedDbK
15e90 65 79 43 6f 6d 70 61 72 65 28 70 43 73 72 2c 0a  eyCompare(pCsr,.
15ea0 20 20 20 20 20 20 65 4e 65 77 54 79 70 65 20 26        eNewType &
15eb0 20 74 79 70 65 6d 61 73 6b 2c 20 70 4e 65 77 2c   typemask, pNew,
15ec0 20 6e 4e 65 77 2c 20 0a 20 20 20 20 20 20 70 43   nNew, .      pC
15ed0 73 72 2d 3e 65 54 79 70 65 20 26 20 74 79 70 65  sr->eType & type
15ee0 6d 61 73 6b 2c 20 70 43 73 72 2d 3e 6b 65 79 2e  mask, pCsr->key.
15ef0 70 44 61 74 61 2c 20 70 43 73 72 2d 3e 6b 65 79  pData, pCsr->key
15f00 2e 6e 44 61 74 61 0a 20 20 20 20 29 3b 0a 0a 20  .nData.    );.. 
15f10 20 20 20 69 66 28 20 28 62 52 65 76 65 72 73 65     if( (bReverse
15f20 3d 3d 30 20 26 26 20 72 65 73 3c 3d 30 29 20 7c  ==0 && res<=0) |
15f30 7c 20 28 62 52 65 76 65 72 73 65 21 3d 30 20 26  | (bReverse!=0 &
15f40 26 20 72 65 73 3e 3d 30 29 20 29 7b 0a 20 20 20  & res>=0) ){.   
15f50 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
15f60 20 7d 0a 0a 20 20 20 20 6d 75 6c 74 69 43 75 72   }..    multiCur
15f70 73 6f 72 43 61 63 68 65 4b 65 79 28 70 43 73 72  sorCacheKey(pCsr
15f80 2c 20 70 52 63 29 3b 0a 20 20 20 20 61 73 73 65  , pRc);.    asse
15f90 72 74 28 20 70 43 73 72 2d 3e 65 54 79 70 65 3d  rt( pCsr->eType=
15fa0 3d 65 4e 65 77 54 79 70 65 20 29 3b 0a 0a 20 20  =eNewType );..  
15fb0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63 75 72    /* If this cur
15fc0 73 6f 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65  sor is configure
15fd0 64 20 74 6f 20 73 6b 69 70 20 64 65 6c 65 74 65  d to skip delete
15fe0 64 20 6b 65 79 73 2c 20 61 6e 64 20 74 68 65 20  d keys, and the 
15ff0 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 63  current.    ** c
16000 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  ursor points to 
16010 61 20 53 4f 52 54 45 44 5f 44 45 4c 45 54 45 20  a SORTED_DELETE 
16020 65 6e 74 72 79 2c 20 74 68 65 6e 20 74 68 65 20  entry, then the 
16030 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62  cursor has not b
16040 65 65 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63  een .    ** succ
16050 65 73 73 66 75 6c 6c 79 20 61 64 76 61 6e 63 65  essfully advance
16060 64 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  d.  .    **.    
16070 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66  ** Similarly, if
16080 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 63   the cursor is c
16090 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 73 6b 69  onfigured to ski
160a0 70 20 73 79 73 74 65 6d 20 6b 65 79 73 20 61 6e  p system keys an
160b0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  d the.    ** cur
160c0 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 69 6e  rent cursor poin
160d0 74 73 20 74 6f 20 61 20 73 79 73 74 65 6d 20 6b  ts to a system k
160e0 65 79 2c 20 69 74 20 68 61 73 20 6e 6f 74 20 79  ey, it has not y
160f0 65 74 20 62 65 65 6e 20 61 64 76 61 6e 63 65 64  et been advanced
16100 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
16110 20 2a 70 52 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26   *pRc==LSM_OK &&
16120 20 30 3d 3d 6d 63 75 72 73 6f 72 4c 6f 63 61 74   0==mcursorLocat
16130 69 6f 6e 4f 6b 28 70 43 73 72 2c 20 30 29 20 29  ionOk(pCsr, 0) )
16140 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
16150 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74   return 1;.}..st
16160 61 74 69 63 20 76 6f 69 64 20 66 6c 43 73 72 41  atic void flCsrA
16170 64 76 61 6e 63 65 28 4d 75 6c 74 69 43 75 72 73  dvance(MultiCurs
16180 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 61 73 73  or *pCsr){.  ass
16190 65 72 74 28 20 70 43 73 72 2d 3e 66 6c 61 67 73  ert( pCsr->flags
161a0 20 26 20 43 55 52 53 4f 52 5f 46 4c 55 53 48 5f   & CURSOR_FLUSH_
161b0 46 52 45 45 4c 49 53 54 20 29 3b 0a 20 20 69 66  FREELIST );.  if
161c0 28 20 70 43 73 72 2d 3e 69 46 72 65 65 20 25 20  ( pCsr->iFree % 
161d0 32 20 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 69  2 ){.    pCsr->i
161e0 46 72 65 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  Free++;.  }else{
161f0 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 20  .    int nEntry 
16200 3d 20 70 43 73 72 2d 3e 70 44 62 2d 3e 70 57 6f  = pCsr->pDb->pWo
16210 72 6b 65 72 2d 3e 66 72 65 65 6c 69 73 74 2e 6e  rker->freelist.n
16220 45 6e 74 72 79 3b 0a 20 20 20 20 46 72 65 65 6c  Entry;.    Freel
16230 69 73 74 45 6e 74 72 79 20 2a 61 45 6e 74 72 79  istEntry *aEntry
16240 20 3d 20 70 43 73 72 2d 3e 70 44 62 2d 3e 70 57   = pCsr->pDb->pW
16250 6f 72 6b 65 72 2d 3e 66 72 65 65 6c 69 73 74 2e  orker->freelist.
16260 61 45 6e 74 72 79 3b 0a 0a 20 20 20 20 69 6e 74  aEntry;..    int
16270 20 69 20 3d 20 6e 45 6e 74 72 79 20 2d 20 31 20   i = nEntry - 1 
16280 2d 20 28 70 43 73 72 2d 3e 69 46 72 65 65 20 2f  - (pCsr->iFree /
16290 20 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   2);..    /* If 
162a0 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
162b0 79 20 69 73 20 61 20 64 65 6c 65 74 65 20 61 6e  y is a delete an
162c0 64 20 74 68 65 20 22 65 6e 64 2d 64 65 6c 65 74  d the "end-delet
162d0 65 22 20 6b 65 79 20 77 69 6c 6c 20 6e 6f 74 0a  e" key will not.
162e0 20 20 20 20 2a 2a 20 62 65 20 61 74 74 61 63 68      ** be attach
162f0 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  ed to the next e
16300 6e 74 72 79 2c 20 69 6e 63 72 65 6d 65 6e 74 20  ntry, increment 
16310 69 46 72 65 65 20 62 79 20 31 20 6f 6e 6c 79 2e  iFree by 1 only.
16320 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 45 6e 74   */.    if( aEnt
16330 72 79 5b 69 5d 2e 69 49 64 3c 30 20 29 7b 0a 20  ry[i].iId<0 ){. 
16340 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
16350 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
16360 30 20 7c 7c 20 61 45 6e 74 72 79 5b 69 2d 31 5d  0 || aEntry[i-1]
16370 2e 69 42 6c 6b 21 3d 61 45 6e 74 72 79 5b 69 5d  .iBlk!=aEntry[i]
16380 2e 69 42 6c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  .iBlk-1 ){.     
16390 20 20 20 20 20 70 43 73 72 2d 3e 69 46 72 65 65       pCsr->iFree
163a0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  --;.          br
163b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
163c0 20 20 20 20 20 20 20 69 66 28 20 61 45 6e 74 72         if( aEntr
163d0 79 5b 69 2d 31 5d 2e 69 49 64 3e 3d 30 20 29 20  y[i-1].iId>=0 ) 
163e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 70  break;.        p
163f0 43 73 72 2d 3e 69 46 72 65 65 20 2b 3d 20 32 3b  Csr->iFree += 2;
16400 0a 20 20 20 20 20 20 20 20 69 2d 2d 3b 0a 20 20  .        i--;.  
16410 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16420 70 43 73 72 2d 3e 69 46 72 65 65 20 2b 3d 20 32  pCsr->iFree += 2
16430 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
16440 69 6e 74 20 6d 75 6c 74 69 43 75 72 73 6f 72 41  int multiCursorA
16450 64 76 61 6e 63 65 28 4d 75 6c 74 69 43 75 72 73  dvance(MultiCurs
16460 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 62 52  or *pCsr, int bR
16470 65 76 65 72 73 65 29 7b 0a 20 20 69 6e 74 20 72  everse){.  int r
16480 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20  c = LSM_OK;     
16490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
164a0 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69  turn Code */.  i
164b0 66 28 20 6c 73 6d 4d 43 75 72 73 6f 72 56 61 6c  f( lsmMCursorVal
164c0 69 64 28 70 43 73 72 29 20 29 7b 0a 20 20 20 20  id(pCsr) ){.    
164d0 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  do {.      int i
164e0 4b 65 79 20 3d 20 70 43 73 72 2d 3e 61 54 72 65  Key = pCsr->aTre
164f0 65 5b 31 5d 3b 0a 0a 20 20 20 20 20 20 61 73 73  e[1];..      ass
16500 65 72 74 43 75 72 73 6f 72 54 72 65 65 28 70 43  ertCursorTree(pC
16510 73 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  sr);..      /* I
16520 66 20 74 68 69 73 20 6d 75 6c 74 69 2d 63 75 72  f this multi-cur
16530 73 6f 72 20 69 73 20 61 64 76 61 6e 63 69 6e 67  sor is advancing
16540 20 66 6f 72 77 61 72 64 73 2c 20 61 6e 64 20 74   forwards, and t
16550 68 65 20 73 75 62 2d 63 75 72 73 6f 72 0a 20 20  he sub-cursor.  
16560 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 61 64 76      ** being adv
16570 61 6e 63 65 64 20 69 73 20 74 68 65 20 6f 6e 65  anced is the one
16580 20 74 68 61 74 20 73 65 70 61 72 61 74 6f 72 20   that separator 
16590 6b 65 79 73 20 6d 61 79 20 62 65 20 62 65 69 6e  keys may be bein
165a0 67 20 72 65 61 64 0a 20 20 20 20 20 20 2a 2a 20  g read.      ** 
165b0 66 72 6f 6d 2c 20 72 65 63 6f 72 64 20 74 68 65  from, record the
165c0 20 63 75 72 72 65 6e 74 20 61 62 73 6f 6c 75 74   current absolut
165d0 65 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 2e  e pointer value.
165e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
165f0 43 73 72 2d 3e 70 50 72 65 76 4d 65 72 67 65 50  Csr->pPrevMergeP
16600 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  tr ){.        if
16610 28 20 69 4b 65 79 3d 3d 28 43 55 52 53 4f 52 5f  ( iKey==(CURSOR_
16620 44 41 54 41 5f 53 45 47 4d 45 4e 54 2b 70 43 73  DATA_SEGMENT+pCs
16630 72 2d 3e 6e 50 74 72 29 20 29 7b 0a 20 20 20 20  r->nPtr) ){.    
16640 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
16650 73 72 2d 3e 70 42 74 43 73 72 20 29 3b 0a 20 20  sr->pBtCsr );.  
16660 20 20 20 20 20 20 20 20 2a 70 43 73 72 2d 3e 70          *pCsr->p
16670 50 72 65 76 4d 65 72 67 65 50 74 72 20 3d 20 70  PrevMergePtr = p
16680 43 73 72 2d 3e 70 42 74 43 73 72 2d 3e 69 50 74  Csr->pBtCsr->iPt
16690 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  r;.        }else
166a0 20 69 66 28 20 70 43 73 72 2d 3e 70 42 74 43 73   if( pCsr->pBtCs
166b0 72 3d 3d 30 20 26 26 20 70 43 73 72 2d 3e 6e 50  r==0 && pCsr->nP
166c0 74 72 3e 30 0a 20 20 20 20 20 20 20 20 20 20 20  tr>0.           
166d0 20 20 20 20 26 26 20 69 4b 65 79 3d 3d 28 43 55      && iKey==(CU
166e0 52 53 4f 52 5f 44 41 54 41 5f 53 45 47 4d 45 4e  RSOR_DATA_SEGMEN
166f0 54 2b 70 43 73 72 2d 3e 6e 50 74 72 2d 31 29 20  T+pCsr->nPtr-1) 
16700 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
16710 20 20 20 20 20 20 53 65 67 6d 65 6e 74 50 74 72        SegmentPtr
16720 20 2a 70 50 74 72 20 3d 20 26 70 43 73 72 2d 3e   *pPtr = &pCsr->
16730 61 50 74 72 5b 69 4b 65 79 2d 43 55 52 53 4f 52  aPtr[iKey-CURSOR
16740 5f 44 41 54 41 5f 53 45 47 4d 45 4e 54 5d 3b 0a  _DATA_SEGMENT];.
16750 20 20 20 20 20 20 20 20 20 20 2a 70 43 73 72 2d            *pCsr-
16760 3e 70 50 72 65 76 4d 65 72 67 65 50 74 72 20 3d  >pPrevMergePtr =
16770 20 70 50 74 72 2d 3e 69 50 74 72 2b 70 50 74 72   pPtr->iPtr+pPtr
16780 2d 3e 69 50 67 50 74 72 3b 0a 20 20 20 20 20 20  ->iPgPtr;.      
16790 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
167a0 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 43 55 52     if( iKey==CUR
167b0 53 4f 52 5f 44 41 54 41 5f 54 52 45 45 30 20 7c  SOR_DATA_TREE0 |
167c0 7c 20 69 4b 65 79 3d 3d 43 55 52 53 4f 52 5f 44  | iKey==CURSOR_D
167d0 41 54 41 5f 54 52 45 45 31 20 29 7b 0a 20 20 20  ATA_TREE1 ){.   
167e0 20 20 20 20 20 54 72 65 65 43 75 72 73 6f 72 20       TreeCursor 
167f0 2a 70 54 72 65 65 43 73 72 20 3d 20 70 43 73 72  *pTreeCsr = pCsr
16800 2d 3e 61 70 54 72 65 65 43 73 72 5b 69 4b 65 79  ->apTreeCsr[iKey
16810 2d 43 55 52 53 4f 52 5f 44 41 54 41 5f 54 52 45  -CURSOR_DATA_TRE
16820 45 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  E0];.        if(
16830 20 62 52 65 76 65 72 73 65 20 29 7b 0a 20 20 20   bReverse ){.   
16840 20 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 54         rc = lsmT
16850 72 65 65 43 75 72 73 6f 72 50 72 65 76 28 70 54  reeCursorPrev(pT
16860 72 65 65 43 73 72 29 3b 0a 20 20 20 20 20 20 20  reeCsr);.       
16870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16880 20 20 72 63 20 3d 20 6c 73 6d 54 72 65 65 43 75    rc = lsmTreeCu
16890 72 73 6f 72 4e 65 78 74 28 70 54 72 65 65 43 73  rsorNext(pTreeCs
168a0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
168b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 4b      }else if( iK
168c0 65 79 3d 3d 43 55 52 53 4f 52 5f 44 41 54 41 5f  ey==CURSOR_DATA_
168d0 53 59 53 54 45 4d 20 29 7b 0a 20 20 20 20 20 20  SYSTEM ){.      
168e0 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
168f0 66 6c 61 67 73 20 26 20 43 55 52 53 4f 52 5f 46  flags & CURSOR_F
16900 4c 55 53 48 5f 46 52 45 45 4c 49 53 54 20 29 3b  LUSH_FREELIST );
16910 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16920 20 62 52 65 76 65 72 73 65 3d 3d 30 20 29 3b 0a   bReverse==0 );.
16930 20 20 20 20 20 20 20 20 66 6c 43 73 72 41 64 76          flCsrAdv
16940 61 6e 63 65 28 70 43 73 72 29 3b 0a 20 20 20 20  ance(pCsr);.    
16950 20 20 7d 65 6c 73 65 20 69 66 28 20 69 4b 65 79    }else if( iKey
16960 3d 3d 28 43 55 52 53 4f 52 5f 44 41 54 41 5f 53  ==(CURSOR_DATA_S
16970 45 47 4d 45 4e 54 2b 70 43 73 72 2d 3e 6e 50 74  EGMENT+pCsr->nPt
16980 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  r) ){.        as
16990 73 65 72 74 28 20 62 52 65 76 65 72 73 65 3d 3d  sert( bReverse==
169a0 30 20 26 26 20 70 43 73 72 2d 3e 70 42 74 43 73  0 && pCsr->pBtCs
169b0 72 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r );.        rc 
169c0 3d 20 62 74 72 65 65 43 75 72 73 6f 72 4e 65 78  = btreeCursorNex
169d0 74 28 70 43 73 72 2d 3e 70 42 74 43 73 72 29 3b  t(pCsr->pBtCsr);
169e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
169f0 20 20 20 20 20 20 72 63 20 3d 20 73 65 67 6d 65        rc = segme
16a00 6e 74 43 75 72 73 6f 72 41 64 76 61 6e 63 65 28  ntCursorAdvance(
16a10 70 43 73 72 2c 20 69 4b 65 79 2d 43 55 52 53 4f  pCsr, iKey-CURSO
16a20 52 5f 44 41 54 41 5f 53 45 47 4d 45 4e 54 2c 20  R_DATA_SEGMENT, 
16a30 62 52 65 76 65 72 73 65 29 3b 0a 20 20 20 20 20  bReverse);.     
16a40 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
16a50 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =LSM_OK ){.     
16a60 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
16a70 20 20 66 6f 72 28 69 3d 28 69 4b 65 79 2b 70 43    for(i=(iKey+pC
16a80 73 72 2d 3e 6e 54 72 65 65 29 2f 32 3b 20 69 3e  sr->nTree)/2; i>
16a90 30 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 20  0; i=i/2){.     
16aa0 20 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f 72       multiCursor
16ab0 44 6f 43 6f 6d 70 61 72 65 28 70 43 73 72 2c 20  DoCompare(pCsr, 
16ac0 69 2c 20 62 52 65 76 65 72 73 65 29 3b 0a 20 20  i, bReverse);.  
16ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16ae0 61 73 73 65 72 74 43 75 72 73 6f 72 54 72 65 65  assertCursorTree
16af0 28 70 43 73 72 29 3b 0a 20 20 20 20 20 20 7d 0a  (pCsr);.      }.
16b00 20 20 20 20 7d 77 68 69 6c 65 28 20 6d 63 75 72      }while( mcur
16b10 73 6f 72 41 64 76 61 6e 63 65 4f 6b 28 70 43 73  sorAdvanceOk(pCs
16b20 72 2c 20 62 52 65 76 65 72 73 65 2c 20 26 72 63  r, bReverse, &rc
16b30 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 65  )==0 );.  }.  re
16b40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20  turn rc;.}..int 
16b50 6c 73 6d 4d 43 75 72 73 6f 72 4e 65 78 74 28 4d  lsmMCursorNext(M
16b60 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72  ultiCursor *pCsr
16b70 29 7b 0a 20 20 69 66 28 20 28 70 43 73 72 2d 3e  ){.  if( (pCsr->
16b80 66 6c 61 67 73 20 26 20 43 55 52 53 4f 52 5f 4e  flags & CURSOR_N
16b90 45 58 54 5f 4f 4b 29 3d 3d 30 20 29 20 72 65 74  EXT_OK)==0 ) ret
16ba0 75 72 6e 20 4c 53 4d 5f 4d 49 53 55 53 45 5f 42  urn LSM_MISUSE_B
16bb0 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 6d 75  KPT;.  return mu
16bc0 6c 74 69 43 75 72 73 6f 72 41 64 76 61 6e 63 65  ltiCursorAdvance
16bd0 28 70 43 73 72 2c 20 30 29 3b 0a 7d 0a 0a 69 6e  (pCsr, 0);.}..in
16be0 74 20 6c 73 6d 4d 43 75 72 73 6f 72 50 72 65 76  t lsmMCursorPrev
16bf0 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43  (MultiCursor *pC
16c00 73 72 29 7b 0a 20 20 69 66 28 20 28 70 43 73 72  sr){.  if( (pCsr
16c10 2d 3e 66 6c 61 67 73 20 26 20 43 55 52 53 4f 52  ->flags & CURSOR
16c20 5f 50 52 45 56 5f 4f 4b 29 3d 3d 30 20 29 20 72  _PREV_OK)==0 ) r
16c30 65 74 75 72 6e 20 4c 53 4d 5f 4d 49 53 55 53 45  eturn LSM_MISUSE
16c40 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  _BKPT;.  return 
16c50 6d 75 6c 74 69 43 75 72 73 6f 72 41 64 76 61 6e  multiCursorAdvan
16c60 63 65 28 70 43 73 72 2c 20 31 29 3b 0a 7d 0a 0a  ce(pCsr, 1);.}..
16c70 69 6e 74 20 6c 73 6d 4d 43 75 72 73 6f 72 4b 65  int lsmMCursorKe
16c80 79 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70  y(MultiCursor *p
16c90 43 73 72 2c 20 76 6f 69 64 20 2a 2a 70 70 4b 65  Csr, void **ppKe
16ca0 79 2c 20 69 6e 74 20 2a 70 6e 4b 65 79 29 7b 0a  y, int *pnKey){.
16cb0 20 20 69 66 28 20 28 70 43 73 72 2d 3e 66 6c 61    if( (pCsr->fla
16cc0 67 73 20 26 20 43 55 52 53 4f 52 5f 53 45 45 4b  gs & CURSOR_SEEK
16cd0 5f 45 51 29 20 7c 7c 20 70 43 73 72 2d 3e 61 54  _EQ) || pCsr->aT
16ce0 72 65 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  ree==0 ){.    *p
16cf0 6e 4b 65 79 20 3d 20 70 43 73 72 2d 3e 6b 65 79  nKey = pCsr->key
16d00 2e 6e 44 61 74 61 3b 0a 20 20 20 20 2a 70 70 4b  .nData;.    *ppK
16d10 65 79 20 3d 20 70 43 73 72 2d 3e 6b 65 79 2e 70  ey = pCsr->key.p
16d20 44 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Data;.  }else{. 
16d30 20 20 20 69 6e 74 20 69 4b 65 79 20 3d 20 70 43     int iKey = pC
16d40 73 72 2d 3e 61 54 72 65 65 5b 31 5d 3b 0a 0a 20  sr->aTree[1];.. 
16d50 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 43 55 52     if( iKey==CUR
16d60 53 4f 52 5f 44 41 54 41 5f 54 52 45 45 30 20 7c  SOR_DATA_TREE0 |
16d70 7c 20 69 4b 65 79 3d 3d 43 55 52 53 4f 52 5f 44  | iKey==CURSOR_D
16d80 41 54 41 5f 54 52 45 45 31 20 29 7b 0a 20 20 20  ATA_TREE1 ){.   
16d90 20 20 20 54 72 65 65 43 75 72 73 6f 72 20 2a 70     TreeCursor *p
16da0 54 72 65 65 43 73 72 20 3d 20 70 43 73 72 2d 3e  TreeCsr = pCsr->
16db0 61 70 54 72 65 65 43 73 72 5b 69 4b 65 79 2d 43  apTreeCsr[iKey-C
16dc0 55 52 53 4f 52 5f 44 41 54 41 5f 54 52 45 45 30  URSOR_DATA_TREE0
16dd0 5d 3b 0a 20 20 20 20 20 20 6c 73 6d 54 72 65 65  ];.      lsmTree
16de0 43 75 72 73 6f 72 4b 65 79 28 70 54 72 65 65 43  CursorKey(pTreeC
16df0 73 72 2c 20 30 2c 20 70 70 4b 65 79 2c 20 70 6e  sr, 0, ppKey, pn
16e00 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Key);.    }else{
16e10 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b  .      int nKey;
16e20 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
16e30 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  .      void *pKe
16e40 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 65 54 79  y;.      int eTy
16e50 70 65 3b 0a 20 20 20 20 20 20 6d 75 6c 74 69 43  pe;.      multiC
16e60 75 72 73 6f 72 47 65 74 4b 65 79 28 70 43 73 72  ursorGetKey(pCsr
16e70 2c 20 69 4b 65 79 2c 20 26 65 54 79 70 65 2c 20  , iKey, &eType, 
16e80 26 70 4b 65 79 2c 20 26 6e 4b 65 79 29 3b 0a 20  &pKey, &nKey);. 
16e90 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
16ea0 70 65 3d 3d 70 43 73 72 2d 3e 65 54 79 70 65 20  pe==pCsr->eType 
16eb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16ec0 20 6e 4b 65 79 3d 3d 70 43 73 72 2d 3e 6b 65 79   nKey==pCsr->key
16ed0 2e 6e 44 61 74 61 20 29 3b 0a 20 20 20 20 20 20  .nData );.      
16ee0 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 70  assert( memcmp(p
16ef0 4b 65 79 2c 20 70 43 73 72 2d 3e 6b 65 79 2e 70  Key, pCsr->key.p
16f00 44 61 74 61 2c 20 6e 4b 65 79 29 3d 3d 30 20 29  Data, nKey)==0 )
16f10 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
16f20 6e 4b 65 79 20 3d 20 70 43 73 72 2d 3e 6b 65 79  nKey = pCsr->key
16f30 2e 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 69 66  .nData;.      if
16f40 28 20 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ( nKey==0 ){.   
16f50 20 20 20 20 20 2a 70 70 4b 65 79 20 3d 20 30 3b       *ppKey = 0;
16f60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16f70 20 20 20 20 20 20 2a 70 70 4b 65 79 20 3d 20 70        *ppKey = p
16f80 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74 61 3b 0a  Csr->key.pData;.
16f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
16fa0 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b 20 0a 20 20  nKey = nKey; .  
16fb0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
16fc0 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   LSM_OK;.}../*.*
16fd0 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 75  * Compare the cu
16fe0 72 72 65 6e 74 20 6b 65 79 20 74 68 61 74 20 63  rrent key that c
16ff0 75 72 73 6f 72 20 63 73 72 20 70 6f 69 6e 74 73  ursor csr points
17000 20 74 6f 20 77 69 74 68 20 70 4b 65 79 2f 6e 4b   to with pKey/nK
17010 65 79 2e 20 53 65 74 0a 2a 2a 20 2a 70 69 52 65  ey. Set.** *piRe
17020 73 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  s to the result 
17030 61 6e 64 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f  and return LSM_O
17040 4b 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 5f 63 73  K..*/.int lsm_cs
17050 72 5f 63 6d 70 28 6c 73 6d 5f 63 75 72 73 6f 72  r_cmp(lsm_cursor
17060 20 2a 63 73 72 2c 20 63 6f 6e 73 74 20 76 6f 69   *csr, const voi
17070 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65  d *pKey, int nKe
17080 79 2c 20 69 6e 74 20 2a 70 69 52 65 73 29 7b 0a  y, int *piRes){.
17090 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70    MultiCursor *p
170a0 43 73 72 20 3d 20 28 4d 75 6c 74 69 43 75 72 73  Csr = (MultiCurs
170b0 6f 72 20 2a 29 63 73 72 3b 0a 20 20 76 6f 69 64  or *)csr;.  void
170c0 20 2a 70 43 73 72 6b 65 79 3b 20 69 6e 74 20 6e   *pCsrkey; int n
170d0 43 73 72 6b 65 79 3b 0a 20 20 69 6e 74 20 72 63  Csrkey;.  int rc
170e0 3b 0a 20 20 72 63 20 3d 20 6c 73 6d 4d 43 75 72  ;.  rc = lsmMCur
170f0 73 6f 72 4b 65 79 28 70 43 73 72 2c 20 26 70 43  sorKey(pCsr, &pC
17100 73 72 6b 65 79 2c 20 26 6e 43 73 72 6b 65 79 29  srkey, &nCsrkey)
17110 3b 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f  ;.  if( rc==LSM_
17120 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 28 2a  OK ){.    int (*
17130 78 43 6d 70 29 28 76 6f 69 64 20 2a 2c 20 69 6e  xCmp)(void *, in
17140 74 2c 20 76 6f 69 64 20 2a 2c 20 69 6e 74 29 20  t, void *, int) 
17150 3d 20 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d  = pCsr->pDb->xCm
17160 70 3b 0a 20 20 20 20 2a 70 69 52 65 73 20 3d 20  p;.    *piRes = 
17170 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65  sortedKeyCompare
17180 28 78 43 6d 70 2c 20 30 2c 20 70 43 73 72 6b 65  (xCmp, 0, pCsrke
17190 79 2c 20 6e 43 73 72 6b 65 79 2c 20 30 2c 20 28  y, nCsrkey, 0, (
171a0 76 6f 69 64 20 2a 29 70 4b 65 79 2c 20 6e 4b 65  void *)pKey, nKe
171b0 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  y);.  }.  return
171c0 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 4d   rc;.}..int lsmM
171d0 43 75 72 73 6f 72 56 61 6c 75 65 28 4d 75 6c 74  CursorValue(Mult
171e0 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 76  iCursor *pCsr, v
171f0 6f 69 64 20 2a 2a 70 70 56 61 6c 2c 20 69 6e 74  oid **ppVal, int
17200 20 2a 70 6e 56 61 6c 29 7b 0a 20 20 76 6f 69 64   *pnVal){.  void
17210 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 56   *pVal;.  int nV
17220 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  al;.  int rc;.  
17230 69 66 28 20 28 70 43 73 72 2d 3e 66 6c 61 67 73  if( (pCsr->flags
17240 20 26 20 43 55 52 53 4f 52 5f 53 45 45 4b 5f 45   & CURSOR_SEEK_E
17250 51 29 20 7c 7c 20 70 43 73 72 2d 3e 61 54 72 65  Q) || pCsr->aTre
17260 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  e==0 ){.    rc =
17270 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 20 20 6e 56 61   LSM_OK;.    nVa
17280 6c 20 3d 20 70 43 73 72 2d 3e 76 61 6c 2e 6e 44  l = pCsr->val.nD
17290 61 74 61 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20  ata;.    pVal = 
172a0 70 43 73 72 2d 3e 76 61 6c 2e 70 44 61 74 61 3b  pCsr->val.pData;
172b0 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 61  .  }else{..    a
172c0 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61 54 72  ssert( pCsr->aTr
172d0 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
172e0 28 20 6d 63 75 72 73 6f 72 4c 6f 63 61 74 69 6f  ( mcursorLocatio
172f0 6e 4f 6b 28 70 43 73 72 2c 20 28 70 43 73 72 2d  nOk(pCsr, (pCsr-
17300 3e 66 6c 61 67 73 20 26 20 43 55 52 53 4f 52 5f  >flags & CURSOR_
17310 49 47 4e 4f 52 45 5f 44 45 4c 45 54 45 29 29 20  IGNORE_DELETE)) 
17320 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c  );..    rc = mul
17330 74 69 43 75 72 73 6f 72 47 65 74 56 61 6c 28 70  tiCursorGetVal(p
17340 43 73 72 2c 20 70 43 73 72 2d 3e 61 54 72 65 65  Csr, pCsr->aTree
17350 5b 31 5d 2c 20 26 70 56 61 6c 2c 20 26 6e 56 61  [1], &pVal, &nVa
17360 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 56 61 6c  l);.    if( pVal
17370 20 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29   && rc==LSM_OK )
17380 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 6f 72  {.      rc = sor
17390 74 65 64 42 6c 6f 62 53 65 74 28 70 43 73 72 2d  tedBlobSet(pCsr-
173a0 3e 70 44 62 2d 3e 70 45 6e 76 2c 20 26 70 43 73  >pDb->pEnv, &pCs
173b0 72 2d 3e 76 61 6c 2c 20 70 56 61 6c 2c 20 6e 56  r->val, pVal, nV
173c0 61 6c 29 3b 0a 20 20 20 20 20 20 70 56 61 6c 20  al);.      pVal 
173d0 3d 20 70 43 73 72 2d 3e 76 61 6c 2e 70 44 61 74  = pCsr->val.pDat
173e0 61 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  a;.    }..    if
173f0 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc!=LSM_OK ){.
17400 20 20 20 20 20 20 70 56 61 6c 20 3d 20 30 3b 0a        pVal = 0;.
17410 20 20 20 20 20 20 6e 56 61 6c 20 3d 20 30 3b 0a        nVal = 0;.
17420 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 56      }.  }.  *ppV
17430 61 6c 20 3d 20 70 56 61 6c 3b 0a 20 20 2a 70 6e  al = pVal;.  *pn
17440 56 61 6c 20 3d 20 6e 56 61 6c 3b 0a 20 20 72 65  Val = nVal;.  re
17450 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20  turn rc;.}..int 
17460 6c 73 6d 4d 43 75 72 73 6f 72 54 79 70 65 28 4d  lsmMCursorType(M
17470 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72  ultiCursor *pCsr
17480 2c 20 69 6e 74 20 2a 70 65 54 79 70 65 29 7b 0a  , int *peType){.
17490 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
174a0 61 54 72 65 65 20 29 3b 0a 20 20 6d 75 6c 74 69  aTree );.  multi
174b0 43 75 72 73 6f 72 47 65 74 4b 65 79 28 70 43 73  CursorGetKey(pCs
174c0 72 2c 20 70 43 73 72 2d 3e 61 54 72 65 65 5b 31  r, pCsr->aTree[1
174d0 5d 2c 20 70 65 54 79 70 65 2c 20 30 2c 20 30 29  ], peType, 0, 0)
174e0 3b 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f  ;.  return LSM_O
174f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66  K;.}../*.** Buff
17500 65 72 20 61 44 61 74 61 5b 5d 2c 20 73 69 7a 65  er aData[], size
17510 20 6e 44 61 74 61 2c 20 69 73 20 61 73 73 75 6d   nData, is assum
17520 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20  ed to contain a 
17530 76 61 6c 69 64 20 62 2d 74 72 65 65 20 0a 2a 2a  valid b-tree .**
17540 20 68 69 65 72 61 72 63 68 79 20 70 61 67 65 20   hierarchy page 
17550 69 6d 61 67 65 2e 20 52 65 74 75 72 6e 20 74 68  image. Return th
17560 65 20 6f 66 66 73 65 74 20 69 6e 20 61 44 61 74  e offset in aDat
17570 61 5b 5d 20 6f 66 20 74 68 65 20 6e 65 78 74 20  a[] of the next 
17580 66 72 65 65 0a 2a 2a 20 62 79 74 65 20 69 6e 20  free.** byte in 
17590 74 68 65 20 64 61 74 61 20 61 72 65 61 20 28 77  the data area (w
175a0 68 65 72 65 20 61 20 6e 65 77 20 63 65 6c 6c 20  here a new cell 
175b0 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 69  may be written i
175c0 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 73 70  f there is.** sp
175d0 61 63 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ace)..*/.static 
175e0 69 6e 74 20 6d 65 72 67 65 57 6f 72 6b 65 72 50  int mergeWorkerP
175f0 61 67 65 4f 66 66 73 65 74 28 75 38 20 2a 61 44  ageOffset(u8 *aD
17600 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b  ata, int nData){
17610 0a 20 20 69 6e 74 20 6e 52 65 63 3b 0a 20 20 69  .  int nRec;.  i
17620 6e 74 20 69 4f 66 66 3b 0a 20 20 69 6e 74 20 6e  nt iOff;.  int n
17630 4b 65 79 3b 0a 20 20 69 6e 74 20 65 54 79 70 65  Key;.  int eType
17640 3b 0a 0a 20 20 6e 52 65 63 20 3d 20 6c 73 6d 47  ;..  nRec = lsmG
17650 65 74 55 31 36 28 26 61 44 61 74 61 5b 53 45 47  etU16(&aData[SEG
17660 4d 45 4e 54 5f 4e 52 45 43 4f 52 44 5f 4f 46 46  MENT_NRECORD_OFF
17670 53 45 54 28 6e 44 61 74 61 29 5d 29 3b 0a 20 20  SET(nData)]);.  
17680 69 4f 66 66 20 3d 20 6c 73 6d 47 65 74 55 31 36  iOff = lsmGetU16
17690 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54 5f  (&aData[SEGMENT_
176a0 43 45 4c 4c 50 54 52 5f 4f 46 46 53 45 54 28 6e  CELLPTR_OFFSET(n
176b0 44 61 74 61 2c 20 6e 52 65 63 2d 31 29 5d 29 3b  Data, nRec-1)]);
176c0 0a 20 20 65 54 79 70 65 20 3d 20 61 44 61 74 61  .  eType = aData
176d0 5b 69 4f 66 66 2b 2b 5d 3b 0a 20 20 61 73 73 65  [iOff++];.  asse
176e0 72 74 28 20 65 54 79 70 65 3d 3d 30 20 0a 20 20  rt( eType==0 .  
176f0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 28       || eType==(
17700 4c 53 4d 5f 53 59 53 54 45 4d 4b 45 59 7c 4c 53  LSM_SYSTEMKEY|LS
17710 4d 5f 53 45 50 41 52 41 54 4f 52 29 20 0a 20 20  M_SEPARATOR) .  
17720 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 28       || eType==(
17730 4c 53 4d 5f 53 45 50 41 52 41 54 4f 52 29 0a 20  LSM_SEPARATOR). 
17740 20 29 3b 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 6c   );..  iOff += l
17750 73 6d 56 61 72 69 6e 74 47 65 74 33 32 28 26 61  smVarintGet32(&a
17760 44 61 74 61 5b 69 4f 66 66 5d 2c 20 26 6e 4b 65  Data[iOff], &nKe
17770 79 29 3b 0a 20 20 69 4f 66 66 20 2b 3d 20 6c 73  y);.  iOff += ls
17780 6d 56 61 72 69 6e 74 47 65 74 33 32 28 26 61 44  mVarintGet32(&aD
17790 61 74 61 5b 69 4f 66 66 5d 2c 20 26 6e 4b 65 79  ata[iOff], &nKey
177a0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66  );..  return iOf
177b0 66 20 2b 20 28 65 54 79 70 65 20 3f 20 6e 4b 65  f + (eType ? nKe
177c0 79 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  y : 0);.}../*.**
177d0 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 68 65   Following a che
177e0 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f  ckpoint operatio
177f0 6e 2c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  n, database page
17800 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74 20  s that are part 
17810 6f 66 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 70  of the.** checkp
17820 6f 69 6e 74 65 64 20 73 74 61 74 65 20 6f 66 20  ointed state of 
17830 74 68 65 20 4c 53 4d 20 61 72 65 20 64 65 65 6d  the LSM are deem
17840 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 54 68  ed read-only. Th
17850 69 73 20 69 6e 63 6c 75 64 65 73 20 74 68 65 0a  is includes the.
17860 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61  ** right-most pa
17870 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17880 20 68 69 65 72 61 72 63 68 79 20 6f 66 20 61 6e   hierarchy of an
17890 79 20 73 65 70 61 72 61 74 6f 72 73 20 61 72 72  y separators arr
178a0 61 79 20 75 6e 64 65 72 0a 2a 2a 20 63 6f 6e 73  ay under.** cons
178b0 74 72 75 63 74 69 6f 6e 2c 20 61 6e 64 20 61 6c  truction, and al
178c0 6c 20 70 61 67 65 73 20 62 65 74 77 65 65 6e 20  l pages between 
178d0 69 74 20 61 6e 64 20 74 68 65 20 62 2d 74 72 65  it and the b-tre
178e0 65 20 72 6f 6f 74 2c 20 69 6e 63 6c 75 73 69 76  e root, inclusiv
178f0 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
17900 70 72 6f 62 6c 65 6d 2c 20 61 73 20 77 68 65 6e  problem, as when
17910 20 66 75 72 74 68 65 72 20 70 61 67 65 73 20 61   further pages a
17920 72 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  re appended to t
17930 68 65 20 73 65 70 61 72 61 74 6f 72 73 0a 2a 2a  he separators.**
17940 20 61 72 72 61 79 2c 20 65 6e 74 72 69 65 73 20   array, entries 
17950 6d 75 73 74 20 62 65 20 61 64 64 65 64 20 74 6f  must be added to
17960 20 74 68 65 20 69 6e 64 69 63 61 74 65 64 20 62   the indicated b
17970 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
17980 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  pages..**.** Thi
17990 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65  s function copie
179a0 73 20 61 6c 6c 20 73 75 63 68 20 62 2d 74 72 65  s all such b-tre
179b0 65 20 70 61 67 65 73 20 74 6f 20 6e 65 77 20 6c  e pages to new l
179c0 6f 63 61 74 69 6f 6e 73 2c 20 73 6f 20 74 68 61  ocations, so tha
179d0 74 0a 2a 2a 20 74 68 65 79 20 63 61 6e 20 62 65  t.** they can be
179e0 20 6d 6f 64 69 66 69 65 64 20 61 73 20 72 65 71   modified as req
179f0 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uired..**.** The
17a00 20 63 6f 6d 70 6c 69 63 61 74 69 6f 6e 20 69 73   complication is
17a10 20 74 68 61 74 20 6e 6f 74 20 61 6c 6c 20 64 61   that not all da
17a20 74 61 62 61 73 65 20 70 61 67 65 73 20 61 72 65  tabase pages are
17a30 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 2d   the same size -
17a40 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20 77   due.** to the w
17a50 61 79 20 74 68 65 20 66 69 6c 65 2e 63 20 6d 6f  ay the file.c mo
17a60 64 75 6c 65 20 77 6f 72 6b 73 20 73 6f 6d 65 20  dule works some 
17a70 28 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c  (the first and l
17a80 61 73 74 20 69 6e 20 65 61 63 68 20 62 6c 6f 63  ast in each bloc
17a90 6b 29 0a 2a 2a 20 61 72 65 20 34 20 62 79 74 65  k).** are 4 byte
17aa0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
17ab0 68 65 20 6f 74 68 65 72 73 2e 0a 2a 2f 0a 73 74  he others..*/.st
17ac0 61 74 69 63 20 69 6e 74 20 6d 65 72 67 65 57 6f  atic int mergeWo
17ad0 72 6b 65 72 4d 6f 76 65 48 69 65 72 61 72 63 68  rkerMoveHierarch
17ae0 79 28 0a 20 20 4d 65 72 67 65 57 6f 72 6b 65 72  y(.  MergeWorker
17af0 20 2a 70 4d 57 2c 20 20 20 20 20 20 20 20 20 20   *pMW,          
17b00 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 77 6f       /* Merge wo
17b10 72 6b 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 53  rker */.  int bS
17b20 65 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ep              
17b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
17b40 65 20 66 6f 72 20 73 65 70 61 72 61 74 6f 72 73  e for separators
17b50 20 72 75 6e 20 2a 2f 0a 29 7b 0a 20 20 6c 73 6d   run */.){.  lsm
17b60 5f 64 62 20 2a 70 44 62 20 3d 20 70 4d 57 2d 3e  _db *pDb = pMW->
17b70 70 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  pDb;         /* 
17b80 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
17b90 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  */.  int rc = LS
17ba0 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  M_OK;           
17bb0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
17bc0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  ode */.  int i;.
17bd0 20 20 50 61 67 65 20 2a 2a 61 70 48 69 65 72 20    Page **apHier 
17be0 3d 20 70 4d 57 2d 3e 68 69 65 72 2e 61 70 48 69  = pMW->hier.apHi
17bf0 65 72 3b 0a 20 20 69 6e 74 20 6e 48 69 65 72 20  er;.  int nHier 
17c00 3d 20 70 4d 57 2d 3e 68 69 65 72 2e 6e 48 69 65  = pMW->hier.nHie
17c10 72 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  r;..  for(i=0; r
17c20 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 69 3c 6e  c==LSM_OK && i<n
17c30 48 69 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Hier; i++){.    
17c40 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  Page *pNew = 0;.
17c50 20 20 20 20 72 63 20 3d 20 6c 73 6d 46 73 53 6f      rc = lsmFsSo
17c60 72 74 65 64 41 70 70 65 6e 64 28 70 44 62 2d 3e  rtedAppend(pDb->
17c70 70 46 53 2c 20 70 44 62 2d 3e 70 57 6f 72 6b 65  pFS, pDb->pWorke
17c80 72 2c 20 70 4d 57 2d 3e 70 4c 65 76 65 6c 2c 20  r, pMW->pLevel, 
17c90 31 2c 20 26 70 4e 65 77 29 3b 0a 20 20 20 20 61  1, &pNew);.    a
17ca0 73 73 65 72 74 28 20 72 63 3d 3d 4c 53 4d 5f 4f  ssert( rc==LSM_O
17cb0 4b 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  K );..    if( rc
17cc0 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
17cd0 20 20 75 38 20 2a 61 31 3b 20 69 6e 74 20 6e 31    u8 *a1; int n1
17ce0 3b 0a 20 20 20 20 20 20 75 38 20 2a 61 32 3b 20  ;.      u8 *a2; 
17cf0 69 6e 74 20 6e 32 3b 0a 0a 20 20 20 20 20 20 61  int n2;..      a
17d00 31 20 3d 20 66 73 50 61 67 65 44 61 74 61 28 70  1 = fsPageData(p
17d10 4e 65 77 2c 20 26 6e 31 29 3b 0a 20 20 20 20 20  New, &n1);.     
17d20 20 61 32 20 3d 20 66 73 50 61 67 65 44 61 74 61   a2 = fsPageData
17d30 28 61 70 48 69 65 72 5b 69 5d 2c 20 26 6e 32 29  (apHier[i], &n2)
17d40 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
17d50 20 6e 31 3d 3d 6e 32 20 7c 7c 20 6e 31 2b 34 3d   n1==n2 || n1+4=
17d60 3d 6e 32 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  =n2 );..      if
17d70 28 20 6e 31 3d 3d 6e 32 20 29 7b 0a 20 20 20 20  ( n1==n2 ){.    
17d80 20 20 20 20 6d 65 6d 63 70 79 28 61 31 2c 20 61      memcpy(a1, a
17d90 32 2c 20 6e 32 29 3b 0a 20 20 20 20 20 20 7d 65  2, n2);.      }e
17da0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
17db0 20 6e 45 6e 74 72 79 20 3d 20 70 61 67 65 47 65   nEntry = pageGe
17dc0 74 4e 52 65 63 28 61 32 2c 20 6e 32 29 3b 0a 20  tNRec(a2, n2);. 
17dd0 20 20 20 20 20 20 20 69 6e 74 20 69 45 6f 66 31         int iEof1
17de0 20 3d 20 53 45 47 4d 45 4e 54 5f 45 4f 46 28 6e   = SEGMENT_EOF(n
17df0 31 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20  1, nEntry);.    
17e00 20 20 20 20 69 6e 74 20 69 45 6f 66 32 20 3d 20      int iEof2 = 
17e10 53 45 47 4d 45 4e 54 5f 45 4f 46 28 6e 32 2c 20  SEGMENT_EOF(n2, 
17e20 6e 45 6e 74 72 79 29 3b 0a 0a 20 20 20 20 20 20  nEntry);..      
17e30 20 20 6d 65 6d 63 70 79 28 61 31 2c 20 61 32 2c    memcpy(a1, a2,
17e40 20 69 45 6f 66 32 20 2d 20 34 29 3b 0a 20 20 20   iEof2 - 4);.   
17e50 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 31 5b       memcpy(&a1[
17e60 69 45 6f 66 31 5d 2c 20 26 61 32 5b 69 45 6f 66  iEof1], &a2[iEof
17e70 32 5d 2c 20 6e 32 20 2d 20 69 45 6f 66 32 29 3b  2], n2 - iEof2);
17e80 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17e90 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65  lsmFsPageRelease
17ea0 28 61 70 48 69 65 72 5b 69 5d 29 3b 0a 20 20 20  (apHier[i]);.   
17eb0 20 20 20 61 70 48 69 65 72 5b 69 5d 20 3d 20 70     apHier[i] = p
17ec0 4e 65 77 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20  New;..#if 0.    
17ed0 20 20 61 73 73 65 72 74 28 20 6e 31 3d 3d 6e 32    assert( n1==n2
17ee0 20 7c 7c 20 6e 31 2b 34 3d 3d 6e 32 20 7c 7c 20   || n1+4==n2 || 
17ef0 6e 32 2b 34 3d 3d 6e 31 20 29 3b 0a 20 20 20 20  n2+4==n1 );.    
17f00 20 20 69 66 28 20 6e 31 3e 3d 6e 32 20 29 7b 0a    if( n1>=n2 ){.
17f10 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 31          /* If n1
17f20 20 28 73 69 7a 65 20 6f 66 20 74 68 65 20 6e 65   (size of the ne
17f30 77 20 70 61 67 65 29 20 69 73 20 65 71 75 61 6c  w page) is equal
17f40 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74   to or greater t
17f50 68 61 6e 20 6e 32 20 28 74 68 65 0a 20 20 20 20  han n2 (the.    
17f60 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
17f70 68 65 20 6f 6c 64 20 70 61 67 65 29 2c 20 74 68  he old page), th
17f80 65 6e 20 63 6f 70 79 20 74 68 65 20 64 61 74 61  en copy the data
17f90 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 70 61   into the new pa
17fa0 67 65 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  ge. If.        *
17fb0 2a 20 6e 31 3d 3d 6e 32 2c 20 74 68 69 73 20 63  * n1==n2, this c
17fc0 6f 75 6c 64 20 62 65 20 64 6f 6e 65 20 77 69 74  ould be done wit
17fd0 68 20 61 20 73 69 6e 67 6c 65 20 6d 65 6d 63 70  h a single memcp
17fe0 79 28 29 2e 20 48 6f 77 65 76 65 72 2c 20 0a 20  y(). However, . 
17ff0 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20         ** since 
18000 73 6f 6d 65 74 69 6d 65 73 20 6e 31 3e 6e 32 2c  sometimes n1>n2,
18010 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
18020 74 20 61 6e 64 20 66 6f 6f 74 65 72 20 6d 75 73  t and footer mus
18030 74 20 62 65 20 63 6f 70 69 65 64 20 0a 20 20 20  t be copied .   
18040 20 20 20 20 20 2a 2a 20 73 65 70 61 72 61 74 65       ** separate
18050 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ly. */.        i
18060 6e 74 20 6e 45 6e 74 72 79 20 3d 20 70 61 67 65  nt nEntry = page
18070 47 65 74 4e 52 65 63 28 61 32 2c 20 6e 32 29 3b  GetNRec(a2, n2);
18080 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 45 6f  .        int iEo
18090 66 31 20 3d 20 53 45 47 4d 45 4e 54 5f 45 4f 46  f1 = SEGMENT_EOF
180a0 28 6e 31 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20  (n1, nEntry);.  
180b0 20 20 20 20 20 20 69 6e 74 20 69 45 6f 66 32 20        int iEof2 
180c0 3d 20 53 45 47 4d 45 4e 54 5f 45 4f 46 28 6e 32  = SEGMENT_EOF(n2
180d0 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20 20  , nEntry);.     
180e0 20 20 20 6d 65 6d 63 70 79 28 61 31 2c 20 61 32     memcpy(a1, a2
180f0 2c 20 69 45 6f 66 32 29 3b 0a 20 20 20 20 20 20  , iEof2);.      
18100 20 20 6d 65 6d 63 70 79 28 26 61 31 5b 69 45 6f    memcpy(&a1[iEo
18110 66 31 5d 2c 20 26 61 32 5b 69 45 6f 66 32 5d 2c  f1], &a2[iEof2],
18120 20 6e 32 20 2d 20 69 45 6f 66 32 29 3b 0a 20 20   n2 - iEof2);.  
18130 20 20 20 20 20 20 6c 73 6d 46 73 50 61 67 65 52        lsmFsPageR
18140 65 6c 65 61 73 65 28 61 70 48 69 65 72 5b 69 5d  elease(apHier[i]
18150 29 3b 0a 20 20 20 20 20 20 20 20 61 70 48 69 65  );.        apHie
18160 72 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20  r[i] = pNew;.   
18170 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18180 20 20 6c 73 6d 50 75 74 55 31 36 28 26 61 31 5b    lsmPutU16(&a1[
18190 53 45 47 4d 45 4e 54 5f 46 4c 41 47 53 5f 4f 46  SEGMENT_FLAGS_OF
181a0 46 53 45 54 28 6e 31 29 5d 2c 20 53 45 47 4d 45  FSET(n1)], SEGME
181b0 4e 54 5f 42 54 52 45 45 5f 46 4c 41 47 29 3b 0a  NT_BTREE_FLAG);.
181c0 20 20 20 20 20 20 20 20 6c 73 6d 50 75 74 55 31          lsmPutU1
181d0 36 28 26 61 31 5b 53 45 47 4d 45 4e 54 5f 4e 52  6(&a1[SEGMENT_NR
181e0 45 43 4f 52 44 5f 4f 46 46 53 45 54 28 6e 31 29  ECORD_OFFSET(n1)
181f0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6c  ], 0);.        l
18200 73 6d 50 75 74 55 36 34 28 26 61 31 5b 53 45 47  smPutU64(&a1[SEG
18210 4d 45 4e 54 5f 50 4f 49 4e 54 45 52 5f 4f 46 46  MENT_POINTER_OFF
18220 53 45 54 28 6e 31 29 5d 2c 20 30 29 3b 0a 20 20  SET(n1)], 0);.  
18230 20 20 20 20 20 20 69 20 3d 20 69 20 2d 20 31 3b        i = i - 1;
18240 0a 20 20 20 20 20 20 20 20 6c 73 6d 46 73 50 61  .        lsmFsPa
18250 67 65 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b  geRelease(pNew);
18260 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
18270 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
18280 66 20 4c 53 4d 5f 44 45 42 55 47 0a 20 20 69 66  f LSM_DEBUG.  if
18290 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
182a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
182b0 48 69 65 72 3b 20 69 2b 2b 29 20 61 73 73 65 72  Hier; i++) asser
182c0 74 28 20 6c 73 6d 46 73 50 61 67 65 57 72 69 74  t( lsmFsPageWrit
182d0 61 62 6c 65 28 61 70 48 69 65 72 5b 69 5d 29 20  able(apHier[i]) 
182e0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
182f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18300 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
18310 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 4d  d populate the M
18320 65 72 67 65 57 6f 72 6b 65 72 2e 61 70 48 69 65  ergeWorker.apHie
18330 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  r[] array..*/.st
18340 61 74 69 63 20 69 6e 74 20 6d 65 72 67 65 57 6f  atic int mergeWo
18350 72 6b 65 72 4c 6f 61 64 48 69 65 72 61 72 63 68  rkerLoadHierarch
18360 79 28 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70  y(MergeWorker *p
18370 4d 57 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  MW){.  int rc = 
18380 4c 53 4d 5f 4f 4b 3b 0a 20 20 53 65 67 6d 65 6e  LSM_OK;.  Segmen
18390 74 20 2a 70 53 65 67 3b 0a 20 20 48 69 65 72 61  t *pSeg;.  Hiera
183a0 72 63 68 79 20 2a 70 3b 0a 20 0a 20 20 70 53 65  rchy *p;. .  pSe
183b0 67 20 3d 20 26 70 4d 57 2d 3e 70 4c 65 76 65 6c  g = &pMW->pLevel
183c0 2d 3e 6c 68 73 3b 0a 20 20 70 20 3d 20 26 70 4d  ->lhs;.  p = &pM
183d0 57 2d 3e 68 69 65 72 3b 0a 0a 20 20 69 66 28 20  W->hier;..  if( 
183e0 70 2d 3e 61 70 48 69 65 72 3d 3d 30 20 26 26 20  p->apHier==0 && 
183f0 70 53 65 67 2d 3e 69 52 6f 6f 74 21 3d 30 20 29  pSeg->iRoot!=0 )
18400 7b 0a 20 20 20 20 46 69 6c 65 53 79 73 74 65 6d  {.    FileSystem
18410 20 2a 70 46 53 20 3d 20 70 4d 57 2d 3e 70 44 62   *pFS = pMW->pDb
18420 2d 3e 70 46 53 3b 0a 20 20 20 20 6c 73 6d 5f 65  ->pFS;.    lsm_e
18430 6e 76 20 2a 70 45 6e 76 20 3d 20 70 4d 57 2d 3e  nv *pEnv = pMW->
18440 70 44 62 2d 3e 70 45 6e 76 3b 0a 20 20 20 20 50  pDb->pEnv;.    P
18450 61 67 65 20 2a 2a 61 70 48 69 65 72 20 3d 20 30  age **apHier = 0
18460 3b 0a 20 20 20 20 69 6e 74 20 6e 48 69 65 72 20  ;.    int nHier 
18470 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 50 67  = 0;.    int iPg
18480 20 3d 20 70 53 65 67 2d 3e 69 52 6f 6f 74 3b 0a   = pSeg->iRoot;.
18490 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
184a0 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
184b0 20 20 20 20 20 75 38 20 2a 61 44 61 74 61 3b 0a       u8 *aData;.
184c0 20 20 20 20 20 20 69 6e 74 20 6e 44 61 74 61 3b        int nData;
184d0 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
184e0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 73  ;..      rc = ls
184f0 6d 46 73 44 62 50 61 67 65 47 65 74 28 70 46 53  mFsDbPageGet(pFS
18500 2c 20 70 53 65 67 2c 20 69 50 67 2c 20 26 70 50  , pSeg, iPg, &pP
18510 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
18520 21 3d 4c 53 4d 5f 4f 4b 20 29 20 62 72 65 61 6b  !=LSM_OK ) break
18530 3b 0a 0a 20 20 20 20 20 20 61 44 61 74 61 20 3d  ;..      aData =
18540 20 66 73 50 61 67 65 44 61 74 61 28 70 50 67 2c   fsPageData(pPg,
18550 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20   &nData);.      
18560 66 6c 61 67 73 20 3d 20 70 61 67 65 47 65 74 46  flags = pageGetF
18570 6c 61 67 73 28 61 44 61 74 61 2c 20 6e 44 61 74  lags(aData, nDat
18580 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6c  a);.      if( fl
18590 61 67 73 26 53 45 47 4d 45 4e 54 5f 42 54 52 45  ags&SEGMENT_BTRE
185a0 45 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 20 20  E_FLAG ){.      
185b0 20 20 50 61 67 65 20 2a 2a 61 70 4e 65 77 20 3d    Page **apNew =
185c0 20 28 50 61 67 65 20 2a 2a 29 6c 73 6d 52 65 61   (Page **)lsmRea
185d0 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
185e0 20 20 70 45 6e 76 2c 20 61 70 48 69 65 72 2c 20    pEnv, apHier, 
185f0 73 69 7a 65 6f 66 28 50 61 67 65 20 2a 29 2a 28  sizeof(Page *)*(
18600 6e 48 69 65 72 2b 31 29 0a 20 20 20 20 20 20 20  nHier+1).       
18610 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
18620 61 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20  apNew==0 ){.    
18630 20 20 20 20 20 20 72 63 20 3d 20 4c 53 4d 5f 4e        rc = LSM_N
18640 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
18650 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18660 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70      }.        ap
18670 48 69 65 72 20 3d 20 61 70 4e 65 77 3b 0a 20 20  Hier = apNew;.  
18680 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61        memmove(&a
18690 70 48 69 65 72 5b 31 5d 2c 20 26 61 70 48 69 65  pHier[1], &apHie
186a0 72 5b 30 5d 2c 20 73 69 7a 65 6f 66 28 50 61 67  r[0], sizeof(Pag
186b0 65 20 2a 29 20 2a 20 6e 48 69 65 72 29 3b 0a 20  e *) * nHier);. 
186c0 20 20 20 20 20 20 20 6e 48 69 65 72 2b 2b 3b 0a         nHier++;.
186d0 0a 20 20 20 20 20 20 20 20 61 70 48 69 65 72 5b  .        apHier[
186e0 30 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  0] = pPg;.      
186f0 20 20 69 50 67 20 3d 20 70 61 67 65 47 65 74 50    iPg = pageGetP
18700 74 72 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29  tr(aData, nData)
18710 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18720 20 20 20 20 20 20 20 6c 73 6d 46 73 50 61 67 65         lsmFsPage
18730 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
18740 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18750 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
18760 20 31 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72   1 );..    if( r
18770 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20  c==LSM_OK ){.   
18780 20 20 20 75 38 20 2a 61 44 61 74 61 3b 0a 20 20     u8 *aData;.  
18790 20 20 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20      int nData;. 
187a0 20 20 20 20 20 61 44 61 74 61 20 3d 20 66 73 50       aData = fsP
187b0 61 67 65 44 61 74 61 28 61 70 48 69 65 72 5b 30  ageData(apHier[0
187c0 5d 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20  ], &nData);.    
187d0 20 20 70 4d 57 2d 3e 61 53 61 76 65 5b 30 5d 2e    pMW->aSave[0].
187e0 69 50 67 6e 6f 20 3d 20 70 61 67 65 47 65 74 50  iPgno = pageGetP
187f0 74 72 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29  tr(aData, nData)
18800 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 48 69 65 72  ;.      p->nHier
18810 20 3d 20 6e 48 69 65 72 3b 0a 20 20 20 20 20 20   = nHier;.      
18820 70 2d 3e 61 70 48 69 65 72 20 3d 20 61 70 48 69  p->apHier = apHi
18830 65 72 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d  er;.      rc = m
18840 65 72 67 65 57 6f 72 6b 65 72 4d 6f 76 65 48 69  ergeWorkerMoveHi
18850 65 72 61 72 63 68 79 28 70 4d 57 2c 20 30 29 3b  erarchy(pMW, 0);
18860 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18870 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
18880 6f 72 28 69 3d 30 3b 20 69 3c 6e 48 69 65 72 3b  or(i=0; i<nHier;
18890 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6c   i++){.        l
188a0 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65 28  smFsPageRelease(
188b0 61 70 48 69 65 72 5b 69 5d 29 3b 0a 20 20 20 20  apHier[i]);.    
188c0 20 20 7d 0a 20 20 20 20 20 20 6c 73 6d 46 72 65    }.      lsmFre
188d0 65 28 70 45 6e 76 2c 20 61 70 48 69 65 72 29 3b  e(pEnv, apHier);
188e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
188f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18900 2a 20 42 2d 74 72 65 65 20 70 61 67 65 73 20 75  * B-tree pages u
18910 73 65 20 61 6c 6d 6f 73 74 20 74 68 65 20 73 61  se almost the sa
18920 6d 65 20 66 6f 72 6d 61 74 20 61 73 20 72 65 67  me format as reg
18930 75 6c 61 72 20 70 61 67 65 73 2e 20 54 68 65 20  ular pages. The 
18940 0a 2a 2a 20 64 69 66 66 65 72 65 6e 63 65 73 20  .** differences 
18950 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  are:.**.**   1. 
18960 54 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  The record forma
18970 74 20 69 73 20 28 75 73 75 61 6c 6c 79 2c 20 73  t is (usually, s
18980 65 65 20 62 65 6c 6f 77 29 20 61 73 20 66 6f 6c  ee below) as fol
18990 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
189a0 20 20 20 20 2b 20 54 79 70 65 20 62 79 74 65 20      + Type byte 
189b0 28 61 6c 77 61 79 73 20 53 4f 52 54 45 44 5f 53  (always SORTED_S
189c0 45 50 41 52 41 54 4f 52 20 6f 72 20 53 4f 52 54  EPARATOR or SORT
189d0 45 44 5f 53 59 53 54 45 4d 5f 53 45 50 41 52 41  ED_SYSTEM_SEPARA
189e0 54 4f 52 29 2c 0a 2a 2a 20 20 20 20 20 20 20 20  TOR),.**        
189f0 20 2b 20 41 62 73 6f 6c 75 74 65 20 70 6f 69 6e   + Absolute poin
18a00 74 65 72 20 76 61 6c 75 65 20 28 76 61 72 69 6e  ter value (varin
18a10 74 29 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b  t),.**         +
18a20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
18a30 20 69 6e 20 6b 65 79 20 28 76 61 72 69 6e 74 29   in key (varint)
18a40 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 42  ,.**         + B
18a50 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6b  lob containing k
18a60 65 79 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 20  ey data..**.**  
18a70 20 32 2e 20 41 6c 6c 20 70 6f 69 6e 74 65 72 20   2. All pointer 
18a80 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65  values are store
18a90 64 20 61 73 20 61 62 73 6f 6c 75 74 65 20 76 61  d as absolute va
18aa0 6c 75 65 73 20 28 6e 6f 74 20 6f 66 66 73 65 74  lues (not offset
18ab0 73 20 0a 2a 2a 20 20 20 20 20 20 72 65 6c 61 74  s .**      relat
18ac0 69 76 65 20 74 6f 20 74 68 65 20 66 6f 6f 74 65  ive to the foote
18ad0 72 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 29  r pointer value)
18ae0 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 2e 20 45 61 63  ..**.**   3. Eac
18af0 68 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 69  h pointer that i
18b00 73 20 70 61 72 74 20 6f 66 20 61 20 72 65 63 6f  s part of a reco
18b10 72 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 70  rd points to a p
18b20 61 67 65 20 74 68 61 74 20 0a 2a 2a 20 20 20 20  age that .**    
18b30 20 20 63 6f 6e 74 61 69 6e 73 20 6b 65 79 73 20    contains keys 
18b40 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
18b50 20 72 65 63 6f 72 64 73 20 6b 65 79 20 28 6e 6f   records key (no
18b60 74 65 3a 20 6e 6f 74 20 22 65 71 75 61 6c 20 74  te: not "equal t
18b70 6f 20 6f 72 0a 2a 2a 20 20 20 20 20 20 73 6d 61  o or.**      sma
18b80 6c 6c 65 72 20 74 68 61 6e 20 2d 20 73 6d 61 6c  ller than - smal
18b90 6c 65 72 20 74 68 61 6e 22 29 2e 0a 2a 2a 0a 2a  ler than")..**.*
18ba0 2a 20 20 20 34 2e 20 54 68 65 20 70 6f 69 6e 74  *   4. The point
18bb0 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 66  er in the page f
18bc0 6f 6f 74 65 72 20 6f 66 20 61 20 62 2d 74 72 65  ooter of a b-tre
18bd0 65 20 70 61 67 65 20 70 6f 69 6e 74 73 20 74 6f  e page points to
18be0 20 61 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 20   a page.**      
18bf0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6b 65  that contains ke
18c00 79 73 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 6c  ys equal to or l
18c10 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c  arger than the l
18c20 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 74 68  argest key on th
18c30 65 0a 2a 2a 20 20 20 20 20 20 62 2d 74 72 65 65  e.**      b-tree
18c40 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
18c50 20 72 65 61 73 6f 6e 20 66 6f 72 20 68 61 76 69   reason for havi
18c60 6e 67 20 74 68 65 20 70 61 67 65 20 66 6f 6f 74  ng the page foot
18c70 65 72 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  er pointer point
18c80 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 63 68   to the right-ch
18c90 69 6c 64 0a 2a 2a 20 28 69 6e 73 74 65 61 64 20  ild.** (instead 
18ca0 6f 66 20 74 68 65 20 6c 65 66 74 29 20 69 73 20  of the left) is 
18cb0 74 68 61 74 20 64 6f 69 6e 67 20 74 68 69 6e 67  that doing thing
18cc0 73 20 74 68 69 73 20 77 61 79 20 6d 61 6b 65 73  s this way makes
18cd0 20 74 68 65 20 0a 2a 2a 20 6d 65 72 67 65 57 6f   the .** mergeWo
18ce0 72 6b 65 72 4d 6f 76 65 48 69 65 72 61 72 63 68  rkerMoveHierarch
18cf0 79 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 6c 65  y() operation le
18d00 73 73 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 28  ss complicated (
18d10 73 69 6e 63 65 20 74 68 65 20 70 6f 69 6e 74 65  since the pointe
18d20 72 73 20 0a 2a 2a 20 74 68 61 74 20 6e 65 65 64  rs .** that need
18d30 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 61   to be updated a
18d40 72 65 20 61 6c 6c 20 73 74 6f 72 65 64 20 61 73  re all stored as
18d50 20 66 69 78 65 64 2d 73 69 7a 65 20 69 6e 74 65   fixed-size inte
18d60 67 65 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  gers within the 
18d70 0a 2a 2a 20 70 61 67 65 20 66 6f 6f 74 65 72 2c  .** page footer,
18d80 20 6e 6f 74 20 76 61 72 69 6e 74 73 20 69 6e 20   not varints in 
18d90 70 61 67 65 20 72 65 63 6f 72 64 73 29 2e 0a 2a  page records)..*
18da0 2a 0a 2a 2a 20 52 65 63 6f 72 64 73 20 6d 61 79  *.** Records may
18db0 20 6e 6f 74 20 73 70 61 6e 20 62 2d 74 72 65 65   not span b-tree
18dc0 20 70 61 67 65 73 2e 20 49 66 20 74 68 69 73 20   pages. If this 
18dd0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
18de0 65 64 20 74 6f 20 61 64 64 20 61 0a 2a 2a 20 72  ed to add a.** r
18df0 65 63 6f 72 64 20 6c 61 72 67 65 72 20 74 68 61  ecord larger tha
18e00 6e 20 28 70 61 67 65 2d 73 69 7a 65 20 2f 20 34  n (page-size / 4
18e10 29 20 62 79 74 65 73 2c 20 74 68 65 6e 20 61 20  ) bytes, then a 
18e20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 69  pointer to the i
18e30 6e 64 65 78 65 64 0a 2a 2a 20 61 72 72 61 79 20  ndexed.** array 
18e40 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
18e50 6e 73 20 74 68 65 20 6d 61 69 6e 20 72 65 63 6f  ns the main reco
18e60 72 64 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  rd is added to t
18e70 68 65 20 62 2d 74 72 65 65 20 69 6e 73 74 65 61  he b-tree instea
18e80 64 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  d..** In this ca
18e90 73 65 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  se the record fo
18ea0 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
18eb0 20 20 20 20 20 20 20 2b 20 30 78 30 30 20 62 79         + 0x00 by
18ec0 74 65 20 28 31 20 62 79 74 65 29 20 0a 2a 2a 20  te (1 byte) .** 
18ed0 20 20 20 20 20 20 20 20 2b 20 41 62 73 6f 6c 75          + Absolu
18ee0 74 65 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65  te pointer value
18ef0 20 28 76 61 72 69 6e 74 29 2c 0a 2a 2a 20 20 20   (varint),.**   
18f00 20 20 20 20 20 20 2b 20 41 62 73 6f 6c 75 74 65        + Absolute
18f10 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
18f20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  page containing 
18f30 6b 65 79 20 28 76 61 72 69 6e 74 29 2e 0a 2a 2a  key (varint)..**
18f40 0a 2a 2a 20 53 65 65 20 66 75 6e 63 74 69 6f 6e  .** See function
18f50 20 73 65 65 6b 49 6e 42 74 72 65 65 28 29 20 66   seekInBtree() f
18f60 6f 72 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  or the code that
18f70 20 74 72 61 76 65 72 73 65 73 20 62 2d 74 72 65   traverses b-tre
18f80 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 0a 73 74 61  e pages..*/..sta
18f90 74 69 63 20 69 6e 74 20 6d 65 72 67 65 57 6f 72  tic int mergeWor
18fa0 6b 65 72 42 74 72 65 65 57 72 69 74 65 28 0a 20  kerBtreeWrite(. 
18fb0 20 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d   MergeWorker *pM
18fc0 57 2c 0a 20 20 75 38 20 65 54 79 70 65 2c 0a 20  W,.  u8 eType,. 
18fd0 20 50 67 6e 6f 20 69 50 74 72 2c 0a 20 20 50 67   Pgno iPtr,.  Pg
18fe0 6e 6f 20 69 4b 65 79 50 67 2c 0a 20 20 76 6f 69  no iKeyPg,.  voi
18ff0 64 20 2a 70 4b 65 79 2c 0a 20 20 69 6e 74 20 6e  d *pKey,.  int n
19000 4b 65 79 0a 29 7b 0a 20 20 48 69 65 72 61 72 63  Key.){.  Hierarc
19010 68 79 20 2a 70 20 3d 20 26 70 4d 57 2d 3e 68 69  hy *p = &pMW->hi
19020 65 72 3b 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44  er;.  lsm_db *pD
19030 62 20 3d 20 70 4d 57 2d 3e 70 44 62 3b 20 20 20  b = pMW->pDb;   
19040 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
19050 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
19060 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20  t rc = LSM_OK;  
19070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19080 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
19090 20 20 69 6e 74 20 69 4c 65 76 65 6c 3b 20 20 20    int iLevel;   
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190b0 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 20 62 2d    /* Level of b-
190c0 74 72 65 65 20 68 69 65 72 61 63 68 79 20 74 6f  tree hierachy to
190d0 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
190e0 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20  nt nData;       
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19100 2a 20 53 69 7a 65 20 6f 66 20 61 44 61 74 61 5b  * Size of aData[
19110 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
19120 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  u8 *aData;      
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19140 2f 2a 20 50 61 67 65 20 64 61 74 61 20 66 6f 72  /* Page data for
19150 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 20 2a 2f   level iLevel */
19160 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20  .  int iOff;    
19170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19180 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20     /* Offset on 
19190 62 2d 74 72 65 65 20 70 61 67 65 20 74 6f 20 77  b-tree page to w
191a0 72 69 74 65 20 72 65 63 6f 72 64 20 74 6f 20 2a  rite record to *
191b0 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191d0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
191e0 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
191f0 20 6f 6e 20 62 2d 74 72 65 65 20 70 61 67 65 20   on b-tree page 
19200 2a 2f 0a 0a 20 20 2f 2a 20 69 4b 65 79 50 67 20  */..  /* iKeyPg 
19210 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 20 66  should be zero f
19220 6f 72 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 62  or an ordinary b
19230 2d 74 72 65 65 20 6b 65 79 2c 20 6f 72 20 6e 6f  -tree key, or no
19240 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 0a 20 20  n-zero for an.  
19250 2a 2a 20 69 6e 64 69 72 65 63 74 20 6b 65 79 2e  ** indirect key.
19260 20 54 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   The flags byte 
19270 66 6f 72 20 61 6e 20 69 6e 64 69 72 65 63 74 20  for an indirect 
19280 6b 65 79 20 69 73 20 30 78 30 30 2e 20 20 2a 2f  key is 0x00.  */
19290 0a 20 20 61 73 73 65 72 74 28 20 28 65 54 79 70  .  assert( (eTyp
192a0 65 3d 3d 30 29 3d 3d 28 69 4b 65 79 50 67 21 3d  e==0)==(iKeyPg!=
192b0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  0) );..  /* The 
192c0 4d 65 72 67 65 57 6f 72 6b 65 72 2e 61 70 48 69  MergeWorker.apHi
192d0 65 72 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  er[] array conta
192e0 69 6e 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ins the right-mo
192f0 73 74 20 6c 65 61 66 20 6f 66 20 74 68 65 20 62  st leaf of the b
19300 2d 74 72 65 65 0a 20 20 2a 2a 20 68 69 65 72 61  -tree.  ** hiera
19310 72 63 68 79 2c 20 74 68 65 20 72 6f 6f 74 20 6e  rchy, the root n
19320 6f 64 65 2c 20 61 6e 64 20 61 6c 6c 20 6e 6f 64  ode, and all nod
19330 65 73 20 74 68 61 74 20 6c 69 65 20 6f 6e 20 74  es that lie on t
19340 68 65 20 70 61 74 68 20 62 65 74 77 65 65 6e 2e  he path between.
19350 0a 20 20 2a 2a 20 61 70 48 69 65 72 5b 30 5d 20  .  ** apHier[0] 
19360 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
19370 74 20 6c 65 61 66 20 61 6e 64 20 61 70 48 69 65  t leaf and apHie
19380 72 5b 70 4d 57 2d 3e 6e 48 69 65 72 2d 31 5d 20  r[pMW->nHier-1] 
19390 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  is the current. 
193a0 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 0a 20   ** root page.. 
193b0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
193c0 6f 70 20 73 65 61 72 63 68 65 73 20 66 6f 72 20  op searches for 
193d0 61 20 6e 6f 64 65 20 77 69 74 68 20 65 6e 6f 75  a node with enou
193e0 67 68 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  gh space to stor
193f0 65 20 74 68 65 20 6b 65 79 20 6f 6e 2c 0a 20 20  e the key on,.  
19400 2a 2a 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  ** starting with
19410 20 74 68 65 20 6c 65 61 66 20 61 6e 64 20 69 74   the leaf and it
19420 65 72 61 74 69 6e 67 20 75 70 20 74 6f 77 61 72  erating up towar
19430 64 73 20 74 68 65 20 72 6f 6f 74 2e 20 57 68 65  ds the root. Whe
19440 6e 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2a 20  n the loop.  ** 
19450 65 78 69 74 73 2c 20 74 68 65 20 6b 65 79 20 6d  exits, the key m
19460 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ay be written to
19470 20 61 70 48 69 65 72 5b 69 4c 65 76 65 6c 5d 2e   apHier[iLevel].
19480 20 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 65 76 65    */.  for(iLeve
19490 6c 3d 30 3b 20 69 4c 65 76 65 6c 3c 3d 70 2d 3e  l=0; iLevel<=p->
194a0 6e 48 69 65 72 3b 20 69 4c 65 76 65 6c 2b 2b 29  nHier; iLevel++)
194b0 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  {.    int nByte;
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
194e0 20 66 72 65 65 20 62 79 74 65 73 20 72 65 71 75   free bytes requ
194f0 69 72 65 64 20 2a 2f 0a 0a 20 20 20 20 69 66 28  ired */..    if(
19500 20 69 4c 65 76 65 6c 3d 3d 70 2d 3e 6e 48 69 65   iLevel==p->nHie
19510 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78  r ){.      /* Ex
19520 74 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 61  tend the array a
19530 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  nd allocate a ne
19540 77 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a  w root page. */.
19550 20 20 20 20 20 20 50 61 67 65 20 2a 2a 61 4e 65        Page **aNe
19560 77 3b 0a 20 20 20 20 20 20 61 4e 65 77 20 3d 20  w;.      aNew = 
19570 28 50 61 67 65 20 2a 2a 29 6c 73 6d 52 65 61 6c  (Page **)lsmReal
19580 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 70  loc(.          p
19590 4d 57 2d 3e 70 44 62 2d 3e 70 45 6e 76 2c 20 70  MW->pDb->pEnv, p
195a0 2d 3e 61 70 48 69 65 72 2c 20 73 69 7a 65 6f 66  ->apHier, sizeof
195b0 28 50 61 67 65 20 2a 29 2a 28 70 2d 3e 6e 48 69  (Page *)*(p->nHi
195c0 65 72 2b 31 29 0a 20 20 20 20 20 20 29 3b 0a 20  er+1).      );. 
195d0 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29       if( !aNew )
195e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
195f0 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b   LSM_NOMEM_BKPT;
19600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
19610 2d 3e 61 70 48 69 65 72 20 3d 20 61 4e 65 77 3b  ->apHier = aNew;
19620 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19630 20 20 50 61 67 65 20 2a 70 4f 6c 64 3b 0a 20 20    Page *pOld;.  
19640 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 0a 0a      int nFree;..
19650 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
19660 6b 65 79 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  key will fit on 
19670 74 68 69 73 20 70 61 67 65 2c 20 62 72 65 61 6b  this page, break
19680 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
19690 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2a 20   here..      ** 
196a0 54 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  The new entry wi
196b0 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ll be written to
196c0 20 70 61 67 65 20 61 70 48 69 65 72 5b 69 4c 65   page apHier[iLe
196d0 76 65 6c 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  vel]. */.      p
196e0 4f 6c 64 20 3d 20 70 2d 3e 61 70 48 69 65 72 5b  Old = p->apHier[
196f0 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 61  iLevel];.      a
19700 73 73 65 72 74 28 20 6c 73 6d 46 73 50 61 67 65  ssert( lsmFsPage
19710 57 72 69 74 61 62 6c 65 28 70 4f 6c 64 29 20 29  Writable(pOld) )
19720 3b 0a 20 20 20 20 20 20 61 44 61 74 61 20 3d 20  ;.      aData = 
19730 66 73 50 61 67 65 44 61 74 61 28 70 4f 6c 64 2c  fsPageData(pOld,
19740 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20   &nData);.      
19750 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a  if( eType==0 ){.
19760 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20          nByte = 
19770 32 20 2b 20 31 20 2b 20 6c 73 6d 56 61 72 69 6e  2 + 1 + lsmVarin
19780 74 4c 65 6e 33 32 28 69 50 74 72 29 20 2b 20 6c  tLen32(iPtr) + l
19790 73 6d 56 61 72 69 6e 74 4c 65 6e 33 32 28 69 4b  smVarintLen32(iK
197a0 65 79 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  eyPg);.      }el
197b0 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 42 79 74  se{.        nByt
197c0 65 20 3d 20 32 20 2b 20 31 20 2b 20 6c 73 6d 56  e = 2 + 1 + lsmV
197d0 61 72 69 6e 74 4c 65 6e 33 32 28 69 50 74 72 29  arintLen32(iPtr)
197e0 20 2b 20 6c 73 6d 56 61 72 69 6e 74 4c 65 6e 33   + lsmVarintLen3
197f0 32 28 6e 4b 65 79 29 20 2b 20 6e 4b 65 79 3b 0a  2(nKey) + nKey;.
19800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52        }.      nR
19810 65 63 20 3d 20 70 61 67 65 47 65 74 4e 52 65 63  ec = pageGetNRec
19820 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a  (aData, nData);.
19830 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 53 45        nFree = SE
19840 47 4d 45 4e 54 5f 45 4f 46 28 6e 44 61 74 61 2c  GMENT_EOF(nData,
19850 20 6e 52 65 63 29 20 2d 20 6d 65 72 67 65 57 6f   nRec) - mergeWo
19860 72 6b 65 72 50 61 67 65 4f 66 66 73 65 74 28 61  rkerPageOffset(a
19870 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
19880 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 3d 6e      if( nByte<=n
19890 46 72 65 65 20 29 20 62 72 65 61 6b 3b 0a 0a 20  Free ) break;.. 
198a0 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73       /* Otherwis
198b0 65 2c 20 74 68 69 73 20 70 61 67 65 20 69 73 20  e, this page is 
198c0 66 75 6c 6c 2e 20 53 65 74 20 74 68 65 20 72 69  full. Set the ri
198d0 67 68 74 2d 68 61 6e 64 2d 63 68 69 6c 64 20 70  ght-hand-child p
198e0 6f 69 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20  ointer.      ** 
198f0 74 6f 20 69 50 74 72 20 61 6e 64 20 72 65 6c 65  to iPtr and rele
19900 61 73 65 20 69 74 2e 20 20 2a 2f 0a 20 20 20 20  ase it.  */.    
19910 20 20 6c 73 6d 50 75 74 55 36 34 28 26 61 44 61    lsmPutU64(&aDa
19920 74 61 5b 53 45 47 4d 45 4e 54 5f 50 4f 49 4e 54  ta[SEGMENT_POINT
19930 45 52 5f 4f 46 46 53 45 54 28 6e 44 61 74 61 29  ER_OFFSET(nData)
19940 5d 2c 20 69 50 74 72 29 3b 0a 20 20 20 20 20 20  ], iPtr);.      
19950 61 73 73 65 72 74 28 20 6c 73 6d 46 73 50 61 67  assert( lsmFsPag
19960 65 4e 75 6d 62 65 72 28 70 4f 6c 64 29 3d 3d 30  eNumber(pOld)==0
19970 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   );.      rc = l
19980 73 6d 46 73 50 61 67 65 50 65 72 73 69 73 74 28  smFsPagePersist(
19990 70 4f 6c 64 29 3b 0a 20 20 20 20 20 20 69 66 28  pOld);.      if(
199a0 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
199b0 20 20 20 20 20 20 20 69 50 74 72 20 3d 20 6c 73         iPtr = ls
199c0 6d 46 73 50 61 67 65 4e 75 6d 62 65 72 28 70 4f  mFsPageNumber(pO
199d0 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 6c 73 6d  ld);.        lsm
199e0 46 73 50 61 67 65 52 65 6c 65 61 73 65 28 70 4f  FsPageRelease(pO
199f0 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ld);.      }.   
19a00 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63   }..    /* Alloc
19a10 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
19a20 6f 72 20 61 70 48 69 65 72 5b 69 4c 65 76 65 6c  or apHier[iLevel
19a30 5d 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 70 48  ]. */.    p->apH
19a40 69 65 72 5b 69 4c 65 76 65 6c 5d 20 3d 20 30 3b  ier[iLevel] = 0;
19a50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d  .    if( rc==LSM
19a60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
19a70 3d 20 6c 73 6d 46 73 53 6f 72 74 65 64 41 70 70  = lsmFsSortedApp
19a80 65 6e 64 28 0a 20 20 20 20 20 20 20 20 20 20 70  end(.          p
19a90 44 62 2d 3e 70 46 53 2c 20 70 44 62 2d 3e 70 57  Db->pFS, pDb->pW
19aa0 6f 72 6b 65 72 2c 20 70 4d 57 2d 3e 70 4c 65 76  orker, pMW->pLev
19ab0 65 6c 2c 20 31 2c 20 26 70 2d 3e 61 70 48 69 65  el, 1, &p->apHie
19ac0 72 5b 69 4c 65 76 65 6c 5d 0a 20 20 20 20 20 20  r[iLevel].      
19ad0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
19ae0 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72 65   rc!=LSM_OK ) re
19af0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 61 44  turn rc;..    aD
19b00 61 74 61 20 3d 20 66 73 50 61 67 65 44 61 74 61  ata = fsPageData
19b10 28 70 2d 3e 61 70 48 69 65 72 5b 69 4c 65 76 65  (p->apHier[iLeve
19b20 6c 5d 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20  l], &nData);.   
19b30 20 6d 65 6d 73 65 74 28 61 44 61 74 61 2c 20 30   memset(aData, 0
19b40 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 6c 73  , nData);.    ls
19b50 6d 50 75 74 55 31 36 28 26 61 44 61 74 61 5b 53  mPutU16(&aData[S
19b60 45 47 4d 45 4e 54 5f 46 4c 41 47 53 5f 4f 46 46  EGMENT_FLAGS_OFF
19b70 53 45 54 28 6e 44 61 74 61 29 5d 2c 20 53 45 47  SET(nData)], SEG
19b80 4d 45 4e 54 5f 42 54 52 45 45 5f 46 4c 41 47 29  MENT_BTREE_FLAG)
19b90 3b 0a 20 20 20 20 6c 73 6d 50 75 74 55 31 36 28  ;.    lsmPutU16(
19ba0 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54 5f 4e  &aData[SEGMENT_N
19bb0 52 45 43 4f 52 44 5f 4f 46 46 53 45 54 28 6e 44  RECORD_OFFSET(nD
19bc0 61 74 61 29 5d 2c 20 30 29 3b 0a 0a 20 20 20 20  ata)], 0);..    
19bd0 69 66 28 20 69 4c 65 76 65 6c 3d 3d 70 2d 3e 6e  if( iLevel==p->n
19be0 48 69 65 72 20 29 7b 0a 20 20 20 20 20 20 70 2d  Hier ){.      p-
19bf0 3e 6e 48 69 65 72 2b 2b 3b 0a 20 20 20 20 20 20  >nHier++;.      
19c00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
19c10 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
19c20 20 6b 65 79 20 69 6e 74 6f 20 70 61 67 65 20 61   key into page a
19c30 70 48 69 65 72 5b 69 4c 65 76 65 6c 5d 2e 20 2a  pHier[iLevel]. *
19c40 2f 0a 20 20 61 44 61 74 61 20 3d 20 66 73 50 61  /.  aData = fsPa
19c50 67 65 44 61 74 61 28 70 2d 3e 61 70 48 69 65 72  geData(p->apHier
19c60 5b 69 4c 65 76 65 6c 5d 2c 20 26 6e 44 61 74 61  [iLevel], &nData
19c70 29 3b 0a 20 20 69 4f 66 66 20 3d 20 6d 65 72 67  );.  iOff = merg
19c80 65 57 6f 72 6b 65 72 50 61 67 65 4f 66 66 73 65  eWorkerPageOffse
19c90 74 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  t(aData, nData);
19ca0 0a 20 20 6e 52 65 63 20 3d 20 70 61 67 65 47 65  .  nRec = pageGe
19cb0 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44 61  tNRec(aData, nDa
19cc0 74 61 29 3b 0a 20 20 6c 73 6d 50 75 74 55 31 36  ta);.  lsmPutU16
19cd0 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54 5f  (&aData[SEGMENT_
19ce0 43 45 4c 4c 50 54 52 5f 4f 46 46 53 45 54 28 6e  CELLPTR_OFFSET(n
19cf0 44 61 74 61 2c 20 6e 52 65 63 29 5d 2c 20 69 4f  Data, nRec)], iO
19d00 66 66 29 3b 0a 20 20 6c 73 6d 50 75 74 55 31 36  ff);.  lsmPutU16
19d10 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54 5f  (&aData[SEGMENT_
19d20 4e 52 45 43 4f 52 44 5f 4f 46 46 53 45 54 28 6e  NRECORD_OFFSET(n
19d30 44 61 74 61 29 5d 2c 20 6e 52 65 63 2b 31 29 3b  Data)], nRec+1);
19d40 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
19d50 29 7b 0a 20 20 20 20 61 44 61 74 61 5b 69 4f 66  ){.    aData[iOf
19d60 66 2b 2b 5d 20 3d 20 30 78 30 30 3b 0a 20 20 20  f++] = 0x00;.   
19d70 20 69 4f 66 66 20 2b 3d 20 6c 73 6d 56 61 72 69   iOff += lsmVari
19d80 6e 74 50 75 74 33 32 28 26 61 44 61 74 61 5b 69  ntPut32(&aData[i
19d90 4f 66 66 5d 2c 20 69 50 74 72 29 3b 0a 20 20 20  Off], iPtr);.   
19da0 20 69 4f 66 66 20 2b 3d 20 6c 73 6d 56 61 72 69   iOff += lsmVari
19db0 6e 74 50 75 74 33 32 28 26 61 44 61 74 61 5b 69  ntPut32(&aData[i
19dc0 4f 66 66 5d 2c 20 69 4b 65 79 50 67 29 3b 0a 20  Off], iKeyPg);. 
19dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 44 61 74   }else{.    aDat
19de0 61 5b 69 4f 66 66 2b 2b 5d 20 3d 20 65 54 79 70  a[iOff++] = eTyp
19df0 65 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 6c  e;.    iOff += l
19e00 73 6d 56 61 72 69 6e 74 50 75 74 33 32 28 26 61  smVarintPut32(&a
19e10 44 61 74 61 5b 69 4f 66 66 5d 2c 20 69 50 74 72  Data[iOff], iPtr
19e20 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 6c  );.    iOff += l
19e30 73 6d 56 61 72 69 6e 74 50 75 74 33 32 28 26 61  smVarintPut32(&a
19e40 44 61 74 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 79  Data[iOff], nKey
19e50 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  );.    memcpy(&a
19e60 44 61 74 61 5b 69 4f 66 66 5d 2c 20 70 4b 65 79  Data[iOff], pKey
19e70 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20 20  , nKey);.  }..  
19e80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
19e90 61 74 69 63 20 69 6e 74 20 6d 65 72 67 65 57 6f  atic int mergeWo
19ea0 72 6b 65 72 42 74 72 65 65 49 6e 64 69 72 65 63  rkerBtreeIndirec
19eb0 74 28 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70  t(MergeWorker *p
19ec0 4d 57 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  MW){.  int rc = 
19ed0 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 4d  LSM_OK;.  if( pM
19ee0 57 2d 3e 69 49 6e 64 69 72 65 63 74 20 29 7b 0a  W->iIndirect ){.
19ef0 20 20 20 20 50 67 6e 6f 20 69 4b 65 79 50 67 20      Pgno iKeyPg 
19f00 3d 20 70 4d 57 2d 3e 61 53 61 76 65 5b 31 5d 2e  = pMW->aSave[1].
19f10 69 50 67 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  iPgno;.    rc = 
19f20 6d 65 72 67 65 57 6f 72 6b 65 72 42 74 72 65 65  mergeWorkerBtree
19f30 57 72 69 74 65 28 70 4d 57 2c 20 30 2c 20 70 4d  Write(pMW, 0, pM
19f40 57 2d 3e 69 49 6e 64 69 72 65 63 74 2c 20 69 4b  W->iIndirect, iK
19f50 65 79 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eyPg, 0, 0);.   
19f60 20 70 4d 57 2d 3e 69 49 6e 64 69 72 65 63 74 20   pMW->iIndirect 
19f70 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
19f80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
19f90 70 70 65 6e 64 20 74 68 65 20 64 61 74 61 62 61  ppend the databa
19fa0 73 65 20 6b 65 79 20 28 69 54 6f 70 69 63 2f 70  se key (iTopic/p
19fb0 4b 65 79 2f 6e 4b 65 79 29 20 74 6f 20 74 68 65  Key/nKey) to the
19fc0 20 62 2d 74 72 65 65 20 75 6e 64 65 72 20 0a 2a   b-tree under .*
19fd0 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  * construction. 
19fe0 54 68 69 73 20 6b 65 79 20 68 61 73 20 6e 6f 74  This key has not
19ff0 20 79 65 74 20 62 65 65 6e 20 77 72 69 74 74 65   yet been writte
1a000 6e 20 74 6f 20 61 20 73 65 67 6d 65 6e 74 20 70  n to a segment p
1a010 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  age..** The poin
1a020 74 65 72 20 74 68 61 74 20 77 69 6c 6c 20 61 63  ter that will ac
1a030 63 6f 6d 70 61 6e 79 20 74 68 65 20 6e 65 77 20  company the new 
1a040 6b 65 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  key in the b-tre
1a050 65 20 2d 20 74 68 61 74 0a 2a 2a 20 70 6f 69 6e  e - that.** poin
1a060 74 73 20 74 6f 20 74 68 65 20 63 6f 6d 70 6c 65  ts to the comple
1a070 74 65 64 20 73 65 67 6d 65 6e 74 20 70 61 67 65  ted segment page
1a080 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6b   that contains k
1a090 65 79 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  eys smaller than
1a0a0 0a 2a 2a 20 28 70 4b 65 79 2f 6e 4b 65 79 29 20  .** (pKey/nKey) 
1a0b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  is currently sto
1a0c0 72 65 64 20 69 6e 20 70 4d 57 2d 3e 61 53 61 76  red in pMW->aSav
1a0d0 65 5b 30 5d 2e 69 50 67 6e 6f 2e 0a 2a 2f 0a 73  e[0].iPgno..*/.s
1a0e0 74 61 74 69 63 20 69 6e 74 20 6d 65 72 67 65 57  tatic int mergeW
1a0f0 6f 72 6b 65 72 50 75 73 68 48 69 65 72 61 72 63  orkerPushHierarc
1a100 68 79 28 0a 20 20 4d 65 72 67 65 57 6f 72 6b 65  hy(.  MergeWorke
1a110 72 20 2a 70 4d 57 2c 20 20 20 20 20 20 20 20 20  r *pMW,         
1a120 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 77        /* Merge w
1a130 6f 72 6b 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  orker object */.
1a140 20 20 69 6e 74 20 69 54 6f 70 69 63 2c 20 20 20    int iTopic,   
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 20 20 2f 2a 20 54 6f 70 69 63 20 76 61 6c 75 65    /* Topic value
1a170 20 66 6f 72 20 74 68 69 73 20 6b 65 79 20 2a 2f   for this key */
1a180 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  .  void *pKey,  
1a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1a0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1a1b0 20 6b 65 79 20 62 75 66 66 65 72 20 2a 2f 0a 20   key buffer */. 
1a1c0 20 69 6e 74 20 6e 4b 65 79 20 20 20 20 20 20 20   int nKey       
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65 79   /* Size of pKey
1a1f0 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
1a200 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1a210 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20  = LSM_OK;       
1a220 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1a230 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn Code */.  Pgn
1a240 6f 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  o iPtr;         
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a260 50 6f 69 6e 74 65 72 20 76 61 6c 75 65 20 74 6f  Pointer value to
1a270 20 61 63 63 6f 6d 70 61 6e 79 20 70 4b 65 79 2f   accompany pKey/
1a280 6e 4b 65 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nKey */..  asser
1a290 74 28 20 70 4d 57 2d 3e 61 53 61 76 65 5b 30 5d  t( pMW->aSave[0]
1a2a0 2e 62 53 74 6f 72 65 3d 3d 30 20 29 3b 0a 20 20  .bStore==0 );.  
1a2b0 61 73 73 65 72 74 28 20 70 4d 57 2d 3e 61 53 61  assert( pMW->aSa
1a2c0 76 65 5b 31 5d 2e 62 53 74 6f 72 65 3d 3d 30 20  ve[1].bStore==0 
1a2d0 29 3b 0a 20 20 72 63 20 3d 20 6d 65 72 67 65 57  );.  rc = mergeW
1a2e0 6f 72 6b 65 72 42 74 72 65 65 49 6e 64 69 72 65  orkerBtreeIndire
1a2f0 63 74 28 70 4d 57 29 3b 0a 0a 20 20 2f 2a 20 4f  ct(pMW);..  /* O
1a300 62 74 61 69 6e 20 74 68 65 20 61 62 73 6f 6c 75  btain the absolu
1a310 74 65 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65  te pointer value
1a320 20 74 6f 20 73 74 6f 72 65 20 61 6c 6f 6e 67 20   to store along 
1a330 77 69 74 68 20 74 68 65 20 6b 65 79 20 69 6e 20  with the key in 
1a340 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 62 6f  the.  ** page bo
1a350 64 79 2e 20 54 68 69 73 20 70 6f 69 6e 74 65 72  dy. This pointer
1a360 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 70 61 67   points to a pag
1a370 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1a380 6b 65 79 73 20 74 68 61 74 20 61 72 65 0a 20 20  keys that are.  
1a390 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ** smaller than 
1a3a0 70 4b 65 79 2f 6e 4b 65 79 2e 20 20 2a 2f 0a 20  pKey/nKey.  */. 
1a3b0 20 69 50 74 72 20 3d 20 70 4d 57 2d 3e 61 53 61   iPtr = pMW->aSa
1a3c0 76 65 5b 30 5d 2e 69 50 67 6e 6f 3b 0a 20 20 61  ve[0].iPgno;.  a
1a3d0 73 73 65 72 74 28 20 69 50 74 72 21 3d 30 20 29  ssert( iPtr!=0 )
1a3e0 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  ;..  /* Determin
1a3f0 65 20 69 66 20 74 68 65 20 69 6e 64 69 72 65 63  e if the indirec
1a400 74 20 66 6f 72 6d 61 74 20 73 68 6f 75 6c 64 20  t format should 
1a410 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 69 66  be used. */.  if
1a420 28 20 28 6e 4b 65 79 2a 34 20 3e 20 6c 73 6d 46  ( (nKey*4 > lsmF
1a430 73 50 61 67 65 53 69 7a 65 28 70 4d 57 2d 3e 70  sPageSize(pMW->p
1a440 44 62 2d 3e 70 46 53 29 29 20 29 7b 0a 20 20 20  Db->pFS)) ){.   
1a450 20 70 4d 57 2d 3e 69 49 6e 64 69 72 65 63 74 20   pMW->iIndirect 
1a460 3d 20 69 50 74 72 3b 0a 20 20 20 20 70 4d 57 2d  = iPtr;.    pMW-
1a470 3e 61 53 61 76 65 5b 31 5d 2e 62 53 74 6f 72 65  >aSave[1].bStore
1a480 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
1a490 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57 6f 72     rc = mergeWor
1a4a0 6b 65 72 42 74 72 65 65 57 72 69 74 65 28 0a 20  kerBtreeWrite(. 
1a4b0 20 20 20 20 20 20 20 70 4d 57 2c 20 28 75 38 29         pMW, (u8)
1a4c0 28 69 54 6f 70 69 63 20 7c 20 4c 53 4d 5f 53 45  (iTopic | LSM_SE
1a4d0 50 41 52 41 54 4f 52 29 2c 20 69 50 74 72 2c 20  PARATOR), iPtr, 
1a4e0 30 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 0a 20 20  0, pKey, nKey.  
1a4f0 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45    );.  }..  /* E
1a500 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53  nsure that the S
1a510 6f 72 74 65 64 52 75 6e 2e 69 52 6f 6f 74 20 66  ortedRun.iRoot f
1a520 69 65 6c 64 20 69 73 20 63 6f 72 72 65 63 74 2e  ield is correct.
1a530 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
1a540 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .}..static int m
1a550 65 72 67 65 57 6f 72 6b 65 72 46 69 6e 69 73 68  ergeWorkerFinish
1a560 48 69 65 72 61 72 63 68 79 28 0a 20 20 4d 65 72  Hierarchy(.  Mer
1a570 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57 20 20 20  geWorker *pMW   
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a590 4d 65 72 67 65 20 77 6f 72 6b 65 72 20 6f 62 6a  Merge worker obj
1a5a0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ect */.){.  int 
1a5b0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1a5d0 73 65 64 20 74 6f 20 6c 6f 6f 70 20 74 68 72 6f  sed to loop thro
1a5e0 75 67 68 20 61 70 48 69 65 72 5b 5d 20 2a 2f 0a  ugh apHier[] */.
1a5f0 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f    int rc = LSM_O
1a600 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
1a610 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1a620 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 3b   */.  Pgno iPtr;
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a640 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 72 69 67        /* New rig
1a650 68 74 2d 68 61 6e 64 2d 63 68 69 6c 64 20 70 6f  ht-hand-child po
1a660 69 6e 74 65 72 20 76 61 6c 75 65 20 2a 2f 0a 0a  inter value */..
1a670 20 20 69 50 74 72 20 3d 20 70 4d 57 2d 3e 61 53    iPtr = pMW->aS
1a680 61 76 65 5b 30 5d 2e 69 50 67 6e 6f 3b 0a 20 20  ave[0].iPgno;.  
1a690 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 57 2d 3e  for(i=0; i<pMW->
1a6a0 68 69 65 72 2e 6e 48 69 65 72 20 26 26 20 72 63  hier.nHier && rc
1a6b0 3d 3d 4c 53 4d 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  ==LSM_OK; i++){.
1a6c0 20 20 20 20 50 61 67 65 20 2a 70 50 67 20 3d 20      Page *pPg = 
1a6d0 70 4d 57 2d 3e 68 69 65 72 2e 61 70 48 69 65 72  pMW->hier.apHier
1a6e0 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 44 61  [i];.    int nDa
1a6f0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
1a700 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1a710 66 20 61 44 61 74 61 5b 5d 20 69 6e 20 62 79 74  f aData[] in byt
1a720 65 73 20 2a 2f 0a 20 20 20 20 75 38 20 2a 61 44  es */.    u8 *aD
1a730 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
1a740 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
1a750 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a  data for pPg */.
1a760 0a 20 20 20 20 61 44 61 74 61 20 3d 20 66 73 50  .    aData = fsP
1a770 61 67 65 44 61 74 61 28 70 50 67 2c 20 26 6e 44  ageData(pPg, &nD
1a780 61 74 61 29 3b 0a 20 20 20 20 6c 73 6d 50 75 74  ata);.    lsmPut
1a790 55 36 34 28 26 61 44 61 74 61 5b 53 45 47 4d 45  U64(&aData[SEGME
1a7a0 4e 54 5f 50 4f 49 4e 54 45 52 5f 4f 46 46 53 45  NT_POINTER_OFFSE
1a7b0 54 28 6e 44 61 74 61 29 5d 2c 20 69 50 74 72 29  T(nData)], iPtr)
1a7c0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 46  ;..    rc = lsmF
1a7d0 73 50 61 67 65 50 65 72 73 69 73 74 28 70 50 67  sPagePersist(pPg
1a7e0 29 3b 0a 20 20 20 20 69 50 74 72 20 3d 20 6c 73  );.    iPtr = ls
1a7f0 6d 46 73 50 61 67 65 4e 75 6d 62 65 72 28 70 50  mFsPageNumber(pP
1a800 67 29 3b 0a 20 20 20 20 6c 73 6d 46 73 50 61 67  g);.    lsmFsPag
1a810 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
1a820 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 2d 3e 68   }..  if( pMW->h
1a830 69 65 72 2e 6e 48 69 65 72 20 29 7b 0a 20 20 20  ier.nHier ){.   
1a840 20 70 4d 57 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68   pMW->pLevel->lh
1a850 73 2e 69 52 6f 6f 74 20 3d 20 69 50 74 72 3b 0a  s.iRoot = iPtr;.
1a860 20 20 20 20 6c 73 6d 46 72 65 65 28 70 4d 57 2d      lsmFree(pMW-
1a870 3e 70 44 62 2d 3e 70 45 6e 76 2c 20 70 4d 57 2d  >pDb->pEnv, pMW-
1a880 3e 68 69 65 72 2e 61 70 48 69 65 72 29 3b 0a 20  >hier.apHier);. 
1a890 20 20 20 70 4d 57 2d 3e 68 69 65 72 2e 61 70 48     pMW->hier.apH
1a8a0 69 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 4d 57  ier = 0;.    pMW
1a8b0 2d 3e 68 69 65 72 2e 6e 48 69 65 72 20 3d 20 30  ->hier.nHier = 0
1a8c0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1a8d0 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
1a8e0 74 20 6d 65 72 67 65 57 6f 72 6b 65 72 41 64 64  t mergeWorkerAdd
1a8f0 50 61 64 64 69 6e 67 28 0a 20 20 4d 65 72 67 65  Padding(.  Merge
1a900 57 6f 72 6b 65 72 20 2a 70 4d 57 20 20 20 20 20  Worker *pMW     
1a910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
1a920 72 67 65 20 77 6f 72 6b 65 72 20 6f 62 6a 65 63  rge worker objec
1a930 74 20 2a 2f 0a 29 7b 0a 20 20 46 69 6c 65 53 79  t */.){.  FileSy
1a940 73 74 65 6d 20 2a 70 46 53 20 3d 20 70 4d 57 2d  stem *pFS = pMW-
1a950 3e 70 44 62 2d 3e 70 46 53 3b 0a 20 20 72 65 74  >pDb->pFS;.  ret
1a960 75 72 6e 20 6c 73 6d 46 73 53 6f 72 74 65 64 50  urn lsmFsSortedP
1a970 61 64 64 69 6e 67 28 70 46 53 2c 20 70 4d 57 2d  adding(pFS, pMW-
1a980 3e 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2c 20 26  >pDb->pWorker, &
1a990 70 4d 57 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68 73  pMW->pLevel->lhs
1a9a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
1a9b0 61 73 65 20 61 6c 6c 20 70 61 67 65 20 72 65 66  ase all page ref
1a9c0 65 72 65 6e 63 65 73 20 63 75 72 72 65 6e 74 6c  erences currentl
1a9d0 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 6d 65  y held by the me
1a9e0 72 67 65 2d 77 6f 72 6b 65 72 20 70 61 73 73 65  rge-worker passe
1a9f0 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79  d.** as the only
1aa00 20 61 72 67 75 6d 65 6e 74 2e 20 55 6e 6c 65 73   argument. Unles
1aa10 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  s an error has o
1aa20 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 70 61 67  ccurred, all pag
1aa30 65 73 20 68 61 76 65 0a 2a 2a 20 61 6c 72 65 61  es have.** alrea
1aa40 64 79 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  dy been released
1aa50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1aa60 20 6d 65 72 67 65 57 6f 72 6b 65 72 52 65 6c 65   mergeWorkerRele
1aa70 61 73 65 41 6c 6c 28 4d 65 72 67 65 57 6f 72 6b  aseAll(MergeWork
1aa80 65 72 20 2a 70 4d 57 29 7b 0a 20 20 69 6e 74 20  er *pMW){.  int 
1aa90 69 3b 0a 20 20 6c 73 6d 46 73 50 61 67 65 52 65  i;.  lsmFsPageRe
1aaa0 6c 65 61 73 65 28 70 4d 57 2d 3e 70 50 61 67 65  lease(pMW->pPage
1aab0 29 3b 0a 20 20 70 4d 57 2d 3e 70 50 61 67 65 20  );.  pMW->pPage 
1aac0 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
1aad0 20 69 3c 70 4d 57 2d 3e 68 69 65 72 2e 6e 48 69   i<pMW->hier.nHi
1aae0 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 73  er; i++){.    ls
1aaf0 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65 28 70  mFsPageRelease(p
1ab00 4d 57 2d 3e 68 69 65 72 2e 61 70 48 69 65 72 5b  MW->hier.apHier[
1ab10 69 5d 29 3b 0a 20 20 20 20 70 4d 57 2d 3e 68 69  i]);.    pMW->hi
1ab20 65 72 2e 61 70 48 69 65 72 5b 69 5d 20 3d 20 30  er.apHier[i] = 0
1ab30 3b 0a 20 20 7d 0a 20 20 6c 73 6d 46 72 65 65 28  ;.  }.  lsmFree(
1ab40 70 4d 57 2d 3e 70 44 62 2d 3e 70 45 6e 76 2c 20  pMW->pDb->pEnv, 
1ab50 70 4d 57 2d 3e 68 69 65 72 2e 61 70 48 69 65 72  pMW->hier.apHier
1ab60 29 3b 0a 20 20 70 4d 57 2d 3e 68 69 65 72 2e 61  );.  pMW->hier.a
1ab70 70 48 69 65 72 20 3d 20 30 3b 0a 20 20 70 4d 57  pHier = 0;.  pMW
1ab80 2d 3e 68 69 65 72 2e 6e 48 69 65 72 20 3d 20 30  ->hier.nHier = 0
1ab90 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1aba0 6b 65 79 73 7a 54 6f 53 6b 69 70 28 46 69 6c 65  keyszToSkip(File
1abb0 53 79 73 74 65 6d 20 2a 70 46 53 2c 20 69 6e 74  System *pFS, int
1abc0 20 6e 4b 65 79 29 7b 0a 20 20 69 6e 74 20 6e 50   nKey){.  int nP
1abd0 67 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20  gsz;            
1abe0 20 20 20 20 2f 2a 20 4e 6f 6d 69 6e 61 6c 20 64      /* Nominal d
1abf0 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
1ac00 65 20 2a 2f 0a 20 20 6e 50 67 73 7a 20 3d 20 6c  e */.  nPgsz = l
1ac10 73 6d 46 73 50 61 67 65 53 69 7a 65 28 70 46 53  smFsPageSize(pFS
1ac20 29 3b 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f  );.  return LSM_
1ac30 4d 49 4e 28 28 28 6e 4b 65 79 20 2a 20 34 29 20  MIN(((nKey * 4) 
1ac40 2f 20 6e 50 67 73 7a 29 2c 20 33 29 3b 0a 7d 0a  / nPgsz), 3);.}.
1ac50 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 74  ./*.** Release t
1ac60 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
1ac70 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70  the current outp
1ac80 75 74 20 70 61 67 65 20 6f 66 20 6d 65 72 67 65  ut page of merge
1ac90 2d 77 6f 72 6b 65 72 20 2a 70 4d 57 0a 2a 2a 20  -worker *pMW.** 
1aca0 28 72 65 66 65 72 65 6e 63 65 20 70 4d 57 2d 3e  (reference pMW->
1acb0 70 50 61 67 65 29 2e 20 53 65 74 20 74 68 65 20  pPage). Set the 
1acc0 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75  page number valu
1acd0 65 73 20 69 6e 20 61 53 61 76 65 5b 5d 20 61 73  es in aSave[] as
1ace0 20 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 28 73   .** required (s
1acf0 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
1ad00 65 20 73 74 72 75 63 74 20 4d 65 72 67 65 57 6f  e struct MergeWo
1ad10 72 6b 65 72 20 66 6f 72 20 64 65 74 61 69 6c 73  rker for details
1ad20 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1ad30 20 6d 65 72 67 65 57 6f 72 6b 65 72 50 65 72 73   mergeWorkerPers
1ad40 69 73 74 41 6e 64 52 65 6c 65 61 73 65 28 4d 65  istAndRelease(Me
1ad50 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57 29 7b  rgeWorker *pMW){
1ad60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1ad70 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
1ad80 4d 57 2d 3e 70 50 61 67 65 20 7c 7c 20 28 70 4d  MW->pPage || (pM
1ad90 57 2d 3e 61 53 61 76 65 5b 30 5d 2e 62 53 74 6f  W->aSave[0].bSto
1ada0 72 65 3d 3d 30 20 26 26 20 70 4d 57 2d 3e 61 53  re==0 && pMW->aS
1adb0 61 76 65 5b 31 5d 2e 62 53 74 6f 72 65 3d 3d 30  ave[1].bStore==0
1adc0 29 20 29 3b 0a 0a 20 20 2f 2a 20 50 65 72 73 69  ) );..  /* Persi
1add0 73 74 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  st the page */. 
1ade0 20 72 63 20 3d 20 6c 73 6d 46 73 50 61 67 65 50   rc = lsmFsPageP
1adf0 65 72 73 69 73 74 28 70 4d 57 2d 3e 70 50 61 67  ersist(pMW->pPag
1ae00 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 65 71  e);..  /* If req
1ae10 75 69 72 65 64 2c 20 73 61 76 65 20 74 68 65 20  uired, save the 
1ae20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a  page number. */.
1ae30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
1ae40 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d  i++){.    if( pM
1ae50 57 2d 3e 61 53 61 76 65 5b 69 5d 2e 62 53 74 6f  W->aSave[i].bSto
1ae60 72 65 20 29 7b 0a 20 20 20 20 20 20 70 4d 57 2d  re ){.      pMW-
1ae70 3e 61 53 61 76 65 5b 69 5d 2e 69 50 67 6e 6f 20  >aSave[i].iPgno 
1ae80 3d 20 6c 73 6d 46 73 50 61 67 65 4e 75 6d 62 65  = lsmFsPageNumbe
1ae90 72 28 70 4d 57 2d 3e 70 50 61 67 65 29 3b 0a 20  r(pMW->pPage);. 
1aea0 20 20 20 20 20 70 4d 57 2d 3e 61 53 61 76 65 5b       pMW->aSave[
1aeb0 69 5d 2e 62 53 74 6f 72 65 20 3d 20 30 3b 0a 20  i].bStore = 0;. 
1aec0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
1aed0 65 6c 65 61 73 65 20 74 68 65 20 63 6f 6d 70 6c  elease the compl
1aee0 65 74 65 64 20 6f 75 74 70 75 74 20 70 61 67 65  eted output page
1aef0 2e 20 2a 2f 0a 20 20 6c 73 6d 46 73 50 61 67 65  . */.  lsmFsPage
1af00 52 65 6c 65 61 73 65 28 70 4d 57 2d 3e 70 50 61  Release(pMW->pPa
1af10 67 65 29 3b 0a 20 20 70 4d 57 2d 3e 70 50 61 67  ge);.  pMW->pPag
1af20 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
1af30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  rc;.}../*.** Adv
1af40 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
1af50 20 70 61 67 65 20 6f 66 20 61 6e 20 6f 75 74 70   page of an outp
1af60 75 74 20 72 75 6e 20 62 65 69 6e 67 20 70 6f 70  ut run being pop
1af70 75 6c 61 74 65 64 20 62 79 20 6d 65 72 67 65 2d  ulated by merge-
1af80 77 6f 72 6b 65 72 0a 2a 2a 20 70 4d 57 2e 20 54  worker.** pMW. T
1af90 68 65 20 66 6f 6f 74 65 72 20 6f 66 20 74 68 65  he footer of the
1afa0 20 6e 65 77 20 70 61 67 65 20 69 73 20 69 6e 69   new page is ini
1afb0 74 69 61 6c 69 7a 65 64 20 74 6f 20 69 6e 64 69  tialized to indi
1afc0 63 61 74 65 20 74 68 61 74 20 69 74 20 63 6f 6e  cate that it con
1afd0 74 61 69 6e 73 0a 2a 2a 20 7a 65 72 6f 20 72 65  tains.** zero re
1afe0 63 6f 72 64 73 2e 20 54 68 65 20 66 6c 61 67 73  cords. The flags
1aff0 20 66 69 65 6c 64 20 69 73 20 63 6c 65 61 72 65   field is cleare
1b000 64 2e 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74  d. The page foot
1b010 65 72 20 70 6f 69 6e 74 65 72 20 66 69 65 6c 64  er pointer field
1b020 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 69 46  .** is set to iF
1b030 50 74 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  Ptr..**.** If su
1b040 63 63 65 73 73 66 75 6c 2c 20 4c 53 4d 5f 4f 4b  ccessful, LSM_OK
1b050 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1b060 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
1b070 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
1b080 63 20 69 6e 74 20 6d 65 72 67 65 57 6f 72 6b 65  c int mergeWorke
1b090 72 4e 65 78 74 50 61 67 65 28 0a 20 20 4d 65 72  rNextPage(.  Mer
1b0a0 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57 2c 20 20  geWorker *pMW,  
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b0c0 4d 65 72 67 65 20 77 6f 72 6b 65 72 20 6f 62 6a  Merge worker obj
1b0d0 65 63 74 20 74 6f 20 61 70 70 65 6e 64 20 70 61  ect to append pa
1b0e0 67 65 20 74 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20  ge to */.  Pgno 
1b0f0 69 46 50 74 72 20 20 20 20 20 20 20 20 20 20 20  iFPtr           
1b100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1b110 69 6e 74 65 72 20 76 61 6c 75 65 20 66 6f 72 20  inter value for 
1b120 66 6f 6f 74 65 72 20 6f 66 20 6e 65 77 20 70 61  footer of new pa
1b130 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ge */.){.  int r
1b140 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20  c = LSM_OK;     
1b150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b160 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50  turn code */.  P
1b170 61 67 65 20 2a 70 4e 65 78 74 20 3d 20 30 3b 20  age *pNext = 0; 
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b190 2a 20 4e 65 77 20 70 61 67 65 20 61 70 70 65 6e  * New page appen
1b1a0 64 65 64 20 74 6f 20 72 75 6e 20 2a 2f 0a 20 20  ded to run */.  
1b1b0 6c 73 6d 5f 64 62 20 2a 70 44 62 20 3d 20 70 4d  lsm_db *pDb = pM
1b1c0 57 2d 3e 70 44 62 3b 20 20 20 20 20 20 20 20 20  W->pDb;         
1b1d0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
1b1e0 6c 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 6c 73  le */..  rc = ls
1b1f0 6d 46 73 53 6f 72 74 65 64 41 70 70 65 6e 64 28  mFsSortedAppend(
1b200 70 44 62 2d 3e 70 46 53 2c 20 70 44 62 2d 3e 70  pDb->pFS, pDb->p
1b210 57 6f 72 6b 65 72 2c 20 70 4d 57 2d 3e 70 4c 65  Worker, pMW->pLe
1b220 76 65 6c 2c 20 30 2c 20 26 70 4e 65 78 74 29 3b  vel, 0, &pNext);
1b230 0a 20 20 61 73 73 65 72 74 28 20 72 63 20 7c 7c  .  assert( rc ||
1b240 20 70 4d 57 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68   pMW->pLevel->lh
1b250 73 2e 69 46 69 72 73 74 3e 30 20 7c 7c 20 70 4d  s.iFirst>0 || pM
1b260 57 2d 3e 70 44 62 2d 3e 63 6f 6d 70 72 65 73 73  W->pDb->compress
1b270 2e 78 43 6f 6d 70 72 65 73 73 20 29 3b 0a 0a 20  .xCompress );.. 
1b280 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
1b290 29 7b 0a 20 20 20 20 75 38 20 2a 61 44 61 74 61  ){.    u8 *aData
1b2a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b2b0 20 20 20 20 20 2f 2a 20 44 61 74 61 20 62 75 66       /* Data buf
1b2c0 66 65 72 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  fer belonging to
1b2d0 20 70 61 67 65 20 70 4e 65 78 74 20 2a 2f 0a 20   page pNext */. 
1b2e0 20 20 20 69 6e 74 20 6e 44 61 74 61 3b 20 20 20     int nData;   
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b300 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 44 61 74   /* Size of aDat
1b310 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  a[] in bytes */.
1b320 0a 20 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57  .    rc = mergeW
1b330 6f 72 6b 65 72 50 65 72 73 69 73 74 41 6e 64 52  orkerPersistAndR
1b340 65 6c 65 61 73 65 28 70 4d 57 29 3b 0a 0a 20 20  elease(pMW);..  
1b350 20 20 70 4d 57 2d 3e 70 50 61 67 65 20 3d 20 70    pMW->pPage = p
1b360 4e 65 78 74 3b 0a 20 20 20 20 70 4d 57 2d 3e 70  Next;.    pMW->p
1b370 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65 2d 3e 69  Level->pMerge->i
1b380 4f 75 74 70 75 74 4f 66 66 20 3d 20 30 3b 0a 20  OutputOff = 0;. 
1b390 20 20 20 61 44 61 74 61 20 3d 20 66 73 50 61 67     aData = fsPag
1b3a0 65 44 61 74 61 28 70 4e 65 78 74 2c 20 26 6e 44  eData(pNext, &nD
1b3b0 61 74 61 29 3b 0a 20 20 20 20 6c 73 6d 50 75 74  ata);.    lsmPut
1b3c0 55 31 36 28 26 61 44 61 74 61 5b 53 45 47 4d 45  U16(&aData[SEGME
1b3d0 4e 54 5f 4e 52 45 43 4f 52 44 5f 4f 46 46 53 45  NT_NRECORD_OFFSE
1b3e0 54 28 6e 44 61 74 61 29 5d 2c 20 30 29 3b 0a 20  T(nData)], 0);. 
1b3f0 20 20 20 6c 73 6d 50 75 74 55 31 36 28 26 61 44     lsmPutU16(&aD
1b400 61 74 61 5b 53 45 47 4d 45 4e 54 5f 46 4c 41 47  ata[SEGMENT_FLAG
1b410 53 5f 4f 46 46 53 45 54 28 6e 44 61 74 61 29 5d  S_OFFSET(nData)]
1b420 2c 20 30 29 3b 0a 20 20 20 20 6c 73 6d 50 75 74  , 0);.    lsmPut
1b430 55 36 34 28 26 61 44 61 74 61 5b 53 45 47 4d 45  U64(&aData[SEGME
1b440 4e 54 5f 50 4f 49 4e 54 45 52 5f 4f 46 46 53 45  NT_POINTER_OFFSE
1b450 54 28 6e 44 61 74 61 29 5d 2c 20 69 46 50 74 72  T(nData)], iFPtr
1b460 29 3b 0a 20 20 20 20 70 4d 57 2d 3e 6e 57 6f 72  );.    pMW->nWor
1b470 6b 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  k++;.  }..  retu
1b480 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b490 57 72 69 74 65 20 61 20 62 6c 6f 62 20 6f 66 20  Write a blob of 
1b4a0 64 61 74 61 20 69 6e 74 6f 20 61 6e 20 6f 75 74  data into an out
1b4b0 70 75 74 20 73 65 67 6d 65 6e 74 20 62 65 69 6e  put segment bein
1b4c0 67 20 70 6f 70 75 6c 61 74 65 64 20 62 79 20 61  g populated by a
1b4d0 20 0a 2a 2a 20 6d 65 72 67 65 2d 77 6f 72 6b 65   .** merge-worke
1b4e0 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 72 67  r object. If arg
1b4f0 75 6d 65 6e 74 20 62 53 65 70 20 69 73 20 74 72  ument bSep is tr
1b500 75 65 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 74  ue, write into t
1b510 68 65 20 73 65 70 61 72 61 74 6f 72 73 0a 2a 2a  he separators.**
1b520 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
1b530 65 2c 20 74 68 65 20 6d 61 69 6e 20 61 72 72 61  e, the main arra
1b540 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  y..**.** This fu
1b550 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
1b560 6f 20 77 72 69 74 65 20 74 68 65 20 62 6c 6f 62  o write the blob
1b570 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 6b 65  s of data for ke
1b580 79 73 20 61 6e 64 20 76 61 6c 75 65 73 2e 0a 2a  ys and values..*
1b590 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 72  /.static int mer
1b5a0 67 65 57 6f 72 6b 65 72 44 61 74 61 28 0a 20 20  geWorkerData(.  
1b5b0 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57  MergeWorker *pMW
1b5c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b5d0 2f 2a 20 4d 65 72 67 65 20 77 6f 72 6b 65 72 20  /* Merge worker 
1b5e0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
1b5f0 62 53 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  bSep,           
1b600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b610 72 75 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20  rue to write to 
1b620 73 65 70 61 72 61 74 6f 72 73 20 72 75 6e 20 2a  separators run *
1b630 2f 0a 20 20 69 6e 74 20 69 46 50 74 72 2c 20 20  /.  int iFPtr,  
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b650 20 20 20 20 2f 2a 20 46 6f 6f 74 65 72 20 70 74      /* Footer pt
1b660 72 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 20  r for new pages 
1b670 2a 2f 0a 20 20 75 38 20 2a 61 57 72 69 74 65 2c  */.  u8 *aWrite,
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 64 61       /* Write da
1b6a0 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66  ta from this buf
1b6b0 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 72  fer */.  int nWr
1b6c0 69 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ite             
1b6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b6e0 20 6f 66 20 61 57 72 69 74 65 5b 5d 20 69 6e 20   of aWrite[] in 
1b6f0 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bytes */.){.  in
1b700 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20  t rc = LSM_OK;  
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b720 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1b730 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 57 72    int nRem = nWr
1b740 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
1b750 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1b760 79 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 77 72  ytes still to wr
1b770 69 74 65 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28  ite */..  while(
1b780 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 4d   nRem>0 ){.    M
1b790 65 72 67 65 20 2a 70 4d 65 72 67 65 20 3d 20 70  erge *pMerge = p
1b7a0 4d 57 2d 3e 70 4c 65 76 65 6c 2d 3e 70 4d 65 72  MW->pLevel->pMer
1b7b0 67 65 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70  ge;.    int nCop
1b7c0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1b7d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b7e0 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
1b7f0 20 2a 2f 0a 20 20 20 20 75 38 20 2a 61 44 61 74   */.    u8 *aDat
1b800 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
1b810 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1b820 20 74 6f 20 62 75 66 66 65 72 20 6f 66 20 63 75   to buffer of cu
1b830 72 72 65 6e 74 20 6f 75 74 70 75 74 20 70 61 67  rrent output pag
1b840 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 61  e */.    int nDa
1b850 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
1b860 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1b870 66 20 61 44 61 74 61 5b 5d 20 69 6e 20 62 79 74  f aData[] in byt
1b880 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52  es */.    int nR
1b890 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1b8a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b8b0 72 20 6f 66 20 72 65 63 6f 72 64 73 20 6f 6e 20  r of records on 
1b8c0 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 70  current output p
1b8d0 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  age */.    int i
1b8e0 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
1b8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1b900 65 74 20 69 6e 20 61 44 61 74 61 5b 5d 20 74 6f  et in aData[] to
1b910 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20   write to */..  
1b920 20 20 61 73 73 65 72 74 28 20 6c 73 6d 46 73 50    assert( lsmFsP
1b930 61 67 65 57 72 69 74 61 62 6c 65 28 70 4d 57 2d  ageWritable(pMW-
1b940 3e 70 50 61 67 65 29 20 29 3b 0a 20 20 20 0a 20  >pPage) );.   . 
1b950 20 20 20 61 44 61 74 61 20 3d 20 66 73 50 61 67     aData = fsPag
1b960 65 44 61 74 61 28 70 4d 57 2d 3e 70 50 61 67 65  eData(pMW->pPage
1b970 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 6e  , &nData);.    n
1b980 52 65 63 20 3d 20 70 61 67 65 47 65 74 4e 52 65  Rec = pageGetNRe
1b990 63 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  c(aData, nData);
1b9a0 0a 20 20 20 20 69 4f 66 66 20 3d 20 70 4d 65 72  .    iOff = pMer
1b9b0 67 65 2d 3e 69 4f 75 74 70 75 74 4f 66 66 3b 0a  ge->iOutputOff;.
1b9c0 20 20 20 20 6e 43 6f 70 79 20 3d 20 4c 53 4d 5f      nCopy = LSM_
1b9d0 4d 49 4e 28 6e 52 65 6d 2c 20 53 45 47 4d 45 4e  MIN(nRem, SEGMEN
1b9e0 54 5f 45 4f 46 28 6e 44 61 74 61 2c 20 6e 52 65  T_EOF(nData, nRe
1b9f0 63 29 20 2d 20 69 4f 66 66 29 3b 0a 0a 20 20 20  c) - iOff);..   
1ba00 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69   memcpy(&aData[i
1ba10 4f 66 66 5d 2c 20 26 61 57 72 69 74 65 5b 6e 57  Off], &aWrite[nW
1ba20 72 69 74 65 2d 6e 52 65 6d 5d 2c 20 6e 43 6f 70  rite-nRem], nCop
1ba30 79 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20  y);.    nRem -= 
1ba40 6e 43 6f 70 79 3b 0a 0a 20 20 20 20 69 66 28 20  nCopy;..    if( 
1ba50 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRem>0 ){.      
1ba60 72 63 20 3d 20 6d 65 72 67 65 57 6f 72 6b 65 72  rc = mergeWorker
1ba70 4e 65 78 74 50 61 67 65 28 70 4d 57 2c 20 69 46  NextPage(pMW, iF
1ba80 50 74 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ptr);.    }else{
1ba90 0a 20 20 20 20 20 20 70 4d 65 72 67 65 2d 3e 69  .      pMerge->i
1baa0 4f 75 74 70 75 74 4f 66 66 20 3d 20 69 4f 66 66  OutputOff = iOff
1bab0 20 2b 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a   + nCopy;.    }.
1bac0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1bad0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
1bae0 4d 65 72 67 65 57 6f 72 6b 65 72 20 70 61 73 73  MergeWorker pass
1baf0 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
1bb00 72 67 75 6d 65 6e 74 20 69 73 20 77 6f 72 6b 69  rgument is worki
1bb10 6e 67 20 74 6f 20 6d 65 72 67 65 20 74 77 6f 20  ng to merge two 
1bb20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 65 78 69 73 74  or.** more exist
1bb30 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 74 6f 67  ing segments tog
1bb40 65 74 68 65 72 20 28 6e 6f 74 20 74 6f 20 66 6c  ether (not to fl
1bb50 75 73 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ush an in-memory
1bb60 20 74 72 65 65 29 2e 20 49 74 0a 2a 2a 20 68 61   tree). It.** ha
1bb70 73 20 6e 6f 74 20 79 65 74 20 77 72 69 74 74 65  s not yet writte
1bb80 6e 20 74 68 65 20 66 69 72 73 74 20 6b 65 79 20  n the first key 
1bb90 74 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 67  to the first pag
1bba0 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2e  e of the output.
1bbb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1bbc0 65 72 67 65 57 6f 72 6b 65 72 46 69 72 73 74 50  ergeWorkerFirstP
1bbd0 61 67 65 28 4d 65 72 67 65 57 6f 72 6b 65 72 20  age(MergeWorker 
1bbe0 2a 70 4d 57 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pMW){.  int rc 
1bbf0 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20  = LSM_OK;       
1bc00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1bc10 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 61 67  rn code */.  Pag
1bc20 65 20 2a 70 50 67 20 3d 20 30 3b 20 20 20 20 20  e *pPg = 0;     
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc40 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 72 75  First page of ru
1bc50 6e 20 70 53 65 67 20 2a 2f 0a 20 20 69 6e 74 20  n pSeg */.  int 
1bc60 69 46 50 74 72 20 3d 20 30 3b 20 20 20 20 20 20  iFPtr = 0;      
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1bc80 6f 69 6e 74 65 72 20 76 61 6c 75 65 20 72 65 61  ointer value rea
1bc90 64 20 66 72 6f 6d 20 66 6f 6f 74 65 72 20 6f 66  d from footer of
1bca0 20 70 50 67 20 2a 2f 0a 20 20 4d 75 6c 74 69 43   pPg */.  MultiC
1bcb0 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 70 4d  ursor *pCsr = pM
1bcc0 57 2d 3e 70 43 73 72 3b 0a 0a 20 20 61 73 73 65  W->pCsr;..  asse
1bcd0 72 74 28 20 70 4d 57 2d 3e 70 50 61 67 65 3d 3d  rt( pMW->pPage==
1bce0 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 73 72  0 );..  if( pCsr
1bcf0 2d 3e 70 42 74 43 73 72 20 29 7b 0a 20 20 20 20  ->pBtCsr ){.    
1bd00 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 20  rc = LSM_OK;.   
1bd10 20 69 46 50 74 72 20 3d 20 70 4d 57 2d 3e 70 4c   iFPtr = pMW->pL
1bd20 65 76 65 6c 2d 3e 70 4e 65 78 74 2d 3e 6c 68 73  evel->pNext->lhs
1bd30 2e 69 46 69 72 73 74 3b 0a 20 20 7d 65 6c 73 65  .iFirst;.  }else
1bd40 20 69 66 28 20 70 43 73 72 2d 3e 6e 50 74 72 3e   if( pCsr->nPtr>
1bd50 30 20 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74  0 ){.    Segment
1bd60 20 2a 70 53 65 67 3b 0a 20 20 20 20 70 53 65 67   *pSeg;.    pSeg
1bd70 20 3d 20 70 43 73 72 2d 3e 61 50 74 72 5b 70 43   = pCsr->aPtr[pC
1bd80 73 72 2d 3e 6e 50 74 72 2d 31 5d 2e 70 53 65 67  sr->nPtr-1].pSeg
1bd90 3b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 46 73  ;.    rc = lsmFs
1bda0 44 62 50 61 67 65 47 65 74 28 70 4d 57 2d 3e 70  DbPageGet(pMW->p
1bdb0 44 62 2d 3e 70 46 53 2c 20 70 53 65 67 2c 20 70  Db->pFS, pSeg, p
1bdc0 53 65 67 2d 3e 69 46 69 72 73 74 2c 20 26 70 50  Seg->iFirst, &pP
1bdd0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  g);.    if( rc==
1bde0 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  LSM_OK ){.      
1bdf0 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  u8 *aData;      
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1be10 20 42 75 66 66 65 72 20 66 6f 72 20 70 61 67 65   Buffer for page
1be20 20 70 50 67 20 2a 2f 0a 20 20 20 20 20 20 69 6e   pPg */.      in
1be30 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20  t nData;        
1be40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1be50 69 7a 65 20 6f 66 20 61 44 61 74 61 5b 5d 20 69  ize of aData[] i
1be60 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
1be70 20 61 44 61 74 61 20 3d 20 66 73 50 61 67 65 44   aData = fsPageD
1be80 61 74 61 28 70 50 67 2c 20 26 6e 44 61 74 61 29  ata(pPg, &nData)
1be90 3b 0a 20 20 20 20 20 20 69 46 50 74 72 20 3d 20  ;.      iFPtr = 
1bea0 70 61 67 65 47 65 74 50 74 72 28 61 44 61 74 61  pageGetPtr(aData
1beb0 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , nData);.      
1bec0 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65  lsmFsPageRelease
1bed0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1bee0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f  ..  if( rc==LSM_
1bef0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  OK ){.    rc = m
1bf00 65 72 67 65 57 6f 72 6b 65 72 4e 65 78 74 50 61  ergeWorkerNextPa
1bf10 67 65 28 70 4d 57 2c 20 69 46 50 74 72 29 3b 0a  ge(pMW, iFPtr);.
1bf20 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 70 50      if( pCsr->pP
1bf30 72 65 76 4d 65 72 67 65 50 74 72 20 29 20 2a 70  revMergePtr ) *p
1bf40 43 73 72 2d 3e 70 50 72 65 76 4d 65 72 67 65 50  Csr->pPrevMergeP
1bf50 74 72 20 3d 20 69 46 50 74 72 3b 0a 20 20 20 20  tr = iFPtr;.    
1bf60 70 4d 57 2d 3e 61 53 61 76 65 5b 30 5d 2e 62 53  pMW->aSave[0].bS
1bf70 74 6f 72 65 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  tore = 1;.  }.. 
1bf80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
1bf90 74 61 74 69 63 20 69 6e 74 20 6d 65 72 67 65 57  tatic int mergeW
1bfa0 6f 72 6b 65 72 57 72 69 74 65 28 0a 20 20 4d 65  orkerWrite(.  Me
1bfb0 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57 2c 20  rgeWorker *pMW, 
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bfd0 20 4d 65 72 67 65 20 77 6f 72 6b 65 72 20 6f 62   Merge worker ob
1bfe0 6a 65 63 74 20 74 6f 20 77 72 69 74 65 20 69 6e  ject to write in
1bff0 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  to */.  int eTyp
1c000 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1c010 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
1c020 66 20 53 4f 52 54 45 44 5f 53 45 50 41 52 41 54  f SORTED_SEPARAT
1c030 4f 52 2c 20 57 52 49 54 45 20 6f 72 20 44 45 4c  OR, WRITE or DEL
1c040 45 54 45 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ETE */.  void *p
1c050 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 2c 20 20  Key, int nKey,  
1c060 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20           /* Key 
1c070 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64 20  value */.  void 
1c080 2a 70 56 61 6c 2c 20 69 6e 74 20 6e 56 61 6c 2c  *pVal, int nVal,
1c090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1c0a0 6c 75 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  lue value */.  i
1c0b0 6e 74 20 69 50 74 72 20 20 20 20 20 20 20 20 20  nt iPtr         
1c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c0d0 2a 20 41 62 73 6f 6c 75 74 65 20 76 61 6c 75 65  * Absolute value
1c0e0 20 6f 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72   of page pointer
1c0f0 2c 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69  , or 0 */.){.  i
1c100 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20  nt rc = LSM_OK; 
1c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c120 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1c130 0a 20 20 4d 65 72 67 65 20 2a 70 4d 65 72 67 65  .  Merge *pMerge
1c140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c150 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
1c160 20 70 61 72 74 20 6f 66 20 6c 65 76 65 6c 20 6d   part of level m
1c170 65 72 67 65 20 73 74 61 74 65 20 2a 2f 0a 20 20  erge state */.  
1c180 69 6e 74 20 6e 48 64 72 3b 20 20 20 20 20 20 20  int nHdr;       
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1a0 2f 2a 20 53 70 61 63 65 20 72 65 71 75 69 72 65  /* Space require
1c1b0 64 20 66 6f 72 20 74 68 69 73 20 72 65 63 6f 72  d for this recor
1c1c0 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 50 61  d header */.  Pa
1c1d0 67 65 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  ge *pPg;        
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c1f0 20 50 61 67 65 20 74 6f 20 77 72 69 74 65 20 74   Page to write t
1c200 6f 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61  o */.  u8 *aData
1c210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c220 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 62         /* Data b
1c230 75 66 66 65 72 20 66 6f 72 20 70 61 67 65 20 70  uffer for page p
1c240 57 72 69 74 65 72 2d 3e 70 50 61 67 65 20 2a 2f  Writer->pPage */
1c250 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 20 20 20  .  int nData;   
1c260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c270 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
1c280 66 66 65 72 20 61 44 61 74 61 5b 5d 20 69 6e 20  ffer aData[] in 
1c290 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  bytes */.  int n
1c2a0 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
1c2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c2c0 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
1c2d0 6f 6e 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20  on page pPg */. 
1c2e0 20 69 6e 74 20 69 46 50 74 72 3b 20 20 20 20 20   int iFPtr;     
1c2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c300 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 6f 69   /* Value of poi
1c310 6e 74 65 72 20 69 6e 20 66 6f 6f 74 65 72 20 6f  nter in footer o
1c320 66 20 70 50 67 20 2a 2f 0a 20 20 69 6e 74 20 69  f pPg */.  int i
1c330 52 50 74 72 20 3d 20 30 3b 20 20 20 20 20 20 20  RPtr = 0;       
1c340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1c350 6c 75 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 77  lue of pointer w
1c360 72 69 74 74 65 6e 20 69 6e 74 6f 20 72 65 63 6f  ritten into reco
1c370 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  rd */.  int iOff
1c380 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c390 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1c3a0 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
1c3b0 77 69 74 68 69 6e 20 70 61 67 65 20 70 50 67 20  within page pPg 
1c3c0 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 20 2a 70 53  */.  Segment *pS
1c3d0 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
1c3e0 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
1c3f0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
1c400 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30  .  int flags = 0
1c410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c420 20 20 20 2f 2a 20 49 66 20 21 3d 20 30 2c 20 66     /* If != 0, f
1c430 6c 61 67 73 20 76 61 6c 75 65 20 66 6f 72 20 70  lags value for p
1c440 61 67 65 20 66 6f 6f 74 65 72 20 2a 2f 0a 20 20  age footer */.  
1c450 69 6e 74 20 62 46 69 72 73 74 20 3d 20 30 3b 20  int bFirst = 0; 
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c470 2f 2a 20 54 72 75 65 20 66 6f 72 20 66 69 72 73  /* True for firs
1c480 74 20 6b 65 79 20 6f 66 20 6f 75 74 70 75 74 20  t key of output 
1c490 72 75 6e 20 2a 2f 0a 0a 20 20 70 4d 65 72 67 65  run */..  pMerge
1c4a0 20 3d 20 70 4d 57 2d 3e 70 4c 65 76 65 6c 2d 3e   = pMW->pLevel->
1c4b0 70 4d 65 72 67 65 3b 20 20 20 20 0a 20 20 70 53  pMerge;    .  pS
1c4c0 65 67 20 3d 20 26 70 4d 57 2d 3e 70 4c 65 76 65  eg = &pMW->pLeve
1c4d0 6c 2d 3e 6c 68 73 3b 0a 0a 20 20 69 66 28 20 70  l->lhs;..  if( p
1c4e0 53 65 67 2d 3e 69 46 69 72 73 74 3d 3d 30 20 26  Seg->iFirst==0 &
1c4f0 26 20 70 4d 57 2d 3e 70 50 61 67 65 3d 3d 30 20  & pMW->pPage==0 
1c500 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 65 72 67  ){.    rc = merg
1c510 65 57 6f 72 6b 65 72 46 69 72 73 74 50 61 67 65  eWorkerFirstPage
1c520 28 70 4d 57 29 3b 0a 20 20 20 20 62 46 69 72 73  (pMW);.    bFirs
1c530 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 67  t = 1;.  }.  pPg
1c540 20 3d 20 70 4d 57 2d 3e 70 50 61 67 65 3b 0a 20   = pMW->pPage;. 
1c550 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
1c560 61 44 61 74 61 20 3d 20 66 73 50 61 67 65 44 61  aData = fsPageDa
1c570 74 61 28 70 50 67 2c 20 26 6e 44 61 74 61 29 3b  ta(pPg, &nData);
1c580 0a 20 20 20 20 6e 52 65 63 20 3d 20 70 61 67 65  .    nRec = page
1c590 47 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e  GetNRec(aData, n
1c5a0 44 61 74 61 29 3b 0a 20 20 20 20 69 46 50 74 72  Data);.    iFPtr
1c5b0 20 3d 20 70 61 67 65 47 65 74 50 74 72 28 61 44   = pageGetPtr(aD
1c5c0 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20  ata, nData);.   
1c5d0 20 69 52 50 74 72 20 3d 20 69 50 74 72 20 2d 20   iRPtr = iPtr - 
1c5e0 69 46 50 74 72 3b 0a 20 20 7d 0a 20 20 20 20 20  iFPtr;.  }.     
1c5f0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1c600 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
1c610 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
1c620 68 65 20 6e 65 77 20 72 65 63 6f 72 64 2e 20 54  he new record. T
1c630 68 65 20 73 70 61 63 65 0a 20 20 2a 2a 20 72 65  he space.  ** re
1c640 71 75 69 72 65 64 20 69 73 20 64 69 76 69 64 65  quired is divide
1c650 64 20 69 6e 74 6f 20 74 77 6f 20 73 65 63 74 69  d into two secti
1c660 6f 6e 73 3a 20 74 68 65 20 68 65 61 64 65 72 20  ons: the header 
1c670 61 6e 64 20 74 68 65 20 62 6f 64 79 2e 20 54 68  and the body. Th
1c680 65 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 63 6f  e.  ** header co
1c690 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e  nsists of the in
1c6a0 74 69 61 6c 20 76 61 72 69 6e 74 20 66 69 65 6c  tial varint fiel
1c6b0 64 73 2e 20 54 68 65 20 62 6f 64 79 20 61 72 65  ds. The body are
1c6c0 20 74 68 65 20 62 6c 6f 62 73 20 0a 20 20 2a 2a   the blobs .  **
1c6d0 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 63 6f   of data that co
1c6e0 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
1c6f0 6b 65 79 20 61 6e 64 20 76 61 6c 75 65 20 64 61  key and value da
1c700 74 61 2e 20 54 68 65 20 65 6e 74 69 72 65 20 68  ta. The entire h
1c710 65 61 64 65 72 20 0a 20 20 2a 2a 20 6d 75 73 74  eader .  ** must
1c720 20 62 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68   be stored on th
1c730 65 20 70 61 67 65 2e 20 54 68 65 20 62 6f 64 79  e page. The body
1c740 20 6d 61 79 20 6f 76 65 72 66 6c 6f 77 20 6f 6e   may overflow on
1c750 74 6f 20 74 68 65 20 6e 65 78 74 20 61 6e 64 0a  to the next and.
1c760 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20    ** subsequent 
1c770 70 61 67 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pages..  **.  **
1c780 20 54 68 65 20 68 65 61 64 65 72 20 73 70 61 63   The header spac
1c790 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  e is:.  **.  ** 
1c7a0 20 20 20 20 31 29 20 72 65 63 6f 72 64 20 74 79      1) record ty
1c7b0 70 65 20 2d 20 31 20 62 79 74 65 2e 0a 20 20 2a  pe - 1 byte..  *
1c7c0 2a 20 20 20 20 20 32 29 20 50 61 67 65 2d 70 6f  *     2) Page-po
1c7d0 69 6e 74 65 72 2d 6f 66 66 73 65 74 20 2d 20 31  inter-offset - 1
1c7e0 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20 20 20 20   varint.  **    
1c7f0 20 33 29 20 4b 65 79 20 73 69 7a 65 20 2d 20 31   3) Key size - 1
1c800 20 76 61 72 69 6e 74 0a 20 20 2a 2a 20 20 20 20   varint.  **    
1c810 20 34 29 20 56 61 6c 75 65 20 73 69 7a 65 20 2d   4) Value size -
1c820 20 31 20 76 61 72 69 6e 74 20 28 6f 6e 6c 79 20   1 varint (only 
1c830 69 66 20 4c 53 4d 5f 49 4e 53 45 52 54 20 66 6c  if LSM_INSERT fl
1c840 61 67 20 69 73 20 73 65 74 29 0a 20 20 2a 2f 0a  ag is set).  */.
1c850 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b    if( rc==LSM_OK
1c860 20 29 7b 0a 20 20 20 20 6e 48 64 72 20 3d 20 31   ){.    nHdr = 1
1c870 20 2b 20 6c 73 6d 56 61 72 69 6e 74 4c 65 6e 33   + lsmVarintLen3
1c880 32 28 69 52 50 74 72 29 20 2b 20 6c 73 6d 56 61  2(iRPtr) + lsmVa
1c890 72 69 6e 74 4c 65 6e 33 32 28 6e 4b 65 79 29 3b  rintLen32(nKey);
1c8a0 0a 20 20 20 20 69 66 28 20 72 74 49 73 57 72 69  .    if( rtIsWri
1c8b0 74 65 28 65 54 79 70 65 29 20 29 20 6e 48 64 72  te(eType) ) nHdr
1c8c0 20 2b 3d 20 6c 73 6d 56 61 72 69 6e 74 4c 65 6e   += lsmVarintLen
1c8d0 33 32 28 6e 56 61 6c 29 3b 0a 0a 20 20 20 20 2f  32(nVal);..    /
1c8e0 2a 20 49 66 20 74 68 65 20 65 6e 74 69 72 65 20  * If the entire 
1c8f0 68 65 61 64 65 72 20 77 69 6c 6c 20 6e 6f 74 20  header will not 
1c900 66 69 74 20 6f 6e 20 70 61 67 65 20 70 50 67 2c  fit on page pPg,
1c910 20 6f 72 20 69 66 20 70 61 67 65 20 70 50 67 20   or if page pPg 
1c920 69 73 20 0a 20 20 20 20 2a 2a 20 6d 61 72 6b 65  is .    ** marke
1c930 64 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 61 64 76  d read-only, adv
1c940 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
1c950 20 70 61 67 65 20 6f 66 20 74 68 65 20 6f 75 74   page of the out
1c960 70 75 74 20 72 75 6e 2e 20 2a 2f 0a 20 20 20 20  put run. */.    
1c970 69 4f 66 66 20 3d 20 70 4d 65 72 67 65 2d 3e 69  iOff = pMerge->i
1c980 4f 75 74 70 75 74 4f 66 66 3b 0a 20 20 20 20 69  OutputOff;.    i
1c990 66 28 20 69 4f 66 66 3c 30 20 7c 7c 20 70 50 67  f( iOff<0 || pPg
1c9a0 3d 3d 30 20 7c 7c 20 69 4f 66 66 2b 6e 48 64 72  ==0 || iOff+nHdr
1c9b0 20 3e 20 53 45 47 4d 45 4e 54 5f 45 4f 46 28 6e   > SEGMENT_EOF(n
1c9c0 44 61 74 61 2c 20 6e 52 65 63 2b 31 29 20 29 7b  Data, nRec+1) ){
1c9d0 0a 20 20 20 20 20 20 69 46 50 74 72 20 3d 20 2a  .      iFPtr = *
1c9e0 70 4d 57 2d 3e 70 43 73 72 2d 3e 70 50 72 65 76  pMW->pCsr->pPrev
1c9f0 4d 65 72 67 65 50 74 72 3b 0a 20 20 20 20 20 20  MergePtr;.      
1ca00 69 52 50 74 72 20 3d 20 69 50 74 72 20 2d 20 69  iRPtr = iPtr - i
1ca10 46 50 74 72 3b 0a 20 20 20 20 20 20 69 4f 66 66  FPtr;.      iOff
1ca20 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 52 65 63   = 0;.      nRec
1ca30 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1ca40 20 6d 65 72 67 65 57 6f 72 6b 65 72 4e 65 78 74   mergeWorkerNext
1ca50 50 61 67 65 28 70 4d 57 2c 20 69 46 50 74 72 29  Page(pMW, iFPtr)
1ca60 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 4d  ;.      pPg = pM
1ca70 57 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a  W->pPage;.    }.
1ca80 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
1ca90 73 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  s record header 
1caa0 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73  will be the firs
1cab0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 61  t on the page, a
1cac0 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 0a  nd the page is .
1cad0 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 76 65 72    ** not the ver
1cae0 79 20 66 69 72 73 74 20 69 6e 20 74 68 65 20 65  y first in the e
1caf0 6e 74 69 72 65 20 72 75 6e 2c 20 61 64 64 20 61  ntire run, add a
1cb00 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6b 65 79   copy of the key
1cb10 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62 2d 74   to the.  ** b-t
1cb20 72 65 65 20 68 69 65 72 61 72 63 68 79 2e 0a 20  ree hierarchy.. 
1cb30 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53   */.  if( rc==LS
1cb40 4d 5f 4f 4b 20 26 26 20 6e 52 65 63 3d 3d 30 20  M_OK && nRec==0 
1cb50 26 26 20 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a  && bFirst==0 ){.
1cb60 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 72      assert( pMer
1cb70 67 65 2d 3e 6e 53 6b 69 70 3e 3d 30 20 29 3b 0a  ge->nSkip>=0 );.
1cb80 0a 20 20 20 20 69 66 28 20 70 4d 65 72 67 65 2d  .    if( pMerge-
1cb90 3e 6e 53 6b 69 70 3d 3d 30 20 29 7b 0a 20 20 20  >nSkip==0 ){.   
1cba0 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57 6f 72     rc = mergeWor
1cbb0 6b 65 72 50 75 73 68 48 69 65 72 61 72 63 68 79  kerPushHierarchy
1cbc0 28 70 4d 57 2c 20 72 74 54 6f 70 69 63 28 65 54  (pMW, rtTopic(eT
1cbd0 79 70 65 29 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  ype), pKey, nKey
1cbe0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1cbf0 20 70 4d 57 2d 3e 61 53 61 76 65 5b 30 5d 2e 62   pMW->aSave[0].b
1cc00 53 74 6f 72 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Store==0 );.    
1cc10 20 20 70 4d 57 2d 3e 61 53 61 76 65 5b 30 5d 2e    pMW->aSave[0].
1cc20 62 53 74 6f 72 65 20 3d 20 31 3b 0a 20 20 20 20  bStore = 1;.    
1cc30 20 20 70 4d 65 72 67 65 2d 3e 6e 53 6b 69 70 20    pMerge->nSkip 
1cc40 3d 20 6b 65 79 73 7a 54 6f 53 6b 69 70 28 70 4d  = keyszToSkip(pM
1cc50 57 2d 3e 70 44 62 2d 3e 70 46 53 2c 20 6e 4b 65  W->pDb->pFS, nKe
1cc60 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  y);.    }else{. 
1cc70 20 20 20 20 20 70 4d 65 72 67 65 2d 3e 6e 53 6b       pMerge->nSk
1cc80 69 70 2d 2d 3b 0a 20 20 20 20 20 20 66 6c 61 67  ip--;.      flag
1cc90 73 20 3d 20 50 47 46 54 52 5f 53 4b 49 50 5f 54  s = PGFTR_SKIP_T
1cca0 48 49 53 5f 46 4c 41 47 3b 0a 20 20 20 20 7d 0a  HIS_FLAG;.    }.
1ccb0 0a 20 20 20 20 69 66 28 20 70 4d 65 72 67 65 2d  .    if( pMerge-
1ccc0 3e 6e 53 6b 69 70 20 29 20 66 6c 61 67 73 20 7c  >nSkip ) flags |
1ccd0 3d 20 50 47 46 54 52 5f 53 4b 49 50 5f 4e 45 58  = PGFTR_SKIP_NEX
1cce0 54 5f 46 4c 41 47 3b 0a 20 20 7d 0a 0a 20 20 2f  T_FLAG;.  }..  /
1ccf0 2a 20 55 70 64 61 74 65 20 74 68 65 20 6f 75 74  * Update the out
1cd00 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  put segment */. 
1cd10 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
1cd20 29 7b 0a 20 20 20 20 61 44 61 74 61 20 3d 20 66  ){.    aData = f
1cd30 73 50 61 67 65 44 61 74 61 28 70 50 67 2c 20 26  sPageData(pPg, &
1cd40 6e 44 61 74 61 29 3b 0a 0a 20 20 20 20 2f 2a 20  nData);..    /* 
1cd50 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 20  Update the page 
1cd60 66 6f 6f 74 65 72 2e 20 2a 2f 0a 20 20 20 20 6c  footer. */.    l
1cd70 73 6d 50 75 74 55 31 36 28 26 61 44 61 74 61 5b  smPutU16(&aData[
1cd80 53 45 47 4d 45 4e 54 5f 4e 52 45 43 4f 52 44 5f  SEGMENT_NRECORD_
1cd90 4f 46 46 53 45 54 28 6e 44 61 74 61 29 5d 2c 20  OFFSET(nData)], 
1cda0 6e 52 65 63 2b 31 29 3b 0a 20 20 20 20 6c 73 6d  nRec+1);.    lsm
1cdb0 50 75 74 55 31 36 28 26 61 44 61 74 61 5b 53 45  PutU16(&aData[SE
1cdc0 47 4d 45 4e 54 5f 43 45 4c 4c 50 54 52 5f 4f 46  GMENT_CELLPTR_OF
1cdd0 46 53 45 54 28 6e 44 61 74 61 2c 20 6e 52 65 63  FSET(nData, nRec
1cde0 29 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 69  )], iOff);.    i
1cdf0 66 28 20 66 6c 61 67 73 20 29 20 6c 73 6d 50 75  f( flags ) lsmPu
1ce00 74 55 31 36 28 26 61 44 61 74 61 5b 53 45 47 4d  tU16(&aData[SEGM
1ce10 45 4e 54 5f 46 4c 41 47 53 5f 4f 46 46 53 45 54  ENT_FLAGS_OFFSET
1ce20 28 6e 44 61 74 61 29 5d 2c 20 66 6c 61 67 73 29  (nData)], flags)
1ce30 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ;..    /* Write 
1ce40 74 68 65 20 65 6e 74 72 79 20 68 65 61 64 65 72  the entry header
1ce50 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
1ce60 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  t page. */.    a
1ce70 44 61 74 61 5b 69 4f 66 66 2b 2b 5d 20 3d 20 65  Data[iOff++] = e
1ce80 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  Type;           
1ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ceb0 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 20      /* 1 */.    
1cec0 69 4f 66 66 20 2b 3d 20 6c 73 6d 56 61 72 69 6e  iOff += lsmVarin
1ced0 74 50 75 74 33 32 28 26 61 44 61 74 61 5b 69 4f  tPut32(&aData[iO
1cee0 66 66 5d 2c 20 69 52 50 74 72 29 3b 20 20 20 20  ff], iRPtr);    
1cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf00 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20       /* 2 */.   
1cf10 20 69 4f 66 66 20 2b 3d 20 6c 73 6d 56 61 72 69   iOff += lsmVari
1cf20 6e 74 50 75 74 33 32 28 26 61 44 61 74 61 5b 69  ntPut32(&aData[i
1cf30 4f 66 66 5d 2c 20 6e 4b 65 79 29 3b 20 20 20 20  Off], nKey);    
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20        /* 3 */.  
1cf60 20 20 69 66 28 20 72 74 49 73 57 72 69 74 65 28    if( rtIsWrite(
1cf70 65 54 79 70 65 29 20 29 20 69 4f 66 66 20 2b 3d  eType) ) iOff +=
1cf80 20 6c 73 6d 56 61 72 69 6e 74 50 75 74 33 32 28   lsmVarintPut32(
1cf90 26 61 44 61 74 61 5b 69 4f 66 66 5d 2c 20 6e 56  &aData[iOff], nV
1cfa0 61 6c 29 3b 20 20 20 2f 2a 20 34 20 2a 2f 0a 20  al);   /* 4 */. 
1cfb0 20 20 20 70 4d 65 72 67 65 2d 3e 69 4f 75 74 70     pMerge->iOutp
1cfc0 75 74 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 0a 20  utOff = iOff;.. 
1cfd0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1cfe0 6b 65 79 20 61 6e 64 20 64 61 74 61 20 69 6e 74  key and data int
1cff0 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a  o the segment. *
1d000 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  /.    assert( iF
1d010 50 74 72 3d 3d 70 61 67 65 47 65 74 50 74 72 28  Ptr==pageGetPtr(
1d020 61 44 61 74 61 2c 20 6e 44 61 74 61 29 20 29 3b  aData, nData) );
1d030 0a 20 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57  .    rc = mergeW
1d040 6f 72 6b 65 72 44 61 74 61 28 70 4d 57 2c 20 30  orkerData(pMW, 0
1d050 2c 20 69 46 50 74 72 2b 69 52 50 74 72 2c 20 70  , iFPtr+iRPtr, p
1d060 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
1d070 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26  if( rc==LSM_OK &
1d080 26 20 72 74 49 73 57 72 69 74 65 28 65 54 79 70  & rtIsWrite(eTyp
1d090 65 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  e) ){.      if( 
1d0a0 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
1d0b0 20 20 20 20 20 20 72 63 20 3d 20 6d 65 72 67 65        rc = merge
1d0c0 57 6f 72 6b 65 72 44 61 74 61 28 70 4d 57 2c 20  WorkerData(pMW, 
1d0d0 30 2c 20 69 46 50 74 72 2b 69 52 50 74 72 2c 20  0, iFPtr+iRPtr, 
1d0e0 70 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20 20  pVal, nVal);.   
1d0f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1d100 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d110 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
1d120 72 65 73 6f 75 72 63 65 73 20 61 6c 6c 6f 63 61  resources alloca
1d130 74 65 64 20 62 79 20 6d 65 72 67 65 57 6f 72 6b  ted by mergeWork
1d140 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  erInit()..*/.sta
1d150 74 69 63 20 76 6f 69 64 20 6d 65 72 67 65 57 6f  tic void mergeWo
1d160 72 6b 65 72 53 68 75 74 64 6f 77 6e 28 4d 65 72  rkerShutdown(Mer
1d170 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57 2c 20 69  geWorker *pMW, i
1d180 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 6e 74 20  nt *pRc){.  int 
1d190 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1d1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1d1b0 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
1d1c0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a   */.  int rc = *
1d1d0 70 52 63 3b 0a 20 20 4d 75 6c 74 69 43 75 72 73  pRc;.  MultiCurs
1d1e0 6f 72 20 2a 70 43 73 72 20 3d 20 70 4d 57 2d 3e  or *pCsr = pMW->
1d1f0 70 43 73 72 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65  pCsr;..  /* Unle
1d200 73 73 20 74 68 65 20 6d 65 72 67 65 20 68 61 73  ss the merge has
1d210 20 66 69 6e 69 73 68 65 64 2c 20 73 61 76 65 20   finished, save 
1d220 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
1d230 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ion in the.  ** 
1d240 4d 65 72 67 65 2e 61 49 6e 70 75 74 5b 5d 20 61  Merge.aInput[] a
1d250 72 72 61 79 2e 20 53 65 65 20 66 75 6e 63 74 69  rray. See functi
1d260 6f 6e 20 6d 65 72 67 65 57 6f 72 6b 65 72 49 6e  on mergeWorkerIn
1d270 69 74 28 29 20 66 6f 72 20 74 68 65 20 0a 20 20  it() for the .  
1d280 2a 2a 20 63 6f 64 65 20 74 6f 20 72 65 73 74 6f  ** code to resto
1d290 72 65 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69  re a cursor posi
1d2a0 74 69 6f 6e 20 62 61 73 65 64 20 6f 6e 20 61 49  tion based on aI
1d2b0 6e 70 75 74 5b 5d 2e 20 20 2a 2f 0a 20 20 69 66  nput[].  */.  if
1d2c0 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20  ( rc==LSM_OK && 
1d2d0 70 43 73 72 20 26 26 20 6c 73 6d 4d 43 75 72 73  pCsr && lsmMCurs
1d2e0 6f 72 56 61 6c 69 64 28 70 43 73 72 29 20 29 7b  orValid(pCsr) ){
1d2f0 0a 20 20 20 20 4d 65 72 67 65 20 2a 70 4d 65 72  .    Merge *pMer
1d300 67 65 20 3d 20 70 4d 57 2d 3e 70 4c 65 76 65 6c  ge = pMW->pLevel
1d310 2d 3e 70 4d 65 72 67 65 3b 0a 20 20 20 20 69 6e  ->pMerge;.    in
1d320 74 20 62 42 74 72 65 65 20 3d 20 28 70 43 73 72  t bBtree = (pCsr
1d330 2d 3e 70 42 74 43 73 72 21 3d 30 29 3b 0a 20 20  ->pBtCsr!=0);.  
1d340 20 20 69 6e 74 20 69 50 74 72 3b 0a 0a 20 20 20    int iPtr;..   
1d350 20 2f 2a 20 70 4d 65 72 67 65 2d 3e 6e 49 6e 70   /* pMerge->nInp
1d360 75 74 3d 3d 30 20 69 6e 64 69 63 61 74 65 73 20  ut==0 indicates 
1d370 74 68 61 74 20 74 68 69 73 20 69 73 20 61 20 46  that this is a F
1d380 6c 75 73 68 54 72 65 65 28 29 20 6f 70 65 72 61  lushTree() opera
1d390 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 61 73 73  tion. */.    ass
1d3a0 65 72 74 28 20 70 4d 65 72 67 65 2d 3e 6e 49 6e  ert( pMerge->nIn
1d3b0 70 75 74 3d 3d 30 20 7c 7c 20 70 4d 57 2d 3e 70  put==0 || pMW->p
1d3c0 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3e 30 20  Level->nRight>0 
1d3d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1d3e0 4d 65 72 67 65 2d 3e 6e 49 6e 70 75 74 3d 3d 30  Merge->nInput==0
1d3f0 20 7c 7c 20 70 4d 65 72 67 65 2d 3e 6e 49 6e 70   || pMerge->nInp
1d400 75 74 3d 3d 28 70 43 73 72 2d 3e 6e 50 74 72 2b  ut==(pCsr->nPtr+
1d410 62 42 74 72 65 65 29 20 29 3b 0a 0a 20 20 20 20  bBtree) );..    
1d420 66 6f 72 28 69 3d 30 3b 20 69 3c 28 70 4d 65 72  for(i=0; i<(pMer
1d430 67 65 2d 3e 6e 49 6e 70 75 74 2d 62 42 74 72 65  ge->nInput-bBtre
1d440 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e); i++){.      
1d450 53 65 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72  SegmentPtr *pPtr
1d460 20 3d 20 26 70 43 73 72 2d 3e 61 50 74 72 5b 69   = &pCsr->aPtr[i
1d470 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 74  ];.      if( pPt
1d480 72 2d 3e 70 50 67 20 29 7b 0a 20 20 20 20 20 20  r->pPg ){.      
1d490 20 20 70 4d 65 72 67 65 2d 3e 61 49 6e 70 75 74    pMerge->aInput
1d4a0 5b 69 5d 2e 69 50 67 20 3d 20 6c 73 6d 46 73 50  [i].iPg = lsmFsP
1d4b0 61 67 65 4e 75 6d 62 65 72 28 70 50 74 72 2d 3e  ageNumber(pPtr->
1d4c0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  pPg);.        pM
1d4d0 65 72 67 65 2d 3e 61 49 6e 70 75 74 5b 69 5d 2e  erge->aInput[i].
1d4e0 69 43 65 6c 6c 20 3d 20 70 50 74 72 2d 3e 69 43  iCell = pPtr->iC
1d4f0 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ell;.      }else
1d500 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 72 67 65  {.        pMerge
1d510 2d 3e 61 49 6e 70 75 74 5b 69 5d 2e 69 50 67 20  ->aInput[i].iPg 
1d520 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  = 0;.        pMe
1d530 72 67 65 2d 3e 61 49 6e 70 75 74 5b 69 5d 2e 69  rge->aInput[i].i
1d540 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cell = 0;.      
1d550 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1d560 62 42 74 72 65 65 20 26 26 20 70 4d 65 72 67 65  bBtree && pMerge
1d570 2d 3e 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20  ->nInput ){.    
1d580 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 43 73    assert( i==pCs
1d590 72 2d 3e 6e 50 74 72 20 29 3b 0a 20 20 20 20 20  r->nPtr );.     
1d5a0 20 62 74 72 65 65 43 75 72 73 6f 72 50 6f 73 69   btreeCursorPosi
1d5b0 74 69 6f 6e 28 70 43 73 72 2d 3e 70 42 74 43 73  tion(pCsr->pBtCs
1d5c0 72 2c 20 26 70 4d 65 72 67 65 2d 3e 61 49 6e 70  r, &pMerge->aInp
1d5d0 75 74 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20  ut[i]);.    }.. 
1d5e0 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
1d5f0 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  location of the 
1d600 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 20 20 20  split-key */.   
1d610 20 69 50 74 72 20 3d 20 70 43 73 72 2d 3e 61 54   iPtr = pCsr->aT
1d620 72 65 65 5b 31 5d 20 2d 20 43 55 52 53 4f 52 5f  ree[1] - CURSOR_
1d630 44 41 54 41 5f 53 45 47 4d 45 4e 54 3b 0a 20 20  DATA_SEGMENT;.  
1d640 20 20 69 66 28 20 69 50 74 72 3c 70 43 73 72 2d    if( iPtr<pCsr-
1d650 3e 6e 50 74 72 20 29 7b 0a 20 20 20 20 20 20 70  >nPtr ){.      p
1d660 4d 65 72 67 65 2d 3e 73 70 6c 69 74 6b 65 79 20  Merge->splitkey 
1d670 3d 20 70 4d 65 72 67 65 2d 3e 61 49 6e 70 75 74  = pMerge->aInput
1d680 5b 69 50 74 72 5d 3b 0a 20 20 20 20 7d 65 6c 73  [iPtr];.    }els
1d690 65 7b 0a 20 20 20 20 20 20 62 74 72 65 65 43 75  e{.      btreeCu
1d6a0 72 73 6f 72 53 70 6c 69 74 6b 65 79 28 70 43 73  rsorSplitkey(pCs
1d6b0 72 2d 3e 70 42 74 43 73 72 2c 20 26 70 4d 65 72  r->pBtCsr, &pMer
1d6c0 67 65 2d 3e 73 70 6c 69 74 6b 65 79 29 3b 0a 20  ge->splitkey);. 
1d6d0 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 70 4d     }.    .    pM
1d6e0 65 72 67 65 2d 3e 69 4f 75 74 70 75 74 4f 66 66  erge->iOutputOff
1d6f0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 6c 73   = -1;.  }..  ls
1d700 6d 4d 43 75 72 73 6f 72 43 6c 6f 73 65 28 70 43  mMCursorClose(pC
1d710 73 72 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 65  sr, 0);..  /* Pe
1d720 72 73 69 73 74 20 61 6e 64 20 72 65 6c 65 61 73  rsist and releas
1d730 65 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 67  e the output pag
1d740 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  e. */.  if( rc==
1d750 4c 53 4d 5f 4f 4b 20 29 20 72 63 20 3d 20 6d 65  LSM_OK ) rc = me
1d760 72 67 65 57 6f 72 6b 65 72 50 65 72 73 69 73 74  rgeWorkerPersist
1d770 41 6e 64 52 65 6c 65 61 73 65 28 70 4d 57 29 3b  AndRelease(pMW);
1d780 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f  .  if( rc==LSM_O
1d790 4b 20 29 20 72 63 20 3d 20 6d 65 72 67 65 57 6f  K ) rc = mergeWo
1d7a0 72 6b 65 72 42 74 72 65 65 49 6e 64 69 72 65 63  rkerBtreeIndirec
1d7b0 74 28 70 4d 57 29 3b 0a 20 20 69 66 28 20 72 63  t(pMW);.  if( rc
1d7c0 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 72 63 20 3d 20  ==LSM_OK ) rc = 
1d7d0 6d 65 72 67 65 57 6f 72 6b 65 72 46 69 6e 69 73  mergeWorkerFinis
1d7e0 68 48 69 65 72 61 72 63 68 79 28 70 4d 57 29 3b  hHierarchy(pMW);
1d7f0 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f  .  if( rc==LSM_O
1d800 4b 20 29 20 72 63 20 3d 20 6d 65 72 67 65 57 6f  K ) rc = mergeWo
1d810 72 6b 65 72 41 64 64 50 61 64 64 69 6e 67 28 70  rkerAddPadding(p
1d820 4d 57 29 3b 0a 20 20 6c 73 6d 46 73 46 6c 75 73  MW);.  lsmFsFlus
1d830 68 57 61 69 74 69 6e 67 28 70 4d 57 2d 3e 70 44  hWaiting(pMW->pD
1d840 62 2d 3e 70 46 53 2c 20 26 72 63 29 3b 0a 20 20  b->pFS, &rc);.  
1d850 6d 65 72 67 65 57 6f 72 6b 65 72 52 65 6c 65 61  mergeWorkerRelea
1d860 73 65 41 6c 6c 28 70 4d 57 29 3b 0a 0a 20 20 6c  seAll(pMW);..  l
1d870 73 6d 46 72 65 65 28 70 4d 57 2d 3e 70 44 62 2d  smFree(pMW->pDb-
1d880 3e 70 45 6e 76 2c 20 70 4d 57 2d 3e 61 47 6f 62  >pEnv, pMW->aGob
1d890 62 6c 65 29 3b 0a 20 20 70 4d 57 2d 3e 61 47 6f  ble);.  pMW->aGo
1d8a0 62 62 6c 65 20 3d 20 30 3b 0a 20 20 70 4d 57 2d  bble = 0;.  pMW-
1d8b0 3e 70 43 73 72 20 3d 20 30 3b 0a 0a 20 20 2a 70  >pCsr = 0;..  *p
1d8c0 52 63 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rc = rc;.}../*.*
1d8d0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
1d8e0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1d8f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 62 65 69   argument is bei
1d900 6e 67 20 75 73 65 64 20 61 73 20 74 68 65 20 69  ng used as the i
1d910 6e 70 75 74 20 66 6f 72 0a 2a 2a 20 61 20 6d 65  nput for.** a me
1d920 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 57  rge operation. W
1d930 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1d940 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 69  n is called, *pi
1d950 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 74  Flags contains t
1d960 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 65  he.** database e
1d970 6e 74 72 79 20 66 6c 61 67 73 20 66 6f 72 20 74  ntry flags for t
1d980 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
1d990 2e 20 54 68 65 20 65 6e 74 72 79 20 61 62 6f 75  . The entry abou
1d9a0 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 0a  t to be written.
1d9b0 2a 2a 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ** to the output
1d9c0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1d9d0 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
1d9e0 6f 6e 6c 79 20 68 61 73 20 74 6f 20 77 6f 72 6b  only has to work
1d9f0 20 66 6f 72 20 63 75 72 73 6f 72 73 20 63 6f 6e   for cursors con
1da00 66 69 67 75 72 65 64 20 74 6f 20 0a 2a 2a 20 69  figured to .** i
1da10 74 65 72 61 74 65 20 66 6f 72 77 61 72 64 73 20  terate forwards 
1da20 28 6e 6f 74 20 62 61 63 6b 77 61 72 64 73 29 2e  (not backwards).
1da30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1da40 6d 65 72 67 65 52 61 6e 67 65 44 65 6c 65 74 65  mergeRangeDelete
1da50 73 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70  s(MultiCursor *p
1da60 43 73 72 2c 20 69 6e 74 20 2a 70 69 56 61 6c 2c  Csr, int *piVal,
1da70 20 69 6e 74 20 2a 70 69 46 6c 61 67 73 29 7b 0a   int *piFlags){.
1da80 20 20 69 6e 74 20 66 20 3d 20 2a 70 69 46 6c 61    int f = *piFla
1da90 67 73 3b 0a 20 20 69 6e 74 20 69 4b 65 79 20 3d  gs;.  int iKey =
1daa0 20 70 43 73 72 2d 3e 61 54 72 65 65 5b 31 5d 3b   pCsr->aTree[1];
1dab0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
1dac0 65 72 74 28 20 70 43 73 72 2d 3e 66 6c 61 67 73  ert( pCsr->flags
1dad0 20 26 20 43 55 52 53 4f 52 5f 4e 45 58 54 5f 4f   & CURSOR_NEXT_O
1dae0 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 73 72 2d  K );.  if( pCsr-
1daf0 3e 66 6c 61 67 73 20 26 20 43 55 52 53 4f 52 5f  >flags & CURSOR_
1db00 49 47 4e 4f 52 45 5f 44 45 4c 45 54 45 20 29 7b  IGNORE_DELETE ){
1db10 0a 20 20 20 20 2f 2a 20 54 68 65 20 69 67 6e 6f  .    /* The igno
1db20 72 65 2d 64 65 6c 65 74 65 20 66 6c 61 67 20 69  re-delete flag i
1db30 73 20 73 65 74 20 77 68 65 6e 20 74 68 65 20 6f  s set when the o
1db40 75 74 70 75 74 20 6f 66 20 74 68 65 20 6d 65 72  utput of the mer
1db50 67 65 20 77 69 6c 6c 20 66 6f 72 6d 0a 20 20 20  ge will form.   
1db60 20 2a 2a 20 74 68 65 20 6f 6c 64 65 73 74 20 6c   ** the oldest l
1db70 65 76 65 6c 20 69 6e 20 74 68 65 20 64 61 74 61  evel in the data
1db80 62 61 73 65 2e 20 49 6e 20 74 68 69 73 20 63 61  base. In this ca
1db90 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  se there is no p
1dba0 6f 69 6e 74 20 69 6e 0a 20 20 20 20 2a 2a 20 72  oint in.    ** r
1dbb0 65 74 61 69 6e 69 6e 67 20 61 6e 79 20 72 61 6e  etaining any ran
1dbc0 67 65 2d 64 65 6c 65 74 65 20 66 6c 61 67 73 2e  ge-delete flags.
1dbd0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1dbe0 20 28 66 20 26 20 4c 53 4d 5f 50 4f 49 4e 54 5f   (f & LSM_POINT_
1dbf0 44 45 4c 45 54 45 29 3d 3d 30 20 29 3b 0a 20 20  DELETE)==0 );.  
1dc00 20 20 66 20 26 3d 20 7e 28 4c 53 4d 5f 53 54 41    f &= ~(LSM_STA
1dc10 52 54 5f 44 45 4c 45 54 45 7c 4c 53 4d 5f 45 4e  RT_DELETE|LSM_EN
1dc20 44 5f 44 45 4c 45 54 45 29 3b 0a 20 20 7d 65 6c  D_DELETE);.  }el
1dc30 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
1dc40 20 69 3c 28 43 55 52 53 4f 52 5f 44 41 54 41 5f   i<(CURSOR_DATA_
1dc50 53 45 47 4d 45 4e 54 20 2b 20 70 43 73 72 2d 3e  SEGMENT + pCsr->
1dc60 6e 50 74 72 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPtr); i++){.   
1dc70 20 20 20 69 66 28 20 69 21 3d 69 4b 65 79 20 29     if( i!=iKey )
1dc80 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 54  {.        int eT
1dc90 79 70 65 3b 0a 20 20 20 20 20 20 20 20 76 6f 69  ype;.        voi
1dca0 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 20 20 20  d *pKey;.       
1dcb0 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
1dcc0 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
1dcd0 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f 72 47      multiCursorG
1dce0 65 74 4b 65 79 28 70 43 73 72 2c 20 69 2c 20 26  etKey(pCsr, i, &
1dcf0 65 54 79 70 65 2c 20 26 70 4b 65 79 2c 20 26 6e  eType, &pKey, &n
1dd00 4b 65 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Key);..        i
1dd10 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
1dd20 20 20 20 20 20 72 65 73 20 3d 20 73 6f 72 74 65       res = sorte
1dd30 64 4b 65 79 43 6f 6d 70 61 72 65 28 70 43 73 72  dKeyCompare(pCsr
1dd40 2d 3e 70 44 62 2d 3e 78 43 6d 70 2c 20 0a 20 20  ->pDb->xCmp, .  
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 72 74 54 6f              rtTo
1dd60 70 69 63 28 70 43 73 72 2d 3e 65 54 79 70 65 29  pic(pCsr->eType)
1dd70 2c 20 70 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74  , pCsr->key.pDat
1dd80 61 2c 20 70 43 73 72 2d 3e 6b 65 79 2e 6e 44 61  a, pCsr->key.nDa
1dd90 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta,.            
1dda0 20 20 72 74 54 6f 70 69 63 28 65 54 79 70 65 29    rtTopic(eType)
1ddb0 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 0a 20 20 20  , pKey, nKey.   
1ddc0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1ddd0 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 3c      assert( res<
1dde0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1ddf0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
1de00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 66            if( (f
1de10 20 26 20 28 4c 53 4d 5f 49 4e 53 45 52 54 7c 4c   & (LSM_INSERT|L
1de20 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c 45 54 45 29  SM_POINT_DELETE)
1de30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1de40 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 20        if( eType 
1de50 26 20 4c 53 4d 5f 49 4e 53 45 52 54 20 29 7b 0a  & LSM_INSERT ){.
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de70 66 20 7c 3d 20 4c 53 4d 5f 49 4e 53 45 52 54 3b  f |= LSM_INSERT;
1de80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1de90 20 2a 70 69 56 61 6c 20 3d 20 69 3b 0a 20 20 20   *piVal = i;.   
1dea0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1deb0 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
1dec0 69 66 28 20 65 54 79 70 65 20 26 20 4c 53 4d 5f  if( eType & LSM_
1ded0 50 4f 49 4e 54 5f 44 45 4c 45 54 45 20 29 7b 0a  POINT_DELETE ){.
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1def0 66 20 7c 3d 20 4c 53 4d 5f 50 4f 49 4e 54 5f 44  f |= LSM_POINT_D
1df00 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 20  ELETE;.         
1df10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1df20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1df30 20 66 20 7c 3d 20 28 65 54 79 70 65 20 26 20 28   f |= (eType & (
1df40 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45 54 45 7c 4c  LSM_END_DELETE|L
1df50 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54 45 29  SM_START_DELETE)
1df60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  );.          }..
1df70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
1df80 69 4b 65 79 20 26 26 20 28 65 54 79 70 65 20 26  iKey && (eType &
1df90 20 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45 54 45 29   LSM_END_DELETE)
1dfa0 20 26 26 20 72 65 73 3c 30 20 29 7b 0a 20 20 20   && res<0 ){.   
1dfb0 20 20 20 20 20 20 20 20 20 69 66 28 20 66 20 26           if( f &
1dfc0 20 28 4c 53 4d 5f 49 4e 53 45 52 54 7c 4c 53 4d   (LSM_INSERT|LSM
1dfd0 5f 50 4f 49 4e 54 5f 44 45 4c 45 54 45 29 20 29  _POINT_DELETE) )
1dfe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1dff0 66 20 7c 3d 20 28 4c 53 4d 5f 45 4e 44 5f 44 45  f |= (LSM_END_DE
1e000 4c 45 54 45 7c 4c 53 4d 5f 53 54 41 52 54 5f 44  LETE|LSM_START_D
1e010 45 4c 45 54 45 29 3b 0a 20 20 20 20 20 20 20 20  ELETE);.        
1e020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e030 20 20 20 20 20 20 20 20 20 66 20 3d 20 30 3b 0a           f = 0;.
1e040 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1e050 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1e060 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1e080 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
1e090 28 20 28 66 20 26 20 4c 53 4d 5f 49 4e 53 45 52  ( (f & LSM_INSER
1e0a0 54 29 3d 3d 30 20 7c 7c 20 28 66 20 26 20 4c 53  T)==0 || (f & LS
1e0b0 4d 5f 50 4f 49 4e 54 5f 44 45 4c 45 54 45 29 3d  M_POINT_DELETE)=
1e0c0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66  =0 );.    if( (f
1e0d0 20 26 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c   & LSM_START_DEL
1e0e0 45 54 45 29 20 0a 20 20 20 20 20 26 26 20 28 66  ETE) .     && (f
1e0f0 20 26 20 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45 54   & LSM_END_DELET
1e100 45 29 20 0a 20 20 20 20 20 26 26 20 28 66 20 26  E) .     && (f &
1e110 20 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c 45 54   LSM_POINT_DELET
1e120 45 20 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  E ).    ){.     
1e130 20 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20   f = 0;.    }.  
1e140 7d 0a 0a 20 20 2a 70 69 46 6c 61 67 73 20 3d 20  }..  *piFlags = 
1e150 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  f;.}..static int
1e160 20 6d 65 72 67 65 57 6f 72 6b 65 72 53 74 65 70   mergeWorkerStep
1e170 28 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d  (MergeWorker *pM
1e180 57 29 7b 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44  W){.  lsm_db *pD
1e190 62 20 3d 20 70 4d 57 2d 3e 70 44 62 3b 20 20 20  b = pMW->pDb;   
1e1a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1e1b0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 4d 75 6c 74  handle */.  Mult
1e1c0 69 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 20 20  iCursor *pCsr;  
1e1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1e1e0 73 6f 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75  sor to read inpu
1e1f0 74 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20  t data from */. 
1e200 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b   int rc = LSM_OK
1e210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1e220 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1e230 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20  .  int eType;   
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e250 20 2f 2a 20 53 4f 52 54 45 44 5f 53 45 50 41 52   /* SORTED_SEPAR
1e260 41 54 4f 52 2c 20 57 52 49 54 45 20 6f 72 20 44  ATOR, WRITE or D
1e270 45 4c 45 54 45 20 2a 2f 0a 20 20 76 6f 69 64 20  ELETE */.  void 
1e280 2a 70 4b 65 79 3b 20 69 6e 74 20 6e 4b 65 79 3b  *pKey; int nKey;
1e290 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20           /* Key 
1e2a0 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 3b 0a  */.  Pgno iPtr;.
1e2b0 20 20 69 6e 74 20 69 56 61 6c 3b 0a 0a 20 20 70    int iVal;..  p
1e2c0 43 73 72 20 3d 20 70 4d 57 2d 3e 70 43 73 72 3b  Csr = pMW->pCsr;
1e2d0 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20  ..  /* Pull the 
1e2e0 6e 65 78 74 20 72 65 63 6f 72 64 20 6f 75 74 20  next record out 
1e2f0 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20 63 75  of the source cu
1e300 72 73 6f 72 2e 20 2a 2f 0a 20 20 6c 73 6d 4d 43  rsor. */.  lsmMC
1e310 75 72 73 6f 72 4b 65 79 28 70 43 73 72 2c 20 26  ursorKey(pCsr, &
1e320 70 4b 65 79 2c 20 26 6e 4b 65 79 29 3b 0a 20 20  pKey, &nKey);.  
1e330 65 54 79 70 65 20 3d 20 70 43 73 72 2d 3e 65 54  eType = pCsr->eT
1e340 79 70 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ype;..  /* Figur
1e350 65 20 6f 75 74 20 69 66 20 74 68 65 20 6f 75 74  e out if the out
1e360 70 75 74 20 72 65 63 6f 72 64 20 6d 61 79 20 68  put record may h
1e370 61 76 65 20 61 20 64 69 66 66 65 72 65 6e 74 20  ave a different 
1e380 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 0a 20 20  pointer value.  
1e390 2a 2a 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  ** than the prev
1e3a0 69 6f 75 73 2e 20 54 68 69 73 20 69 73 20 74 68  ious. This is th
1e3b0 65 20 63 61 73 65 20 69 66 20 74 68 65 20 63 75  e case if the cu
1e3c0 72 72 65 6e 74 20 6b 65 79 20 69 73 20 69 64 65  rrent key is ide
1e3d0 6e 74 69 63 61 6c 20 74 6f 0a 20 20 2a 2a 20 61  ntical to.  ** a
1e3e0 20 6b 65 79 20 74 68 61 74 20 61 70 70 65 61 72   key that appear
1e3f0 73 20 69 6e 20 74 68 65 20 6c 6f 77 65 73 74 20  s in the lowest 
1e400 6c 65 76 65 6c 20 72 75 6e 20 62 65 69 6e 67 20  level run being 
1e410 6d 65 72 67 65 64 2e 20 49 66 20 73 6f 2c 20 73  merged. If so, s
1e420 65 74 20 0a 20 20 2a 2a 20 69 50 74 72 20 74 6f  et .  ** iPtr to
1e430 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 70 6f   the absolute po
1e440 69 6e 74 65 72 20 76 61 6c 75 65 2e 20 49 66 20  inter value. If 
1e450 6e 6f 74 2c 20 6c 65 61 76 65 20 69 50 74 72 20  not, leave iPtr 
1e460 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 0a 20 20  set to zero, .  
1e470 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ** indicating th
1e480 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f  at the output po
1e490 69 6e 74 65 72 20 76 61 6c 75 65 20 73 68 6f 75  inter value shou
1e4a0 6c 64 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  ld be a copy of 
1e4b0 74 68 65 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a  the pointer .  *
1e4c0 2a 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20  * value written 
1e4d0 77 69 74 68 20 74 68 65 20 70 72 65 76 69 6f 75  with the previou
1e4e0 73 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 69 50 74  s key.  */.  iPt
1e4f0 72 20 3d 20 28 70 43 73 72 2d 3e 70 50 72 65 76  r = (pCsr->pPrev
1e500 4d 65 72 67 65 50 74 72 20 3f 20 2a 70 43 73 72  MergePtr ? *pCsr
1e510 2d 3e 70 50 72 65 76 4d 65 72 67 65 50 74 72 20  ->pPrevMergePtr 
1e520 3a 20 30 29 3b 0a 20 20 69 66 28 20 70 43 73 72  : 0);.  if( pCsr
1e530 2d 3e 70 42 74 43 73 72 20 29 7b 0a 20 20 20 20  ->pBtCsr ){.    
1e540 42 74 72 65 65 43 75 72 73 6f 72 20 2a 70 42 74  BtreeCursor *pBt
1e550 43 73 72 20 3d 20 70 43 73 72 2d 3e 70 42 74 43  Csr = pCsr->pBtC
1e560 73 72 3b 0a 20 20 20 20 69 66 28 20 70 42 74 43  sr;.    if( pBtC
1e570 73 72 2d 3e 70 4b 65 79 20 29 7b 0a 20 20 20 20  sr->pKey ){.    
1e580 20 20 69 6e 74 20 72 65 73 20 3d 20 72 74 54 6f    int res = rtTo
1e590 70 69 63 28 70 42 74 43 73 72 2d 3e 65 54 79 70  pic(pBtCsr->eTyp
1e5a0 65 29 20 2d 20 72 74 54 6f 70 69 63 28 65 54 79  e) - rtTopic(eTy
1e5b0 70 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  pe);.      if( r
1e5c0 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 70 44  es==0 ) res = pD
1e5d0 62 2d 3e 78 43 6d 70 28 70 42 74 43 73 72 2d 3e  b->xCmp(pBtCsr->
1e5e0 70 4b 65 79 2c 20 70 42 74 43 73 72 2d 3e 6e 4b  pKey, pBtCsr->nK
1e5f0 65 79 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b  ey, pKey, nKey);
1e600 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 72 65  .      if( 0==re
1e610 73 20 29 20 69 50 74 72 20 3d 20 70 42 74 43 73  s ) iPtr = pBtCs
1e620 72 2d 3e 69 50 74 72 3b 0a 20 20 20 20 20 20 61  r->iPtr;.      a
1e630 73 73 65 72 74 28 20 72 65 73 3e 3d 30 20 29 3b  ssert( res>=0 );
1e640 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1e650 66 28 20 70 43 73 72 2d 3e 6e 50 74 72 20 29 7b  f( pCsr->nPtr ){
1e660 0a 20 20 20 20 53 65 67 6d 65 6e 74 50 74 72 20  .    SegmentPtr 
1e670 2a 70 50 74 72 20 3d 20 26 70 43 73 72 2d 3e 61  *pPtr = &pCsr->a
1e680 50 74 72 5b 70 43 73 72 2d 3e 6e 50 74 72 2d 31  Ptr[pCsr->nPtr-1
1e690 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 74 72 2d  ];.    if( pPtr-
1e6a0 3e 70 50 67 0a 20 20 20 20 20 26 26 20 30 3d 3d  >pPg.     && 0==
1e6b0 70 44 62 2d 3e 78 43 6d 70 28 70 50 74 72 2d 3e  pDb->xCmp(pPtr->
1e6c0 70 4b 65 79 2c 20 70 50 74 72 2d 3e 6e 4b 65 79  pKey, pPtr->nKey
1e6d0 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 0a 20 20  , pKey, nKey).  
1e6e0 20 20 29 7b 0a 20 20 20 20 20 20 69 50 74 72 20    ){.      iPtr 
1e6f0 3d 20 70 50 74 72 2d 3e 69 50 74 72 2b 70 50 74  = pPtr->iPtr+pPt
1e700 72 2d 3e 69 50 67 50 74 72 3b 0a 20 20 20 20 7d  r->iPgPtr;.    }
1e710 0a 20 20 7d 0a 0a 20 20 69 56 61 6c 20 3d 20 70  .  }..  iVal = p
1e720 43 73 72 2d 3e 61 54 72 65 65 5b 31 5d 3b 0a 20  Csr->aTree[1];. 
1e730 20 6d 65 72 67 65 52 61 6e 67 65 44 65 6c 65 74   mergeRangeDelet
1e740 65 73 28 70 43 73 72 2c 20 26 69 56 61 6c 2c 20  es(pCsr, &iVal, 
1e750 26 65 54 79 70 65 29 3b 0a 0a 20 20 69 66 28 20  &eType);..  if( 
1e760 65 54 79 70 65 21 3d 30 20 29 7b 0a 20 20 20 20  eType!=0 ){.    
1e770 69 66 28 20 70 4d 57 2d 3e 61 47 6f 62 62 6c 65  if( pMW->aGobble
1e780 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 47   ){.      int iG
1e790 6f 62 62 6c 65 20 3d 20 70 43 73 72 2d 3e 61 54  obble = pCsr->aT
1e7a0 72 65 65 5b 31 5d 20 2d 20 43 55 52 53 4f 52 5f  ree[1] - CURSOR_
1e7b0 44 41 54 41 5f 53 45 47 4d 45 4e 54 3b 0a 20 20  DATA_SEGMENT;.  
1e7c0 20 20 20 20 69 66 28 20 69 47 6f 62 62 6c 65 3c      if( iGobble<
1e7d0 70 43 73 72 2d 3e 6e 50 74 72 20 26 26 20 69 47  pCsr->nPtr && iG
1e7e0 6f 62 62 6c 65 3e 3d 30 20 29 7b 0a 20 20 20 20  obble>=0 ){.    
1e7f0 20 20 20 20 53 65 67 6d 65 6e 74 50 74 72 20 2a      SegmentPtr *
1e800 70 47 6f 62 62 6c 65 20 3d 20 26 70 43 73 72 2d  pGobble = &pCsr-
1e810 3e 61 50 74 72 5b 69 47 6f 62 62 6c 65 5d 3b 0a  >aPtr[iGobble];.
1e820 20 20 20 20 20 20 20 20 69 66 28 20 28 70 47 6f          if( (pGo
1e830 62 62 6c 65 2d 3e 66 6c 61 67 73 20 26 20 50 47  bble->flags & PG
1e840 46 54 52 5f 53 4b 49 50 5f 54 48 49 53 5f 46 4c  FTR_SKIP_THIS_FL
1e850 41 47 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AG)==0 ){.      
1e860 20 20 20 20 70 4d 57 2d 3e 61 47 6f 62 62 6c 65      pMW->aGobble
1e870 5b 69 47 6f 62 62 6c 65 5d 20 3d 20 6c 73 6d 46  [iGobble] = lsmF
1e880 73 50 61 67 65 4e 75 6d 62 65 72 28 70 47 6f 62  sPageNumber(pGob
1e890 62 6c 65 2d 3e 70 50 67 29 3b 0a 20 20 20 20 20  ble->pPg);.     
1e8a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e8b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1e8c0 69 73 20 69 73 20 61 20 73 65 70 61 72 61 74 6f  is is a separato
1e8d0 72 20 6b 65 79 20 61 6e 64 20 77 65 20 6b 6e 6f  r key and we kno
1e8e0 77 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  w that the outpu
1e8f0 74 20 70 6f 69 6e 74 65 72 20 68 61 73 20 6e 6f  t pointer has no
1e900 74 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 64  t.    ** changed
1e910 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  , there is no po
1e920 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 20 61  int in writing a
1e930 6e 20 6f 75 74 70 75 74 20 72 65 63 6f 72 64 2e  n output record.
1e940 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   Otherwise,.    
1e950 2a 2a 20 70 72 6f 63 65 65 64 2e 20 2a 2f 0a 20  ** proceed. */. 
1e960 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
1e970 4b 20 26 26 20 28 72 74 49 73 53 65 70 61 72 61  K && (rtIsSepara
1e980 74 6f 72 28 65 54 79 70 65 29 3d 3d 30 20 7c 7c  tor(eType)==0 ||
1e990 20 69 50 74 72 21 3d 30 29 20 29 7b 0a 20 20 20   iPtr!=0) ){.   
1e9a0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1e9b0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
1e9c0 6d 61 69 6e 20 72 75 6e 2e 20 2a 2f 0a 20 20 20  main run. */.   
1e9d0 20 20 20 76 6f 69 64 20 2a 70 56 61 6c 3b 20 69     void *pVal; i
1e9e0 6e 74 20 6e 56 61 6c 3b 0a 20 20 20 20 20 20 72  nt nVal;.      r
1e9f0 63 20 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72 47  c = multiCursorG
1ea00 65 74 56 61 6c 28 70 43 73 72 2c 20 69 56 61 6c  etVal(pCsr, iVal
1ea10 2c 20 26 70 56 61 6c 2c 20 26 6e 56 61 6c 29 3b  , &pVal, &nVal);
1ea20 0a 20 20 20 20 20 20 69 66 28 20 70 56 61 6c 20  .      if( pVal 
1ea30 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  && rc==LSM_OK ){
1ea40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1ea50 20 6e 56 61 6c 3e 3d 30 20 29 3b 0a 20 20 20 20   nVal>=0 );.    
1ea60 20 20 20 20 72 63 20 3d 20 73 6f 72 74 65 64 42      rc = sortedB
1ea70 6c 6f 62 53 65 74 28 70 44 62 2d 3e 70 45 6e 76  lobSet(pDb->pEnv
1ea80 2c 20 26 70 43 73 72 2d 3e 76 61 6c 2c 20 70 56  , &pCsr->val, pV
1ea90 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20 20 20 20  al, nVal);.     
1eaa0 20 20 20 70 56 61 6c 20 3d 20 70 43 73 72 2d 3e     pVal = pCsr->
1eab0 76 61 6c 2e 70 44 61 74 61 3b 0a 20 20 20 20 20  val.pData;.     
1eac0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1ead0 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =LSM_OK ){.     
1eae0 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57 6f 72     rc = mergeWor
1eaf0 6b 65 72 57 72 69 74 65 28 70 4d 57 2c 20 65 54  kerWrite(pMW, eT
1eb00 79 70 65 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  ype, pKey, nKey,
1eb10 20 70 56 61 6c 2c 20 6e 56 61 6c 2c 20 69 50 74   pVal, nVal, iPt
1eb20 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1eb30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 76 61  }.  }..  /* Adva
1eb40 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
1eb50 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 70 75 74  o the next input
1eb60 20 72 65 63 6f 72 64 20 28 61 73 73 75 6d 69 6e   record (assumin
1eb70 67 20 6f 6e 65 20 65 78 69 73 74 73 29 2e 20 2a  g one exists). *
1eb80 2f 0a 20 20 61 73 73 65 72 74 28 20 6c 73 6d 4d  /.  assert( lsmM
1eb90 43 75 72 73 6f 72 56 61 6c 69 64 28 70 4d 57 2d  CursorValid(pMW-
1eba0 3e 70 43 73 72 29 20 29 3b 0a 20 20 69 66 28 20  >pCsr) );.  if( 
1ebb0 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 72 63 20  rc==LSM_OK ) rc 
1ebc0 3d 20 6c 73 6d 4d 43 75 72 73 6f 72 4e 65 78 74  = lsmMCursorNext
1ebd0 28 70 4d 57 2d 3e 70 43 73 72 29 3b 0a 0a 20 20  (pMW->pCsr);..  
1ebe0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
1ebf0 61 74 69 63 20 69 6e 74 20 6d 65 72 67 65 57 6f  atic int mergeWo
1ec00 72 6b 65 72 44 6f 6e 65 28 4d 65 72 67 65 57 6f  rkerDone(MergeWo
1ec10 72 6b 65 72 20 2a 70 4d 57 29 7b 0a 20 20 72 65  rker *pMW){.  re
1ec20 74 75 72 6e 20 70 4d 57 2d 3e 70 43 73 72 3d 3d  turn pMW->pCsr==
1ec30 30 20 7c 7c 20 21 6c 73 6d 4d 43 75 72 73 6f 72  0 || !lsmMCursor
1ec40 56 61 6c 69 64 28 70 4d 57 2d 3e 70 43 73 72 29  Valid(pMW->pCsr)
1ec50 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1ec60 20 73 6f 72 74 65 64 46 72 65 65 4c 65 76 65 6c   sortedFreeLevel
1ec70 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20  (lsm_env *pEnv, 
1ec80 4c 65 76 65 6c 20 2a 70 29 7b 0a 20 20 69 66 28  Level *p){.  if(
1ec90 20 70 20 29 7b 0a 20 20 20 20 6c 73 6d 46 72 65   p ){.    lsmFre
1eca0 65 28 70 45 6e 76 2c 20 70 2d 3e 70 53 70 6c 69  e(pEnv, p->pSpli
1ecb0 74 4b 65 79 29 3b 0a 20 20 20 20 6c 73 6d 46 72  tKey);.    lsmFr
1ecc0 65 65 28 70 45 6e 76 2c 20 70 2d 3e 70 4d 65 72  ee(pEnv, p->pMer
1ecd0 67 65 29 3b 0a 20 20 20 20 6c 73 6d 46 72 65 65  ge);.    lsmFree
1ece0 28 70 45 6e 76 2c 20 70 2d 3e 61 52 68 73 29 3b  (pEnv, p->aRhs);
1ecf0 0a 20 20 20 20 6c 73 6d 46 72 65 65 28 70 45 6e  .    lsmFree(pEn
1ed00 76 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  v, p);.  }.}..st
1ed10 61 74 69 63 20 76 6f 69 64 20 73 6f 72 74 65 64  atic void sorted
1ed20 49 6e 76 6f 6b 65 57 6f 72 6b 48 6f 6f 6b 28 6c  InvokeWorkHook(l
1ed30 73 6d 5f 64 62 20 2a 70 44 62 29 7b 0a 20 20 69  sm_db *pDb){.  i
1ed40 66 28 20 70 44 62 2d 3e 78 57 6f 72 6b 20 29 7b  f( pDb->xWork ){
1ed50 0a 20 20 20 20 70 44 62 2d 3e 78 57 6f 72 6b 28  .    pDb->xWork(
1ed60 70 44 62 2c 20 70 44 62 2d 3e 70 57 6f 72 6b 43  pDb, pDb->pWorkC
1ed70 74 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  tx);.  }.}..stat
1ed80 69 63 20 69 6e 74 20 73 6f 72 74 65 64 4e 65 77  ic int sortedNew
1ed90 54 6f 70 6c 65 76 65 6c 28 0a 20 20 6c 73 6d 5f  Toplevel(.  lsm_
1eda0 64 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20  db *pDb,        
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1edc0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
1edd0 20 2a 2f 0a 20 20 69 6e 74 20 65 54 72 65 65 2c   */.  int eTree,
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
1ee00 74 68 65 20 54 52 45 45 5f 58 58 58 20 63 6f 6e  the TREE_XXX con
1ee10 73 74 61 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  stants */.  int 
1ee20 2a 70 6e 57 72 69 74 65 20 20 20 20 20 20 20 20  *pnWrite        
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1ee40 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61  UT: Number of da
1ee50 74 61 62 61 73 65 20 70 61 67 65 73 20 77 72 69  tabase pages wri
1ee60 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tten */.){.  int
1ee70 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20   rc = LSM_OK;   
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ee90 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
1eea0 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43   MultiCursor *pC
1eeb0 73 72 20 3d 20 30 3b 0a 20 20 4c 65 76 65 6c 20  sr = 0;.  Level 
1eec0 2a 70 4e 65 78 74 20 3d 20 30 3b 20 20 20 20 20  *pNext = 0;     
1eed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1eee0 20 63 75 72 72 65 6e 74 20 74 6f 70 20 6c 65 76   current top lev
1eef0 65 6c 20 2a 2f 0a 20 20 4c 65 76 65 6c 20 2a 70  el */.  Level *p
1ef00 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
1ef10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1ef20 65 77 20 6c 65 76 65 6c 20 69 74 73 65 6c 66 20  ew level itself 
1ef30 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 20 2a 70 4c  */.  Segment *pL
1ef40 69 6e 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20  inked = 0;      
1ef50 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73       /* Delete s
1ef60 65 70 61 72 61 74 6f 72 73 20 66 72 6f 6d 20 74  eparators from t
1ef70 68 69 73 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  his segment */. 
1ef80 20 4c 65 76 65 6c 20 2a 70 44 65 6c 20 3d 20 30   Level *pDel = 0
1ef90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1efa0 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 69 73 20   /* Delete this 
1efb0 65 6e 74 69 72 65 20 6c 65 76 65 6c 20 2a 2f 0a  entire level */.
1efc0 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
1efd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1efe0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
1eff0 61 74 61 62 61 73 65 20 70 61 67 65 73 20 77 72  atabase pages wr
1f000 69 74 74 65 6e 20 2a 2f 0a 20 20 46 72 65 65 6c  itten */.  Freel
1f010 69 73 74 20 66 72 65 65 6c 69 73 74 3b 0a 0a 20  ist freelist;.. 
1f020 20 69 66 28 20 65 54 72 65 65 21 3d 54 52 45 45   if( eTree!=TREE
1f030 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 72 63 20  _NONE ){.    rc 
1f040 3d 20 6c 73 6d 53 68 6d 43 61 63 68 65 43 68 75  = lsmShmCacheChu
1f050 6e 6b 73 28 70 44 62 2c 20 70 44 62 2d 3e 74 72  nks(pDb, pDb->tr
1f060 65 65 68 64 72 2e 6e 43 68 75 6e 6b 29 3b 0a 20  eehdr.nChunk);. 
1f070 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44   }..  assert( pD
1f080 62 2d 3e 62 55 73 65 46 72 65 65 6c 69 73 74 3d  b->bUseFreelist=
1f090 3d 30 20 29 3b 0a 20 20 70 44 62 2d 3e 70 46 72  =0 );.  pDb->pFr
1f0a0 65 65 6c 69 73 74 20 3d 20 26 66 72 65 65 6c 69  eelist = &freeli
1f0b0 73 74 3b 0a 20 20 70 44 62 2d 3e 62 55 73 65 46  st;.  pDb->bUseF
1f0c0 72 65 65 6c 69 73 74 20 3d 20 31 3b 0a 20 20 6d  reelist = 1;.  m
1f0d0 65 6d 73 65 74 28 26 66 72 65 65 6c 69 73 74 2c  emset(&freelist,
1f0e0 20 30 2c 20 73 69 7a 65 6f 66 28 66 72 65 65 6c   0, sizeof(freel
1f0f0 69 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ist));..  /* All
1f100 6f 63 61 74 65 20 74 68 65 20 6e 65 77 20 6c 65  ocate the new le
1f110 76 65 6c 20 73 74 72 75 63 74 75 72 65 20 74 6f  vel structure to
1f120 20 77 72 69 74 65 20 74 6f 2e 20 2a 2f 0a 20 20   write to. */.  
1f130 70 4e 65 78 74 20 3d 20 6c 73 6d 44 62 53 6e 61  pNext = lsmDbSna
1f140 70 73 68 6f 74 4c 65 76 65 6c 28 70 44 62 2d 3e  pshotLevel(pDb->
1f150 70 57 6f 72 6b 65 72 29 3b 0a 20 20 70 4e 65 77  pWorker);.  pNew
1f160 20 3d 20 28 4c 65 76 65 6c 20 2a 29 6c 73 6d 4d   = (Level *)lsmM
1f170 61 6c 6c 6f 63 5a 65 72 6f 52 63 28 70 44 62 2d  allocZeroRc(pDb-
1f180 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28 4c 65  >pEnv, sizeof(Le
1f190 76 65 6c 29 2c 20 26 72 63 29 3b 0a 20 20 69 66  vel), &rc);.  if
1f1a0 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e  ( pNew ){.    pN
1f1b0 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78  ew->pNext = pNex
1f1c0 74 3b 0a 20 20 20 20 6c 73 6d 44 62 53 6e 61 70  t;.    lsmDbSnap
1f1d0 73 68 6f 74 53 65 74 4c 65 76 65 6c 28 70 44 62  shotSetLevel(pDb
1f1e0 2d 3e 70 57 6f 72 6b 65 72 2c 20 70 4e 65 77 29  ->pWorker, pNew)
1f1f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61  ;.  }..  /* Crea
1f200 74 65 20 61 20 63 75 72 73 6f 72 20 74 6f 20 67  te a cursor to g
1f210 61 74 68 65 72 20 74 68 65 20 64 61 74 61 20 72  ather the data r
1f220 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 6e  equired by the n
1f230 65 77 20 73 65 67 6d 65 6e 74 2e 20 54 68 65 20  ew segment. The 
1f240 6e 65 77 0a 20 20 2a 2a 20 73 65 67 6d 65 6e 74  new.  ** segment
1f250 20 63 6f 6e 74 61 69 6e 73 20 65 76 65 72 79 74   contains everyt
1f260 68 69 6e 67 20 69 6e 20 74 68 65 20 74 72 65 65  hing in the tree
1f270 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 20 74 6f   and pointers to
1f280 20 74 68 65 20 6e 65 78 74 20 73 65 67 6d 65 6e   the next segmen
1f290 74 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61  t.  ** in the da
1f2a0 74 61 62 61 73 65 20 28 69 66 20 61 6e 79 29 2e  tabase (if any).
1f2b0 20 20 2a 2f 0a 20 20 70 43 73 72 20 3d 20 6d 75    */.  pCsr = mu
1f2c0 6c 74 69 43 75 72 73 6f 72 4e 65 77 28 70 44 62  ltiCursorNew(pDb
1f2d0 2c 20 26 72 63 29 3b 0a 20 20 69 66 28 20 70 43  , &rc);.  if( pC
1f2e0 73 72 20 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e  sr ){.    pCsr->
1f2f0 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 20 20 72  pDb = pDb;.    r
1f300 63 20 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72 56  c = multiCursorV
1f310 69 73 69 74 46 72 65 65 6c 69 73 74 28 70 43 73  isitFreelist(pCs
1f320 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
1f330 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  LSM_OK ){.      
1f340 72 63 20 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72  rc = multiCursor
1f350 41 64 64 54 72 65 65 28 70 43 73 72 2c 20 70 44  AddTree(pCsr, pD
1f360 62 2d 3e 70 57 6f 72 6b 65 72 2c 20 65 54 72 65  b->pWorker, eTre
1f370 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
1f380 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20  ( rc==LSM_OK && 
1f390 70 4e 65 78 74 20 26 26 20 70 4e 65 78 74 2d 3e  pNext && pNext->
1f3a0 70 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20  pMerge==0 ){.   
1f3b0 20 20 20 69 66 28 20 28 70 4e 65 78 74 2d 3e 66     if( (pNext->f
1f3c0 6c 61 67 73 20 26 20 4c 45 56 45 4c 5f 46 52 45  lags & LEVEL_FRE
1f3d0 45 4c 49 53 54 5f 4f 4e 4c 59 29 20 29 7b 0a 20  ELIST_ONLY) ){. 
1f3e0 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4e         pDel = pN
1f3f0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 43 73  ext;.        pCs
1f400 72 2d 3e 61 50 74 72 20 3d 20 6c 73 6d 4d 61 6c  r->aPtr = lsmMal
1f410 6c 6f 63 5a 65 72 6f 52 63 28 70 44 62 2d 3e 70  locZeroRc(pDb->p
1f420 45 6e 76 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d  Env, sizeof(Segm
1f430 65 6e 74 50 74 72 29 2c 20 26 72 63 29 3b 0a 20  entPtr), &rc);. 
1f440 20 20 20 20 20 20 20 6d 75 6c 74 69 43 75 72 73         multiCurs
1f450 6f 72 41 64 64 4f 6e 65 28 70 43 73 72 2c 20 70  orAddOne(pCsr, p
1f460 4e 65 78 74 2c 20 26 72 63 29 3b 0a 20 20 20 20  Next, &rc);.    
1f470 20 20 7d 65 6c 73 65 20 69 66 28 20 65 54 72 65    }else if( eTre
1f480 65 21 3d 54 52 45 45 5f 4e 4f 4e 45 20 26 26 20  e!=TREE_NONE && 
1f490 70 4e 65 78 74 2d 3e 6c 68 73 2e 69 52 6f 6f 74  pNext->lhs.iRoot
1f4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 6e   ){.        pLin
1f4b0 6b 65 64 20 3d 20 26 70 4e 65 78 74 2d 3e 6c 68  ked = &pNext->lh
1f4c0 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
1f4d0 62 74 72 65 65 43 75 72 73 6f 72 4e 65 77 28 70  btreeCursorNew(p
1f4e0 44 62 2c 20 70 4c 69 6e 6b 65 64 2c 20 26 70 43  Db, pLinked, &pC
1f4f0 73 72 2d 3e 70 42 74 43 73 72 29 3b 0a 20 20 20  sr->pBtCsr);.   
1f500 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1f510 2f 2a 20 49 66 20 74 68 69 73 20 77 69 6c 6c 20  /* If this will 
1f520 62 65 20 74 68 65 20 6f 6e 6c 79 20 73 65 67 6d  be the only segm
1f530 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
1f540 61 73 65 2c 20 64 69 73 63 61 72 64 20 61 6e 79  ase, discard any
1f550 20 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6d   delete.    ** m
1f560 61 72 6b 65 72 73 20 70 72 65 73 65 6e 74 20 69  arkers present i
1f570 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
1f580 74 72 65 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  tree.  */.    if
1f590 28 20 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20  ( pNext==0 ){.  
1f5a0 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f 72 49      multiCursorI
1f5b0 67 6e 6f 72 65 44 65 6c 65 74 65 28 70 43 73 72  gnoreDelete(pCsr
1f5c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1f5d0 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29  if( rc!=LSM_OK )
1f5e0 7b 0a 20 20 20 20 6c 73 6d 4d 43 75 72 73 6f 72  {.    lsmMCursor
1f5f0 43 6c 6f 73 65 28 70 43 73 72 2c 20 30 29 3b 0a  Close(pCsr, 0);.
1f600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1f610 6f 20 69 4c 65 66 74 50 74 72 20 3d 20 30 3b 0a  o iLeftPtr = 0;.
1f620 20 20 20 20 4d 65 72 67 65 20 6d 65 72 67 65 3b      Merge merge;
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f640 20 20 2f 2a 20 4d 65 72 67 65 20 6f 62 6a 65 63    /* Merge objec
1f650 74 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  t used to create
1f660 20 6e 65 77 20 6c 65 76 65 6c 20 2a 2f 0a 20 20   new level */.  
1f670 20 20 4d 65 72 67 65 57 6f 72 6b 65 72 20 6d 65    MergeWorker me
1f680 72 67 65 77 6f 72 6b 65 72 3b 20 20 20 20 20 20  rgeworker;      
1f690 2f 2a 20 4d 65 72 67 65 57 6f 72 6b 65 72 20 6f  /* MergeWorker o
1f6a0 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 73 61  bject for the sa
1f6b0 6d 65 20 70 75 72 70 6f 73 65 20 2a 2f 0a 0a 20  me purpose */.. 
1f6c0 20 20 20 6d 65 6d 73 65 74 28 26 6d 65 72 67 65     memset(&merge
1f6d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4d 65 72 67  , 0, sizeof(Merg
1f6e0 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  e));.    memset(
1f6f0 26 6d 65 72 67 65 77 6f 72 6b 65 72 2c 20 30 2c  &mergeworker, 0,
1f700 20 73 69 7a 65 6f 66 28 4d 65 72 67 65 57 6f 72   sizeof(MergeWor
1f710 6b 65 72 29 29 3b 0a 0a 20 20 20 20 70 4e 65 77  ker));..    pNew
1f720 2d 3e 70 4d 65 72 67 65 20 3d 20 26 6d 65 72 67  ->pMerge = &merg
1f730 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  e;.    pNew->fla
1f740 67 73 20 7c 3d 20 4c 45 56 45 4c 5f 49 4e 43 4f  gs |= LEVEL_INCO
1f750 4d 50 4c 45 54 45 3b 0a 20 20 20 20 6d 65 72 67  MPLETE;.    merg
1f760 65 77 6f 72 6b 65 72 2e 70 44 62 20 3d 20 70 44  eworker.pDb = pD
1f770 62 3b 0a 20 20 20 20 6d 65 72 67 65 77 6f 72 6b  b;.    mergework
1f780 65 72 2e 70 4c 65 76 65 6c 20 3d 20 70 4e 65 77  er.pLevel = pNew
1f790 3b 0a 20 20 20 20 6d 65 72 67 65 77 6f 72 6b 65  ;.    mergeworke
1f7a0 72 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20  r.pCsr = pCsr;. 
1f7b0 20 20 20 70 43 73 72 2d 3e 70 50 72 65 76 4d 65     pCsr->pPrevMe
1f7c0 72 67 65 50 74 72 20 3d 20 26 69 4c 65 66 74 50  rgePtr = &iLeftP
1f7d0 74 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72 6b  tr;..    /* Mark
1f7e0 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 73 20   the separators 
1f7f0 61 72 72 61 79 20 66 6f 72 20 74 68 65 20 6e 65  array for the ne
1f800 77 20 6c 65 76 65 6c 20 61 73 20 61 20 22 70 68  w level as a "ph
1f810 61 6e 74 6f 6d 22 2e 20 2a 2f 0a 20 20 20 20 6d  antom". */.    m
1f820 65 72 67 65 77 6f 72 6b 65 72 2e 62 46 6c 75 73  ergeworker.bFlus
1f830 68 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 44  h = 1;..    /* D
1f840 6f 20 74 68 65 20 77 6f 72 6b 20 74 6f 20 63 72  o the work to cr
1f850 65 61 74 65 20 74 68 65 20 6e 65 77 20 6d 65 72  eate the new mer
1f860 67 65 64 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64  ged segment on d
1f870 69 73 6b 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  isk */.    if( r
1f880 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 72 63 20 3d  c==LSM_OK ) rc =
1f890 20 6c 73 6d 4d 43 75 72 73 6f 72 46 69 72 73 74   lsmMCursorFirst
1f8a0 28 70 43 73 72 29 3b 0a 20 20 20 20 77 68 69 6c  (pCsr);.    whil
1f8b0 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  e( rc==LSM_OK &&
1f8c0 20 6d 65 72 67 65 57 6f 72 6b 65 72 44 6f 6e 65   mergeWorkerDone
1f8d0 28 26 6d 65 72 67 65 77 6f 72 6b 65 72 29 3d 3d  (&mergeworker)==
1f8e0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1f8f0 6d 65 72 67 65 57 6f 72 6b 65 72 53 74 65 70 28  mergeWorkerStep(
1f900 26 6d 65 72 67 65 77 6f 72 6b 65 72 29 3b 0a 20  &mergeworker);. 
1f910 20 20 20 7d 0a 20 20 20 20 6d 65 72 67 65 57 6f     }.    mergeWo
1f920 72 6b 65 72 53 68 75 74 64 6f 77 6e 28 26 6d 65  rkerShutdown(&me
1f930 72 67 65 77 6f 72 6b 65 72 2c 20 26 72 63 29 3b  rgeworker, &rc);
1f940 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
1f950 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 6d 65 72 67 65  =LSM_OK || merge
1f960 77 6f 72 6b 65 72 2e 6e 57 6f 72 6b 3d 3d 30 20  worker.nWork==0 
1f970 7c 7c 20 70 4e 65 77 2d 3e 6c 68 73 2e 69 46 69  || pNew->lhs.iFi
1f980 72 73 74 20 29 3b 0a 20 20 20 20 69 66 28 20 72  rst );.    if( r
1f990 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 4e 65  c==LSM_OK && pNe
1f9a0 77 2d 3e 6c 68 73 2e 69 46 69 72 73 74 20 29 7b  w->lhs.iFirst ){
1f9b0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 46  .      rc = lsmF
1f9c0 73 53 6f 72 74 65 64 46 69 6e 69 73 68 28 70 44  sSortedFinish(pD
1f9d0 62 2d 3e 70 46 53 2c 20 26 70 4e 65 77 2d 3e 6c  b->pFS, &pNew->l
1f9e0 68 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  hs);.    }.    n
1f9f0 57 72 69 74 65 20 3d 20 6d 65 72 67 65 77 6f 72  Write = mergewor
1fa00 6b 65 72 2e 6e 57 6f 72 6b 3b 0a 20 20 20 20 70  ker.nWork;.    p
1fa10 4e 65 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 4c  New->flags &= ~L
1fa20 45 56 45 4c 5f 49 4e 43 4f 4d 50 4c 45 54 45 3b  EVEL_INCOMPLETE;
1fa30 0a 20 20 20 20 69 66 28 20 65 54 72 65 65 3d 3d  .    if( eTree==
1fa40 54 52 45 45 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  TREE_NONE ){.   
1fa50 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
1fa60 3d 20 4c 45 56 45 4c 5f 46 52 45 45 4c 49 53 54  = LEVEL_FREELIST
1fa70 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
1fa80 20 70 4e 65 77 2d 3e 70 4d 65 72 67 65 20 3d 20   pNew->pMerge = 
1fa90 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  0;.  }..  if( rc
1faa0 21 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 70 4e 65 77  !=LSM_OK || pNew
1fab0 2d 3e 6c 68 73 2e 69 46 69 72 73 74 3d 3d 30 20  ->lhs.iFirst==0 
1fac0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
1fad0 63 21 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 70 44 62  c!=LSM_OK || pDb
1fae0 2d 3e 70 57 6f 72 6b 65 72 2d 3e 66 72 65 65 6c  ->pWorker->freel
1faf0 69 73 74 2e 6e 45 6e 74 72 79 3d 3d 30 20 29 3b  ist.nEntry==0 );
1fb00 0a 20 20 20 20 6c 73 6d 44 62 53 6e 61 70 73 68  .    lsmDbSnapsh
1fb10 6f 74 53 65 74 4c 65 76 65 6c 28 70 44 62 2d 3e  otSetLevel(pDb->
1fb20 70 57 6f 72 6b 65 72 2c 20 70 4e 65 78 74 29 3b  pWorker, pNext);
1fb30 0a 20 20 20 20 73 6f 72 74 65 64 46 72 65 65 4c  .    sortedFreeL
1fb40 65 76 65 6c 28 70 44 62 2d 3e 70 45 6e 76 2c 20  evel(pDb->pEnv, 
1fb50 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNew);.  }else{.
1fb60 20 20 20 20 69 66 28 20 70 4c 69 6e 6b 65 64 20      if( pLinked 
1fb70 29 7b 0a 20 20 20 20 20 20 70 4c 69 6e 6b 65 64  ){.      pLinked
1fb80 2d 3e 69 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 20  ->iRoot = 0;.   
1fb90 20 7d 65 6c 73 65 20 69 66 28 20 70 44 65 6c 20   }else if( pDel 
1fba0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1fbb0 20 70 4e 65 77 2d 3e 70 4e 65 78 74 3d 3d 70 44   pNew->pNext==pD
1fbc0 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  el );.      pNew
1fbd0 2d 3e 70 4e 65 78 74 20 3d 20 70 44 65 6c 2d 3e  ->pNext = pDel->
1fbe0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 6c 73 6d  pNext;.      lsm
1fbf0 46 73 53 6f 72 74 65 64 44 65 6c 65 74 65 28 70  FsSortedDelete(p
1fc00 44 62 2d 3e 70 46 53 2c 20 70 44 62 2d 3e 70 57  Db->pFS, pDb->pW
1fc10 6f 72 6b 65 72 2c 20 31 2c 20 26 70 44 65 6c 2d  orker, 1, &pDel-
1fc20 3e 6c 68 73 29 3b 0a 20 20 20 20 20 20 73 6f 72  >lhs);.      sor
1fc30 74 65 64 46 72 65 65 4c 65 76 65 6c 28 70 44 62  tedFreeLevel(pDb
1fc40 2d 3e 70 45 6e 76 2c 20 70 44 65 6c 29 3b 0a 20  ->pEnv, pDel);. 
1fc50 20 20 20 7d 0a 0a 23 69 66 20 4c 53 4d 5f 4c 4f     }..#if LSM_LO
1fc60 47 5f 53 54 52 55 43 54 55 52 45 0a 20 20 20 20  G_STRUCTURE.    
1fc70 6c 73 6d 53 6f 72 74 65 64 44 75 6d 70 53 74 72  lsmSortedDumpStr
1fc80 75 63 74 75 72 65 28 70 44 62 2c 20 70 44 62 2d  ucture(pDb, pDb-
1fc90 3e 70 57 6f 72 6b 65 72 2c 20 4c 53 4d 5f 4c 4f  >pWorker, LSM_LO
1fca0 47 5f 44 41 54 41 2c 20 30 2c 20 22 6e 65 77 2d  G_DATA, 0, "new-
1fcb0 74 6f 70 6c 65 76 65 6c 22 29 3b 0a 23 65 6e 64  toplevel");.#end
1fcc0 69 66 0a 0a 20 20 20 20 69 66 28 20 66 72 65 65  if..    if( free
1fcd0 6c 69 73 74 2e 6e 45 6e 74 72 79 20 29 7b 0a 20  list.nEntry ){. 
1fce0 20 20 20 20 20 46 72 65 65 6c 69 73 74 20 2a 70       Freelist *p
1fcf0 20 3d 20 26 70 44 62 2d 3e 70 57 6f 72 6b 65 72   = &pDb->pWorker
1fd00 2d 3e 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20  ->freelist;.    
1fd10 20 20 6c 73 6d 46 72 65 65 28 70 44 62 2d 3e 70    lsmFree(pDb->p
1fd20 45 6e 76 2c 20 70 2d 3e 61 45 6e 74 72 79 29 3b  Env, p->aEntry);
1fd30 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  .      memcpy(p,
1fd40 20 26 66 72 65 65 6c 69 73 74 2c 20 73 69 7a 65   &freelist, size
1fd50 6f 66 28 66 72 65 65 6c 69 73 74 29 29 3b 0a 20  of(freelist));. 
1fd60 20 20 20 20 20 66 72 65 65 6c 69 73 74 2e 61 45       freelist.aE
1fd70 6e 74 72 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ntry = 0;.    }e
1fd80 6c 73 65 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e  lse{.      pDb->
1fd90 70 57 6f 72 6b 65 72 2d 3e 66 72 65 65 6c 69 73  pWorker->freelis
1fda0 74 2e 6e 45 6e 74 72 79 20 3d 20 30 3b 0a 20 20  t.nEntry = 0;.  
1fdb0 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 42    }..    assertB
1fdc0 74 72 65 65 4f 6b 28 70 44 62 2c 20 26 70 4e 65  treeOk(pDb, &pNe
1fdd0 77 2d 3e 6c 68 73 29 3b 0a 20 20 20 20 73 6f 72  w->lhs);.    sor
1fde0 74 65 64 49 6e 76 6f 6b 65 57 6f 72 6b 48 6f 6f  tedInvokeWorkHoo
1fdf0 6b 28 70 44 62 29 3b 0a 20 20 7d 0a 0a 20 20 69  k(pDb);.  }..  i
1fe00 66 28 20 70 6e 57 72 69 74 65 20 29 20 2a 70 6e  f( pnWrite ) *pn
1fe10 57 72 69 74 65 20 3d 20 6e 57 72 69 74 65 3b 0a  Write = nWrite;.
1fe20 20 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2d 3e    pDb->pWorker->
1fe30 6e 57 72 69 74 65 20 2b 3d 20 6e 57 72 69 74 65  nWrite += nWrite
1fe40 3b 0a 20 20 70 44 62 2d 3e 70 46 72 65 65 6c 69  ;.  pDb->pFreeli
1fe50 73 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 62  st = 0;.  pDb->b
1fe60 55 73 65 46 72 65 65 6c 69 73 74 20 3d 20 30 3b  UseFreelist = 0;
1fe70 0a 20 20 6c 73 6d 46 72 65 65 28 70 44 62 2d 3e  .  lsmFree(pDb->
1fe80 70 45 6e 76 2c 20 66 72 65 65 6c 69 73 74 2e 61  pEnv, freelist.a
1fe90 45 6e 74 72 79 29 3b 0a 20 20 72 65 74 75 72 6e  Entry);.  return
1fea0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1feb0 65 20 6e 4d 65 72 67 65 20 6c 65 76 65 6c 73 20  e nMerge levels 
1fec0 69 6e 20 74 68 65 20 4c 53 4d 20 62 65 67 69 6e  in the LSM begin
1fed0 6e 69 6e 67 20 77 69 74 68 20 70 4c 65 76 65 6c  ning with pLevel
1fee0 20 63 6f 6e 73 69 73 74 20 6f 66 20 61 0a 2a 2a   consist of a.**
1fef0 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
1ff00 73 65 67 6d 65 6e 74 20 6f 6e 6c 79 2e 20 52 65  segment only. Re
1ff10 70 6c 61 63 65 20 74 68 65 73 65 20 6c 65 76 65  place these leve
1ff20 6c 73 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ls with a single
1ff30 20 6e 65 77 0a 2a 2a 20 6c 65 76 65 6c 20 63 6f   new.** level co
1ff40 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 6e 65  nsisting of a ne
1ff50 77 20 65 6d 70 74 79 20 73 65 67 6d 65 6e 74 20  w empty segment 
1ff60 6f 6e 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  on the left-hand
1ff70 2d 73 69 64 65 20 61 6e 64 20 74 68 65 0a 2a 2a  -side and the.**
1ff80 20 6e 4d 65 72 67 65 20 73 65 67 6d 65 6e 74 73   nMerge segments
1ff90 20 66 72 6f 6d 20 74 68 65 20 72 65 70 6c 61 63   from the replac
1ffa0 65 64 20 6c 65 76 65 6c 73 20 6f 6e 20 74 68 65  ed levels on the
1ffb0 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65   right-hand-side
1ffc0 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 61 6c  ..**.** Also, al
1ffd0 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c  locate and popul
1ffe0 61 74 65 20 61 20 4d 65 72 67 65 20 6f 62 6a 65  ate a Merge obje
1fff0 63 74 20 61 6e 64 20 73 65 74 20 4c 65 76 65 6c  ct and set Level
20000 2e 70 4d 65 72 67 65 20 74 6f 0a 2a 2a 20 70 6f  .pMerge to.** po
20010 69 6e 74 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74  int to it..*/.st
20020 61 74 69 63 20 69 6e 74 20 73 6f 72 74 65 64 4d  atic int sortedM
20030 65 72 67 65 53 65 74 75 70 28 0a 20 20 6c 73 6d  ergeSetup(.  lsm
20040 5f 64 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20  _db *pDb,       
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20060 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
20070 2a 2f 0a 20 20 4c 65 76 65 6c 20 2a 70 4c 65 76  */.  Level *pLev
20080 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
20090 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65       /* First le
200a0 76 65 6c 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  vel to merge */.
200b0 20 20 69 6e 74 20 6e 4d 65 72 67 65 2c 20 20 20    int nMerge,   
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 69 73 20    /* Merge this 
200e0 6d 61 6e 79 20 6c 65 76 65 6c 73 20 74 6f 67 65  many levels toge
200f0 74 68 65 72 20 2a 2f 0a 20 20 4c 65 76 65 6c 20  ther */.  Level 
20100 2a 2a 70 70 4e 65 77 20 20 20 20 20 20 20 20 20  **ppNew         
20110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
20120 2c 20 6d 65 72 67 65 64 2c 20 6c 65 76 65 6c 20  , merged, level 
20130 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
20140 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20   LSM_OK;        
20150 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
20160 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 4c 65 76 65  n Code */.  Leve
20170 6c 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  l *pNew;        
20180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20190 65 77 20 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20  ew Level object 
201a0 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 4e 65 78  */.  int bUseNex
201b0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
201c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
201d0 6c 69 6e 6b 20 69 6e 20 6e 65 78 74 20 73 65 70  link in next sep
201e0 61 72 61 74 6f 72 73 20 2a 2f 0a 20 20 4d 65 72  arators */.  Mer
201f0 67 65 20 2a 70 4d 65 72 67 65 3b 20 20 20 20 20  ge *pMerge;     
20200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20210 4e 65 77 20 4d 65 72 67 65 20 6f 62 6a 65 63 74  New Merge object
20220 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
20230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20240 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
20250 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
20260 64 20 61 74 20 70 4d 65 72 67 65 20 2a 2f 0a 0a  d at pMerge */..
20270 23 69 66 64 65 66 20 4c 53 4d 5f 44 45 42 55 47  #ifdef LSM_DEBUG
20280 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 3b 0a 20  .  int iLevel;. 
20290 20 4c 65 76 65 6c 20 2a 70 58 20 3d 20 70 4c 65   Level *pX = pLe
202a0 76 65 6c 3b 0a 20 20 66 6f 72 28 69 4c 65 76 65  vel;.  for(iLeve
202b0 6c 3d 30 3b 20 69 4c 65 76 65 6c 3c 6e 4d 65 72  l=0; iLevel<nMer
202c0 67 65 3b 20 69 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ge; iLevel++){. 
202d0 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e     assert( pX->n
202e0 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
202f0 70 58 20 3d 20 70 58 2d 3e 70 4e 65 78 74 3b 0a  pX = pX->pNext;.
20300 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
20310 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 6e 65   Allocate the ne
20320 77 20 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 2a  w Level object *
20330 2f 0a 20 20 70 4e 65 77 20 3d 20 28 4c 65 76 65  /.  pNew = (Leve
20340 6c 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72  l *)lsmMallocZer
20350 6f 52 63 28 70 44 62 2d 3e 70 45 6e 76 2c 20 73  oRc(pDb->pEnv, s
20360 69 7a 65 6f 66 28 4c 65 76 65 6c 29 2c 20 26 72  izeof(Level), &r
20370 63 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  c);.  if( pNew )
20380 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 52 68 73  {.    pNew->aRhs
20390 20 3d 20 28 53 65 67 6d 65 6e 74 20 2a 29 6c 73   = (Segment *)ls
203a0 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63 28 70 44  mMallocZeroRc(pD
203b0 62 2d 3e 70 45 6e 76 2c 20 0a 20 20 20 20 20 20  b->pEnv, .      
203c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203e0 20 20 6e 4d 65 72 67 65 20 2a 20 73 69 7a 65 6f    nMerge * sizeo
203f0 66 28 53 65 67 6d 65 6e 74 29 2c 20 26 72 63 29  f(Segment), &rc)
20400 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 6f 70 75  ;.  }..  /* Popu
20410 6c 61 74 65 20 74 68 65 20 6e 65 77 20 4c 65 76  late the new Lev
20420 65 6c 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  el object */.  i
20430 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc==LSM_OK ){
20440 0a 20 20 20 20 4c 65 76 65 6c 20 2a 70 4e 65 78  .    Level *pNex
20450 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
20460 20 20 20 2f 2a 20 4c 65 76 65 6c 20 66 6f 6c 6c     /* Level foll
20470 6f 77 69 6e 67 20 70 4e 65 77 20 2a 2f 0a 20 20  owing pNew */.  
20480 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
20490 20 62 46 72 65 65 4f 6e 6c 79 20 3d 20 31 3b 0a   bFreeOnly = 1;.
204a0 20 20 20 20 4c 65 76 65 6c 20 2a 70 54 6f 70 4c      Level *pTopL
204b0 65 76 65 6c 3b 0a 20 20 20 20 4c 65 76 65 6c 20  evel;.    Level 
204c0 2a 70 20 3d 20 70 4c 65 76 65 6c 3b 0a 20 20 20  *p = pLevel;.   
204d0 20 4c 65 76 65 6c 20 2a 2a 70 70 3b 0a 20 20 20   Level **pp;.   
204e0 20 70 4e 65 77 2d 3e 6e 52 69 67 68 74 20 3d 20   pNew->nRight = 
204f0 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70 4e 65 77  nMerge;.    pNew
20500 2d 3e 69 41 67 65 20 3d 20 70 4c 65 76 65 6c 2d  ->iAge = pLevel-
20510 3e 69 41 67 65 2b 31 3b 0a 20 20 20 20 66 6f 72  >iAge+1;.    for
20520 28 69 3d 30 3b 20 69 3c 6e 4d 65 72 67 65 3b 20  (i=0; i<nMerge; 
20530 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
20540 72 74 28 20 70 2d 3e 6e 52 69 67 68 74 3d 3d 30  rt( p->nRight==0
20550 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20   );.      pNext 
20560 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
20570 20 20 70 4e 65 77 2d 3e 61 52 68 73 5b 69 5d 20    pNew->aRhs[i] 
20580 3d 20 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20  = p->lhs;.      
20590 69 66 28 20 28 70 2d 3e 66 6c 61 67 73 20 26 20  if( (p->flags & 
205a0 4c 45 56 45 4c 5f 46 52 45 45 4c 49 53 54 5f 4f  LEVEL_FREELIST_O
205b0 4e 4c 59 29 3d 3d 30 20 29 20 62 46 72 65 65 4f  NLY)==0 ) bFreeO
205c0 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  nly = 0;.      s
205d0 6f 72 74 65 64 46 72 65 65 4c 65 76 65 6c 28 70  ortedFreeLevel(p
205e0 44 62 2d 3e 70 45 6e 76 2c 20 70 29 3b 0a 20 20  Db->pEnv, p);.  
205f0 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20      p = pNext;. 
20600 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 46     }..    if( bF
20610 72 65 65 4f 6e 6c 79 20 29 20 70 4e 65 77 2d 3e  reeOnly ) pNew->
20620 66 6c 61 67 73 20 7c 3d 20 4c 45 56 45 4c 5f 46  flags |= LEVEL_F
20630 52 45 45 4c 49 53 54 5f 4f 4e 4c 59 3b 0a 0a 20  REELIST_ONLY;.. 
20640 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68     /* Replace th
20650 65 20 6f 6c 64 20 6c 65 76 65 6c 73 20 77 69 74  e old levels wit
20660 68 20 74 68 65 20 6e 65 77 2e 20 2a 2f 0a 20 20  h the new. */.  
20670 20 20 70 54 6f 70 4c 65 76 65 6c 20 3d 20 6c 73    pTopLevel = ls
20680 6d 44 62 53 6e 61 70 73 68 6f 74 4c 65 76 65 6c  mDbSnapshotLevel
20690 28 70 44 62 2d 3e 70 57 6f 72 6b 65 72 29 3b 0a  (pDb->pWorker);.
206a0 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
206b0 3d 20 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d  = p;.    for(pp=
206c0 26 70 54 6f 70 4c 65 76 65 6c 3b 20 2a 70 70 21  &pTopLevel; *pp!
206d0 3d 70 4c 65 76 65 6c 3b 20 70 70 3d 26 28 28 2a  =pLevel; pp=&((*
206e0 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
206f0 20 20 2a 70 70 20 3d 20 70 4e 65 77 3b 0a 20 20    *pp = pNew;.  
20700 20 20 6c 73 6d 44 62 53 6e 61 70 73 68 6f 74 53    lsmDbSnapshotS
20710 65 74 4c 65 76 65 6c 28 70 44 62 2d 3e 70 57 6f  etLevel(pDb->pWo
20720 72 6b 65 72 2c 20 70 54 6f 70 4c 65 76 65 6c 29  rker, pTopLevel)
20730 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  ;..    /* Determ
20740 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
20750 6f 74 20 74 68 65 20 6e 65 78 74 20 73 65 70 61  ot the next sepa
20760 72 61 74 6f 72 73 20 77 69 6c 6c 20 62 65 20 6c  rators will be l
20770 69 6e 6b 65 64 20 69 6e 20 2a 2f 0a 20 20 20 20  inked in */.    
20780 69 66 28 20 70 4e 65 78 74 20 26 26 20 70 4e 65  if( pNext && pNe
20790 78 74 2d 3e 70 4d 65 72 67 65 3d 3d 30 20 26 26  xt->pMerge==0 &&
207a0 20 70 4e 65 78 74 2d 3e 6c 68 73 2e 69 52 6f 6f   pNext->lhs.iRoo
207b0 74 20 26 26 20 70 4e 65 78 74 20 0a 20 20 20 20  t && pNext .    
207c0 20 26 26 20 28 62 46 72 65 65 4f 6e 6c 79 3d 3d   && (bFreeOnly==
207d0 30 20 7c 7c 20 28 70 4e 65 78 74 2d 3e 66 6c 61  0 || (pNext->fla
207e0 67 73 20 26 20 4c 45 56 45 4c 5f 46 52 45 45 4c  gs & LEVEL_FREEL
207f0 49 53 54 5f 4f 4e 4c 59 29 29 0a 20 20 20 20 29  IST_ONLY)).    )
20800 7b 0a 20 20 20 20 20 20 62 55 73 65 4e 65 78 74  {.      bUseNext
20810 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
20820 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
20830 68 65 20 6d 65 72 67 65 20 6f 62 6a 65 63 74 20  he merge object 
20840 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  */.  nByte = siz
20850 65 6f 66 28 4d 65 72 67 65 29 20 2b 20 73 69 7a  eof(Merge) + siz
20860 65 6f 66 28 4d 65 72 67 65 49 6e 70 75 74 29 20  eof(MergeInput) 
20870 2a 20 28 6e 4d 65 72 67 65 20 2b 20 62 55 73 65  * (nMerge + bUse
20880 4e 65 78 74 29 3b 0a 20 20 70 4d 65 72 67 65 20  Next);.  pMerge 
20890 3d 20 28 4d 65 72 67 65 20 2a 29 6c 73 6d 4d 61  = (Merge *)lsmMa
208a0 6c 6c 6f 63 5a 65 72 6f 52 63 28 70 44 62 2d 3e  llocZeroRc(pDb->
208b0 70 45 6e 76 2c 20 6e 42 79 74 65 2c 20 26 72 63  pEnv, nByte, &rc
208c0 29 3b 0a 20 20 69 66 28 20 70 4d 65 72 67 65 20  );.  if( pMerge 
208d0 29 7b 0a 20 20 20 20 70 4d 65 72 67 65 2d 3e 61  ){.    pMerge->a
208e0 49 6e 70 75 74 20 3d 20 28 4d 65 72 67 65 49 6e  Input = (MergeIn
208f0 70 75 74 20 2a 29 26 70 4d 65 72 67 65 5b 31 5d  put *)&pMerge[1]
20900 3b 0a 20 20 20 20 70 4d 65 72 67 65 2d 3e 6e 49  ;.    pMerge->nI
20910 6e 70 75 74 20 3d 20 6e 4d 65 72 67 65 20 2b 20  nput = nMerge + 
20920 62 55 73 65 4e 65 78 74 3b 0a 20 20 20 20 70 4e  bUseNext;.    pN
20930 65 77 2d 3e 70 4d 65 72 67 65 20 3d 20 70 4d 65  ew->pMerge = pMe
20940 72 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 4e  rge;.  }..  *ppN
20950 65 77 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74  ew = pNew;.  ret
20960 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
20970 63 20 69 6e 74 20 6d 65 72 67 65 57 6f 72 6b 65  c int mergeWorke
20980 72 49 6e 69 74 28 0a 20 20 6c 73 6d 5f 64 62 20  rInit(.  lsm_db 
20990 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20  *pDb,           
209a0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 63           /* Db c
209b0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 64 6f 20  onnection to do 
209c0 6d 65 72 67 65 20 77 6f 72 6b 20 2a 2f 0a 20 20  merge work */.  
209d0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20  Level *pLevel,  
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209f0 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 77 6f 72 6b  /* Level to work
20a00 20 6f 6e 20 6d 65 72 67 69 6e 67 20 2a 2f 0a 20   on merging */. 
20a10 20 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d   MergeWorker *pM
20a20 57 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W               
20a30 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 69 6e   /* Object to in
20a40 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 29 7b 0a 20  itialize */.){. 
20a50 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b   int rc = LSM_OK
20a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20a70 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
20a80 2a 2f 0a 20 20 4d 65 72 67 65 20 2a 70 4d 65 72  */.  Merge *pMer
20a90 67 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 4d 65  ge = pLevel->pMe
20aa0 72 67 65 3b 20 2f 2a 20 50 65 72 73 69 73 74 65  rge; /* Persiste
20ab0 6e 74 20 70 61 72 74 20 6f 66 20 6d 65 72 67 65  nt part of merge
20ac0 20 73 74 61 74 65 20 2a 2f 0a 20 20 4d 75 6c 74   state */.  Mult
20ad0 69 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  iCursor *pCsr = 
20ae0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  0;          /* C
20af0 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 66 6f 72  ursor opened for
20b00 20 70 4d 57 20 2a 2f 0a 20 20 4c 65 76 65 6c 20   pMW */.  Level 
20b10 2a 70 4e 65 78 74 20 3d 20 70 4c 65 76 65 6c 2d  *pNext = pLevel-
20b20 3e 70 4e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78  >pNext;   /* Nex
20b30 74 20 6c 65 76 65 6c 20 69 6e 20 4c 53 4d 20 2a  t level in LSM *
20b40 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  /..  assert( pDb
20b50 2d 3e 70 57 6f 72 6b 65 72 20 29 3b 0a 20 20 61  ->pWorker );.  a
20b60 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
20b70 4d 65 72 67 65 20 29 3b 0a 20 20 61 73 73 65 72  Merge );.  asser
20b80 74 28 20 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68  t( pLevel->nRigh
20b90 74 3e 30 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  t>0 );..  memset
20ba0 28 70 4d 57 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pMW, 0, sizeof(
20bb0 4d 65 72 67 65 57 6f 72 6b 65 72 29 29 3b 0a 20  MergeWorker));. 
20bc0 20 70 4d 57 2d 3e 70 44 62 20 3d 20 70 44 62 3b   pMW->pDb = pDb;
20bd0 0a 20 20 70 4d 57 2d 3e 70 4c 65 76 65 6c 20 3d  .  pMW->pLevel =
20be0 20 70 4c 65 76 65 6c 3b 0a 20 20 70 4d 57 2d 3e   pLevel;.  pMW->
20bf0 61 47 6f 62 62 6c 65 20 3d 20 6c 73 6d 4d 61 6c  aGobble = lsmMal
20c00 6c 6f 63 5a 65 72 6f 52 63 28 70 44 62 2d 3e 70  locZeroRc(pDb->p
20c10 45 6e 76 2c 20 73 69 7a 65 6f 66 28 50 67 6e 6f  Env, sizeof(Pgno
20c20 29 20 2a 20 70 4c 65 76 65 6c 2d 3e 6e 52 69 67  ) * pLevel->nRig
20c30 68 74 2c 20 26 72 63 29 3b 0a 0a 20 20 2f 2a 20  ht, &rc);..  /* 
20c40 43 72 65 61 74 65 20 61 20 6d 75 6c 74 69 2d 63  Create a multi-c
20c50 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20 74 68  ursor to read th
20c60 65 20 64 61 74 61 20 74 6f 20 77 72 69 74 65 20  e data to write 
20c70 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  to the new.  ** 
20c80 73 65 67 6d 65 6e 74 2e 20 54 68 65 20 6e 65 77  segment. The new
20c90 20 73 65 67 6d 65 6e 74 20 63 6f 6e 74 61 69 6e   segment contain
20ca0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
20cb0 2e 20 52 65 63 6f 72 64 73 20 66 72 6f 6d 20 4c  . Records from L
20cc0 48 53 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68  HS of each of th
20cd0 65 20 6e 4d 65 72 67 65 20 6c 65 76 65 6c 73 20  e nMerge levels 
20ce0 62 65 69 6e 67 20 6d 65 72 67 65 64 2e 0a 20 20  being merged..  
20cf0 2a 2a 20 20 20 32 2e 20 53 65 70 61 72 61 74 6f  **   2. Separato
20d00 72 73 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  rs from either t
20d10 68 65 20 6c 61 73 74 20 6c 65 76 65 6c 20 62 65  he last level be
20d20 69 6e 67 20 6d 65 72 67 65 64 2c 20 6f 72 20 74  ing merged, or t
20d30 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 73 65 70  he.  **      sep
20d40 61 72 61 74 6f 72 73 20 61 74 74 61 63 68 65 64  arators attached
20d50 20 74 6f 20 74 68 65 20 4c 48 53 20 6f 66 20 74   to the LHS of t
20d60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 65 76  he following lev
20d70 65 6c 2c 20 6f 72 20 6e 65 69 74 68 65 72 2e 0a  el, or neither..
20d80 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
20d90 20 6e 65 77 20 6c 65 76 65 6c 20 69 73 20 74 68   new level is th
20da0 65 20 6c 6f 77 65 73 74 20 28 6f 6c 64 65 73 74  e lowest (oldest
20db0 29 20 69 6e 20 74 68 65 20 64 62 2c 20 64 69 73  ) in the db, dis
20dc0 63 61 72 64 20 61 6e 79 0a 20 20 2a 2a 20 64 65  card any.  ** de
20dd0 6c 65 74 65 20 6b 65 79 73 2e 20 4b 65 79 20 61  lete keys. Key a
20de0 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e 0a 20 20 2a  nnihilation..  *
20df0 2f 0a 20 20 70 43 73 72 20 3d 20 6d 75 6c 74 69  /.  pCsr = multi
20e00 43 75 72 73 6f 72 4e 65 77 28 70 44 62 2c 20 26  CursorNew(pDb, &
20e10 72 63 29 3b 0a 20 20 69 66 28 20 70 43 73 72 20  rc);.  if( pCsr 
20e20 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 66 6c 61  ){.    pCsr->fla
20e30 67 73 20 7c 3d 20 43 55 52 53 4f 52 5f 4e 45 58  gs |= CURSOR_NEX
20e40 54 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 6d  T_OK;.    rc = m
20e50 75 6c 74 69 43 75 72 73 6f 72 41 64 64 52 68 73  ultiCursorAddRhs
20e60 28 70 43 73 72 2c 20 70 4c 65 76 65 6c 29 3b 0a  (pCsr, pLevel);.
20e70 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53    }.  if( rc==LS
20e80 4d 5f 4f 4b 20 26 26 20 70 4d 65 72 67 65 2d 3e  M_OK && pMerge->
20e90 6e 49 6e 70 75 74 20 3e 20 70 4c 65 76 65 6c 2d  nInput > pLevel-
20ea0 3e 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 72  >nRight ){.    r
20eb0 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 4e  c = btreeCursorN
20ec0 65 77 28 70 44 62 2c 20 26 70 4e 65 78 74 2d 3e  ew(pDb, &pNext->
20ed0 6c 68 73 2c 20 26 70 43 73 72 2d 3e 70 42 74 43  lhs, &pCsr->pBtC
20ee0 73 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  sr);.  }else if(
20ef0 20 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 6d 75   pNext ){.    mu
20f00 6c 74 69 43 75 72 73 6f 72 52 65 61 64 53 65 70  ltiCursorReadSep
20f10 61 72 61 74 6f 72 73 28 70 43 73 72 29 3b 0a 20  arators(pCsr);. 
20f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 75 6c 74   }else{.    mult
20f30 69 43 75 72 73 6f 72 49 67 6e 6f 72 65 44 65 6c  iCursorIgnoreDel
20f40 65 74 65 28 70 43 73 72 29 3b 0a 20 20 7d 0a 0a  ete(pCsr);.  }..
20f50 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 4c 53    assert( rc!=LS
20f60 4d 5f 4f 4b 20 7c 7c 20 70 4d 65 72 67 65 2d 3e  M_OK || pMerge->
20f70 6e 49 6e 70 75 74 3d 3d 28 70 43 73 72 2d 3e 6e  nInput==(pCsr->n
20f80 50 74 72 2b 28 70 43 73 72 2d 3e 70 42 74 43 73  Ptr+(pCsr->pBtCs
20f90 72 21 3d 30 29 29 20 29 3b 0a 20 20 70 4d 57 2d  r!=0)) );.  pMW-
20fa0 3e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 0a 20  >pCsr = pCsr;.. 
20fb0 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 62 2d 74   /* Load the b-t
20fc0 72 65 65 20 68 69 65 72 61 72 63 68 79 20 69 6e  ree hierarchy in
20fd0 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20  to memory. */.  
20fe0 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  if( rc==LSM_OK )
20ff0 20 72 63 20 3d 20 6d 65 72 67 65 57 6f 72 6b 65   rc = mergeWorke
21000 72 4c 6f 61 64 48 69 65 72 61 72 63 68 79 28 70  rLoadHierarchy(p
21010 4d 57 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 4c  MW);.  if( rc==L
21020 53 4d 5f 4f 4b 20 26 26 20 70 4d 57 2d 3e 68 69  SM_OK && pMW->hi
21030 65 72 2e 6e 48 69 65 72 3d 3d 30 20 29 7b 0a 20  er.nHier==0 ){. 
21040 20 20 20 70 4d 57 2d 3e 61 53 61 76 65 5b 30 5d     pMW->aSave[0]
21050 2e 69 50 67 6e 6f 20 3d 20 70 4c 65 76 65 6c 2d  .iPgno = pLevel-
21060 3e 6c 68 73 2e 69 46 69 72 73 74 3b 0a 20 20 7d  >lhs.iFirst;.  }
21070 0a 0a 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20  ..  /* Position 
21080 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20  the cursor. */. 
21090 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
210a0 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 70 50 72  ){.    pCsr->pPr
210b0 65 76 4d 65 72 67 65 50 74 72 20 3d 20 26 70 4d  evMergePtr = &pM
210c0 65 72 67 65 2d 3e 69 43 75 72 72 65 6e 74 50 74  erge->iCurrentPt
210d0 72 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  r;.    if( pLeve
210e0 6c 2d 3e 6c 68 73 2e 69 46 69 72 73 74 3d 3d 30  l->lhs.iFirst==0
210f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
21100 20 6f 75 74 70 75 74 20 61 72 72 61 79 20 69 73   output array is
21110 20 73 74 69 6c 6c 20 65 6d 70 74 79 2e 20 53 6f   still empty. So
21120 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75   position the cu
21130 72 73 6f 72 20 61 74 20 74 68 65 20 76 65 72 79  rsor at the very
21140 20 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74   .      ** start
21150 20 6f 66 20 74 68 65 20 69 6e 70 75 74 2e 20 20   of the input.  
21160 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 75  */.      rc = mu
21170 6c 74 69 43 75 72 73 6f 72 45 6e 64 28 70 43 73  ltiCursorEnd(pCs
21180 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  r, 0);.    }else
21190 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  {.      /* The o
211a0 75 74 70 75 74 20 61 72 72 61 79 20 69 73 20 6e  utput array is n
211b0 6f 6e 2d 65 6d 70 74 79 2e 20 50 6f 73 69 74 69  on-empty. Positi
211c0 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 62 61  on the cursor ba
211d0 73 65 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 20  sed on the.     
211e0 20 2a 2a 20 70 61 67 65 2f 63 65 6c 6c 20 64 61   ** page/cell da
211f0 74 61 20 73 61 76 65 64 20 69 6e 20 74 68 65 20  ta saved in the 
21200 4d 65 72 67 65 2e 61 49 6e 70 75 74 5b 5d 20 61  Merge.aInput[] a
21210 72 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rray.  */.      
21220 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
21230 28 69 3d 30 3b 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  (i=0; rc==LSM_OK
21240 20 26 26 20 69 3c 70 43 73 72 2d 3e 6e 50 74 72   && i<pCsr->nPtr
21250 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
21260 4d 65 72 67 65 49 6e 70 75 74 20 2a 70 49 6e 70  MergeInput *pInp
21270 75 74 20 3d 20 26 70 4d 65 72 67 65 2d 3e 61 49  ut = &pMerge->aI
21280 6e 70 75 74 5b 69 5d 3b 0a 20 20 20 20 20 20 20  nput[i];.       
21290 20 69 66 28 20 70 49 6e 70 75 74 2d 3e 69 50 67   if( pInput->iPg
212a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65   ){.          Se
212b0 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 3b 0a  gmentPtr *pPtr;.
212c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
212d0 28 20 70 43 73 72 2d 3e 61 50 74 72 5b 69 5d 2e  ( pCsr->aPtr[i].
212e0 70 50 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pPg==0 );.      
212f0 20 20 20 20 70 50 74 72 20 3d 20 26 70 43 73 72      pPtr = &pCsr
21300 2d 3e 61 50 74 72 5b 69 5d 3b 0a 20 20 20 20 20  ->aPtr[i];.     
21310 20 20 20 20 20 72 63 20 3d 20 73 65 67 6d 65 6e       rc = segmen
21320 74 50 74 72 4c 6f 61 64 50 61 67 65 28 70 44 62  tPtrLoadPage(pDb
21330 2d 3e 70 46 53 2c 20 70 50 74 72 2c 20 70 49 6e  ->pFS, pPtr, pIn
21340 70 75 74 2d 3e 69 50 67 29 3b 0a 20 20 20 20 20  put->iPg);.     
21350 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d       if( rc==LSM
21360 5f 4f 4b 20 26 26 20 70 50 74 72 2d 3e 6e 43 65  _OK && pPtr->nCe
21370 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ll>0 ){.        
21380 20 20 20 20 72 63 20 3d 20 73 65 67 6d 65 6e 74      rc = segment
21390 50 74 72 4c 6f 61 64 43 65 6c 6c 28 70 50 74 72  PtrLoadCell(pPtr
213a0 2c 20 70 49 6e 70 75 74 2d 3e 69 43 65 6c 6c 29  , pInput->iCell)
213b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
213c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
213d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c  .      if( rc==L
213e0 53 4d 5f 4f 4b 20 26 26 20 70 43 73 72 2d 3e 70  SM_OK && pCsr->p
213f0 42 74 43 73 72 20 29 7b 0a 20 20 20 20 20 20 20  BtCsr ){.       
21400 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69   int (*xCmp)(voi
21410 64 20 2a 2c 20 69 6e 74 2c 20 76 6f 69 64 20 2a  d *, int, void *
21420 2c 20 69 6e 74 29 20 3d 20 70 43 73 72 2d 3e 70  , int) = pCsr->p
21430 44 62 2d 3e 78 43 6d 70 3b 0a 20 20 20 20 20 20  Db->xCmp;.      
21440 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 43 73    assert( i==pCs
21450 72 2d 3e 6e 50 74 72 20 29 3b 0a 20 20 20 20 20  r->nPtr );.     
21460 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72     rc = btreeCur
21470 73 6f 72 52 65 73 74 6f 72 65 28 70 43 73 72 2d  sorRestore(pCsr-
21480 3e 70 42 74 43 73 72 2c 20 78 43 6d 70 2c 20 26  >pBtCsr, xCmp, &
21490 70 4d 65 72 67 65 2d 3e 61 49 6e 70 75 74 5b 69  pMerge->aInput[i
214a0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ]);.      }..   
214b0 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
214c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
214d0 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72 53 65 74  = multiCursorSet
214e0 75 70 54 72 65 65 28 70 43 73 72 2c 20 30 29 3b  upTree(pCsr, 0);
214f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21500 20 20 20 70 43 73 72 2d 3e 66 6c 61 67 73 20 7c     pCsr->flags |
21510 3d 20 43 55 52 53 4f 52 5f 4e 45 58 54 5f 4f 4b  = CURSOR_NEXT_OK
21520 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
21530 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
21540 74 20 73 6f 72 74 65 64 42 74 72 65 65 47 6f 62  t sortedBtreeGob
21550 62 6c 65 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70  ble(.  lsm_db *p
21560 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
21570 20 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 65 72         /* Worker
21580 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
21590 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43   MultiCursor *pC
215a0 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
215b0 20 2f 2a 20 4d 75 6c 74 69 2d 63 75 72 73 6f 72   /* Multi-cursor
215c0 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20   being used for 
215d0 61 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  a merge */.  int
215e0 20 69 47 6f 62 62 6c 65 20 20 20 20 20 20 20 20   iGobble        
215f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21600 70 43 73 72 2d 3e 61 50 74 72 5b 5d 20 65 6e 74  pCsr->aPtr[] ent
21610 72 79 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ry to operate on
21620 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
21630 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 66 28 20  = LSM_OK;.  if( 
21640 72 74 54 6f 70 69 63 28 70 43 73 72 2d 3e 65 54  rtTopic(pCsr->eT
21650 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  ype)==0 ){.    S
21660 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70  egment *pSeg = p
21670 43 73 72 2d 3e 61 50 74 72 5b 69 47 6f 62 62 6c  Csr->aPtr[iGobbl
21680 65 5d 2e 70 53 65 67 3b 0a 20 20 20 20 50 67 6e  e].pSeg;.    Pgn
21690 6f 20 2a 61 50 67 3b 0a 20 20 20 20 69 6e 74 20  o *aPg;.    int 
216a0 6e 50 67 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  nPg;..    /* See
216b0 6b 20 66 72 6f 6d 20 74 68 65 20 72 6f 6f 74 20  k from the root 
216c0 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 74 6f  of the b-tree to
216d0 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6c 65 61   the segment lea
216e0 66 20 74 68 61 74 20 6d 61 79 20 63 6f 6e 74 61  f that may conta
216f0 69 6e 0a 20 20 20 20 2a 2a 20 61 20 6b 65 79 20  in.    ** a key 
21700 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6f 6e 65  equal to the one
21710 20 6d 75 6c 74 69 2d 63 75 72 73 6f 72 20 63 75   multi-cursor cu
21720 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
21730 6f 2e 20 52 65 63 6f 72 64 20 74 68 65 0a 20 20  o. Record the.  
21740 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72    ** page number
21750 20 6f 66 20 65 61 63 68 20 62 2d 74 72 65 65 20   of each b-tree 
21760 70 61 67 65 20 61 6e 64 20 74 68 65 20 6c 65 61  page and the lea
21770 66 2e 20 54 68 65 20 73 65 67 6d 65 6e 74 20 6d  f. The segment m
21780 61 79 20 62 65 0a 20 20 20 20 2a 2a 20 67 6f 62  ay be.    ** gob
21790 62 6c 65 64 20 75 70 20 74 6f 20 28 62 75 74 20  bled up to (but 
217a0 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 29 20 74  not including) t
217b0 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 73  he first of thes
217c0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 2e 0a  e page numbers..
217d0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
217e0 74 28 20 70 53 65 67 2d 3e 69 52 6f 6f 74 3e 30  t( pSeg->iRoot>0
217f0 20 29 3b 0a 20 20 20 20 61 50 67 20 3d 20 6c 73   );.    aPg = ls
21800 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63 28 70 44  mMallocZeroRc(pD
21810 62 2d 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28  b->pEnv, sizeof(
21820 50 67 6e 6f 29 2a 33 32 2c 20 26 72 63 29 3b 0a  Pgno)*32, &rc);.
21830 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f      if( rc==LSM_
21840 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
21850 20 73 65 65 6b 49 6e 42 74 72 65 65 28 70 43 73   seekInBtree(pCs
21860 72 2c 20 70 53 65 67 2c 20 0a 20 20 20 20 20 20  r, pSeg, .      
21870 20 20 20 20 72 74 54 6f 70 69 63 28 70 43 73 72      rtTopic(pCsr
21880 2d 3e 65 54 79 70 65 29 2c 20 70 43 73 72 2d 3e  ->eType), pCsr->
21890 6b 65 79 2e 70 44 61 74 61 2c 20 70 43 73 72 2d  key.pData, pCsr-
218a0 3e 6b 65 79 2e 6e 44 61 74 61 2c 20 61 50 67 2c  >key.nData, aPg,
218b0 20 30 0a 20 20 20 20 20 20 29 3b 20 0a 20 20 20   0.      ); .   
218c0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
218d0 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  LSM_OK ){.      
218e0 66 6f 72 28 6e 50 67 3d 30 3b 20 61 50 67 5b 6e  for(nPg=0; aPg[n
218f0 50 67 5d 3b 20 6e 50 67 2b 2b 29 3b 0a 20 20 20  Pg]; nPg++);.   
21900 20 20 20 6c 73 6d 46 73 47 6f 62 62 6c 65 28 70     lsmFsGobble(p
21910 44 62 2c 20 70 53 65 67 2c 20 61 50 67 2c 20 6e  Db, pSeg, aPg, n
21920 50 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Pg);.    }..    
21930 6c 73 6d 46 72 65 65 28 70 44 62 2d 3e 70 45 6e  lsmFree(pDb->pEn
21940 76 2c 20 61 50 67 29 3b 0a 20 20 7d 0a 20 20 72  v, aPg);.  }.  r
21950 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21960 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f  ** Argument p po
21970 69 6e 74 73 20 74 6f 20 61 20 6c 65 76 65 6c 20  ints to a level 
21980 6f 66 20 61 67 65 20 4e 2e 20 52 65 74 75 72 6e  of age N. Return
21990 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
219a0 65 76 65 6c 73 20 69 6e 0a 2a 2a 20 74 68 65 20  evels in.** the 
219b0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
219c0 74 69 6e 67 20 61 74 20 70 20 74 68 61 74 20 68  ting at p that h
219d0 61 76 65 20 61 67 65 3d 4e 20 28 61 6c 77 61 79  ave age=N (alway
219e0 73 20 61 74 20 6c 65 61 73 74 20 31 29 2e 0a 2a  s at least 1)..*
219f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72  /.static int sor
21a00 74 65 64 43 6f 75 6e 74 4c 65 76 65 6c 73 28 4c  tedCountLevels(L
21a10 65 76 65 6c 20 2a 70 29 7b 0a 20 20 69 6e 74 20  evel *p){.  int 
21a20 69 41 67 65 20 3d 20 70 2d 3e 69 41 67 65 3b 0a  iAge = p->iAge;.
21a30 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a    int nRet = 0;.
21a40 20 20 64 6f 20 7b 0a 20 20 20 20 6e 52 65 74 2b    do {.    nRet+
21a50 2b 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  +;.    p = p->pN
21a60 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  ext;.  }while( p
21a70 20 26 26 20 70 2d 3e 69 41 67 65 3d 3d 69 41 67   && p->iAge==iAg
21a80 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52  e );.  return nR
21a90 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  et;.}..static in
21aa0 74 20 73 6f 72 74 65 64 53 65 6c 65 63 74 4c 65  t sortedSelectLe
21ab0 76 65 6c 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c  vel(lsm_db *pDb,
21ac0 20 69 6e 74 20 6e 4d 65 72 67 65 2c 20 4c 65 76   int nMerge, Lev
21ad0 65 6c 20 2a 2a 70 70 4f 75 74 29 7b 0a 20 20 4c  el **ppOut){.  L
21ae0 65 76 65 6c 20 2a 70 54 6f 70 4c 65 76 65 6c 20  evel *pTopLevel 
21af0 3d 20 6c 73 6d 44 62 53 6e 61 70 73 68 6f 74 4c  = lsmDbSnapshotL
21b00 65 76 65 6c 28 70 44 62 2d 3e 70 57 6f 72 6b 65  evel(pDb->pWorke
21b10 72 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c  r);.  int rc = L
21b20 53 4d 5f 4f 4b 3b 0a 20 20 4c 65 76 65 6c 20 2a  SM_OK;.  Level *
21b30 70 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20 20 20  pLevel = 0;     
21b40 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
21b50 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 65 76 65   value */.  Leve
21b60 6c 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20  l *pBest = 0;   
21b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
21b80 74 20 6c 65 76 65 6c 20 74 6f 20 77 6f 72 6b 20  t level to work 
21b90 6f 6e 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  on found so far 
21ba0 2a 2f 0a 20 20 69 6e 74 20 6e 42 65 73 74 3b 20  */.  int nBest; 
21bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21bd0 73 65 67 6d 65 6e 74 73 20 6d 65 72 67 65 64 20  segments merged 
21be0 61 74 20 70 42 65 73 74 20 2a 2f 0a 20 20 4c 65  at pBest */.  Le
21bf0 76 65 6c 20 2a 70 54 68 69 73 20 3d 20 30 3b 20  vel *pThis = 0; 
21c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21c10 69 72 73 74 20 69 6e 20 72 75 6e 20 6f 66 20 6c  irst in run of l
21c20 65 76 65 6c 73 20 77 69 74 68 20 61 67 65 3d 69  evels with age=i
21c30 41 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68  Age */.  int nTh
21c40 69 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  is = 0;         
21c50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21c60 20 6f 66 20 6c 65 76 65 6c 73 20 73 74 61 72 74   of levels start
21c70 69 6e 67 20 61 74 20 70 54 68 69 73 20 2a 2f 0a  ing at pThis */.
21c80 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 65 72 67  .  assert( nMerg
21c90 65 3e 3d 31 20 29 3b 0a 20 20 6e 42 65 73 74 20  e>=1 );.  nBest 
21ca0 3d 20 4c 53 4d 5f 4d 41 58 28 31 2c 20 6e 4d 65  = LSM_MAX(1, nMe
21cb0 72 67 65 2d 31 29 3b 0a 0a 20 20 2f 2a 20 46 69  rge-1);..  /* Fi
21cc0 6e 64 20 74 68 65 20 6c 6f 6e 67 65 73 74 20 63  nd the longest c
21cd0 6f 6e 74 69 67 75 6f 75 73 20 72 75 6e 20 6f 66  ontiguous run of
21ce0 20 6c 65 76 65 6c 73 20 6e 6f 74 20 63 75 72 72   levels not curr
21cf0 65 6e 74 6c 79 20 75 6e 64 65 72 67 6f 69 6e 67  ently undergoing
21d00 20 61 20 0a 20 20 2a 2a 20 6d 65 72 67 65 20 77   a .  ** merge w
21d10 69 74 68 20 74 68 65 20 73 61 6d 65 20 61 67 65  ith the same age
21d20 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
21d30 65 2e 20 4f 72 20 74 68 65 20 6c 65 76 65 6c 20  e. Or the level 
21d40 62 65 69 6e 67 20 6d 65 72 67 65 64 0a 20 20 2a  being merged.  *
21d50 2a 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  * with the large
21d60 73 74 20 6e 75 6d 62 65 72 20 6f 66 20 72 69 67  st number of rig
21d70 68 74 2d 68 61 6e 64 20 73 65 67 6d 65 6e 74 73  ht-hand segments
21d80 2e 20 57 6f 72 6b 20 6f 6e 20 69 74 2e 20 2a 2f  . Work on it. */
21d90 0a 20 20 66 6f 72 28 70 4c 65 76 65 6c 3d 70 54  .  for(pLevel=pT
21da0 6f 70 4c 65 76 65 6c 3b 20 70 4c 65 76 65 6c 3b  opLevel; pLevel;
21db0 20 70 4c 65 76 65 6c 3d 70 4c 65 76 65 6c 2d 3e   pLevel=pLevel->
21dc0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
21dd0 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3d 3d  pLevel->nRight==
21de0 30 20 26 26 20 70 54 68 69 73 20 26 26 20 70 4c  0 && pThis && pL
21df0 65 76 65 6c 2d 3e 69 41 67 65 3d 3d 70 54 68 69  evel->iAge==pThi
21e00 73 2d 3e 69 41 67 65 20 29 7b 0a 20 20 20 20 20  s->iAge ){.     
21e10 20 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65   nThis++;.    }e
21e20 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  lse{.      if( n
21e30 54 68 69 73 3e 6e 42 65 73 74 20 29 7b 0a 20 20  This>nBest ){.  
21e40 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 76 65        if( (pLeve
21e50 6c 2d 3e 69 41 67 65 21 3d 70 54 68 69 73 2d 3e  l->iAge!=pThis->
21e60 69 41 67 65 2b 31 29 0a 20 20 20 20 20 20 20 20  iAge+1).        
21e70 20 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 6e 52 69   || (pLevel->nRi
21e80 67 68 74 3d 3d 30 20 26 26 20 73 6f 72 74 65 64  ght==0 && sorted
21e90 43 6f 75 6e 74 4c 65 76 65 6c 73 28 70 4c 65 76  CountLevels(pLev
21ea0 65 6c 29 3c 3d 70 44 62 2d 3e 6e 4d 65 72 67 65  el)<=pDb->nMerge
21eb0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
21ec0 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
21ed0 54 68 69 73 3b 0a 20 20 20 20 20 20 20 20 20 20  This;.          
21ee0 6e 42 65 73 74 20 3d 20 6e 54 68 69 73 3b 0a 20  nBest = nThis;. 
21ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21f00 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
21f10 6c 2d 3e 6e 52 69 67 68 74 20 29 7b 0a 20 20 20  l->nRight ){.   
21f20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
21f30 3e 6e 52 69 67 68 74 3e 6e 42 65 73 74 20 29 7b  >nRight>nBest ){
21f40 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65 73 74  .          nBest
21f50 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68   = pLevel->nRigh
21f60 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 65  t;.          pBe
21f70 73 74 20 3d 20 70 4c 65 76 65 6c 3b 0a 20 20 20  st = pLevel;.   
21f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
21f90 54 68 69 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  This = 0;.      
21fa0 20 20 70 54 68 69 73 20 3d 20 30 3b 0a 20 20 20    pThis = 0;.   
21fb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21fc0 20 20 70 54 68 69 73 20 3d 20 70 4c 65 76 65 6c    pThis = pLevel
21fd0 3b 0a 20 20 20 20 20 20 20 20 6e 54 68 69 73 20  ;.        nThis 
21fe0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
21ff0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 68   }.  }.  if( nTh
22000 69 73 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20  is>nBest ){.    
22010 61 73 73 65 72 74 28 20 70 54 68 69 73 20 29 3b  assert( pThis );
22020 0a 20 20 20 20 70 42 65 73 74 20 3d 20 70 54 68  .    pBest = pTh
22030 69 73 3b 0a 20 20 20 20 6e 42 65 73 74 20 3d 20  is;.    nBest = 
22040 6e 54 68 69 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  nThis;.  }..  if
22050 28 20 70 42 65 73 74 3d 3d 30 20 26 26 20 6e 4d  ( pBest==0 && nM
22060 65 72 67 65 3d 3d 31 20 29 7b 0a 20 20 20 20 69  erge==1 ){.    i
22070 6e 74 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  nt nFree = 0;.  
22080 20 20 69 6e 74 20 6e 55 73 72 20 3d 20 30 3b 0a    int nUsr = 0;.
22090 20 20 20 20 66 6f 72 28 70 4c 65 76 65 6c 3d 70      for(pLevel=p
220a0 54 6f 70 4c 65 76 65 6c 3b 20 70 4c 65 76 65 6c  TopLevel; pLevel
220b0 3b 20 70 4c 65 76 65 6c 3d 70 4c 65 76 65 6c 2d  ; pLevel=pLevel-
220c0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
220d0 73 73 65 72 74 28 20 21 70 4c 65 76 65 6c 2d 3e  ssert( !pLevel->
220e0 6e 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20  nRight );.      
220f0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
22100 73 20 26 20 4c 45 56 45 4c 5f 46 52 45 45 4c 49  s & LEVEL_FREELI
22110 53 54 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  ST_ONLY ){.     
22120 20 20 20 6e 46 72 65 65 2b 2b 3b 0a 20 20 20 20     nFree++;.    
22130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22140 20 6e 55 73 72 2b 2b 3b 0a 20 20 20 20 20 20 7d   nUsr++;.      }
22150 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
22160 55 73 72 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  Usr>1 ){.      p
22170 42 65 73 74 20 3d 20 70 54 6f 70 4c 65 76 65 6c  Best = pTopLevel
22180 3b 0a 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20  ;.      nBest = 
22190 6e 46 72 65 65 20 2b 20 6e 55 73 72 3b 0a 20 20  nFree + nUsr;.  
221a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
221b0 42 65 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Best ){.    if( 
221c0 70 42 65 73 74 2d 3e 6e 52 69 67 68 74 3d 3d 30  pBest->nRight==0
221d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
221e0 6f 72 74 65 64 4d 65 72 67 65 53 65 74 75 70 28  ortedMergeSetup(
221f0 70 44 62 2c 20 70 42 65 73 74 2c 20 6e 42 65 73  pDb, pBest, nBes
22200 74 2c 20 70 70 4f 75 74 29 3b 0a 20 20 20 20 7d  t, ppOut);.    }
22210 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 4f  else{.      *ppO
22220 75 74 20 3d 20 70 42 65 73 74 3b 0a 20 20 20 20  ut = pBest;.    
22230 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
22240 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
22250 74 20 73 6f 72 74 65 64 44 62 49 73 46 75 6c 6c  t sortedDbIsFull
22260 28 6c 73 6d 5f 64 62 20 2a 70 44 62 29 7b 0a 20  (lsm_db *pDb){. 
22270 20 4c 65 76 65 6c 20 2a 70 54 6f 70 20 3d 20 6c   Level *pTop = l
22280 73 6d 44 62 53 6e 61 70 73 68 6f 74 4c 65 76 65  smDbSnapshotLeve
22290 6c 28 70 44 62 2d 3e 70 57 6f 72 6b 65 72 29 3b  l(pDb->pWorker);
222a0 0a 0a 20 20 69 66 28 20 6c 73 6d 44 61 74 61 62  ..  if( lsmDatab
222b0 61 73 65 46 75 6c 6c 28 70 44 62 29 20 29 20 72  aseFull(pDb) ) r
222c0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
222d0 54 6f 70 20 26 26 20 70 54 6f 70 2d 3e 69 41 67  Top && pTop->iAg
222e0 65 3d 3d 30 0a 20 20 20 26 26 20 28 70 54 6f 70  e==0.   && (pTop
222f0 2d 3e 6e 52 69 67 68 74 20 7c 7c 20 73 6f 72 74  ->nRight || sort
22300 65 64 43 6f 75 6e 74 4c 65 76 65 6c 73 28 70 54  edCountLevels(pT
22310 6f 70 29 3e 3d 70 44 62 2d 3e 6e 4d 65 72 67 65  op)>=pDb->nMerge
22320 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
22330 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
22340 6e 20 30 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20  n 0;.}..typedef 
22350 73 74 72 75 63 74 20 4d 6f 76 65 42 6c 6f 63 6b  struct MoveBlock
22360 43 74 78 20 4d 6f 76 65 42 6c 6f 63 6b 43 74 78  Ctx MoveBlockCtx
22370 3b 0a 73 74 72 75 63 74 20 4d 6f 76 65 42 6c 6f  ;.struct MoveBlo
22380 63 6b 43 74 78 20 7b 0a 20 20 69 6e 74 20 69 53  ckCtx {.  int iS
22390 65 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  een;            
223a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
223b0 76 69 6f 75 73 20 66 72 65 65 20 62 6c 6f 63 6b  vious free block
223c0 20 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e   on list */.  in
223d0 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  t iFrom;        
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
223f0 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
22400 20 62 6c 6f 63 6b 73 20 69 6e 20 66 69 6c 65 20   blocks in file 
22410 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e  */.};..static in
22420 74 20 6d 6f 76 65 42 6c 6f 63 6b 43 62 28 76 6f  t moveBlockCb(vo
22430 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 69 42  id *pCtx, int iB
22440 6c 6b 2c 20 69 36 34 20 69 53 6e 61 70 73 68 6f  lk, i64 iSnapsho
22450 74 29 7b 0a 20 20 4d 6f 76 65 42 6c 6f 63 6b 43  t){.  MoveBlockC
22460 74 78 20 2a 70 20 3d 20 28 4d 6f 76 65 42 6c 6f  tx *p = (MoveBlo
22470 63 6b 43 74 78 20 2a 29 70 43 74 78 3b 0a 20 20  ckCtx *)pCtx;.  
22480 61 73 73 65 72 74 28 20 70 2d 3e 69 46 72 6f 6d  assert( p->iFrom
22490 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 42 6c  ==0 );.  if( iBl
224a0 6b 3d 3d 28 70 2d 3e 69 53 65 65 6e 2d 31 29 20  k==(p->iSeen-1) 
224b0 29 7b 0a 20 20 20 20 70 2d 3e 69 53 65 65 6e 20  ){.    p->iSeen 
224c0 3d 20 69 42 6c 6b 3b 0a 20 20 20 20 72 65 74 75  = iBlk;.    retu
224d0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  rn 0;.  }.  p->i
224e0 46 72 6f 6d 20 3d 20 70 2d 3e 69 53 65 65 6e 2d  From = p->iSeen-
224f0 31 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  1;.  return 1;.}
22500 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
22510 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
22520 74 6f 20 66 75 72 74 68 65 72 20 63 6f 6d 70 61  to further compa
22530 63 74 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  ct a database fo
22540 72 20 77 68 69 63 68 20 61 6c 6c 20 0a 2a 2a 20  r which all .** 
22550 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 68  of the content h
22560 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
22570 6d 65 72 67 65 64 20 69 6e 74 6f 20 61 20 73 69  merged into a si
22580 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2e 20 49 66  ngle segment. If
22590 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 69   .** possible, i
225a0 74 20 6d 6f 76 65 73 20 74 68 65 20 63 6f 6e 74  t moves the cont
225b0 65 6e 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ents of a single
225c0 20 62 6c 6f 63 6b 20 66 72 6f 6d 20 74 68 65 20   block from the 
225d0 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  end of the.** fi
225e0 6c 65 20 74 6f 20 61 20 66 72 65 65 2d 62 6c 6f  le to a free-blo
225f0 63 6b 20 74 68 61 74 20 6c 69 65 73 20 63 6c 6f  ck that lies clo
22600 73 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ser to the start
22610 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 61 6c   of the file (al
22620 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  lowing.** the fi
22630 6c 65 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61  le to be eventua
22640 6c 6c 79 20 74 72 75 6e 63 61 74 65 64 29 2e 0a  lly truncated)..
22650 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f  */.static int so
22660 72 74 65 64 4d 6f 76 65 42 6c 6f 63 6b 28 6c 73  rtedMoveBlock(ls
22670 6d 5f 64 62 20 2a 70 44 62 2c 20 69 6e 74 20 2a  m_db *pDb, int *
22680 70 6e 57 72 69 74 65 29 7b 0a 20 20 53 6e 61 70  pnWrite){.  Snap
22690 73 68 6f 74 20 2a 70 20 3d 20 70 44 62 2d 3e 70  shot *p = pDb->p
226a0 57 6f 72 6b 65 72 3b 0a 20 20 4c 65 76 65 6c 20  Worker;.  Level 
226b0 2a 70 4c 76 6c 20 3d 20 6c 73 6d 44 62 53 6e 61  *pLvl = lsmDbSna
226c0 70 73 68 6f 74 4c 65 76 65 6c 28 70 29 3b 0a 20  pshotLevel(p);. 
226d0 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20   int iFrom;     
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 20 2f 2a 20 42 6c 6f 63 6b 20 74 6f 20 6d 6f 76   /* Block to mov
22700 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 3b 20  e */.  int iTo; 
22710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22720 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e         /* Destin
22730 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 62 6c  ation to move bl
22740 6f 63 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ock to */.  int 
22750 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
22760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22770 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
22780 20 4d 6f 76 65 42 6c 6f 63 6b 43 74 78 20 73 43   MoveBlockCtx sC
22790 74 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  tx;..  assert( p
227a0 4c 76 6c 2d 3e 70 4e 65 78 74 3d 3d 30 20 26 26  Lvl->pNext==0 &&
227b0 20 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 3d 3d 30   pLvl->nRight==0
227c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
227d0 3e 72 65 64 69 72 65 63 74 2e 6e 3c 3d 4c 53 4d  >redirect.n<=LSM
227e0 5f 4d 41 58 5f 42 4c 4f 43 4b 5f 52 45 44 49 52  _MAX_BLOCK_REDIR
227f0 45 43 54 53 20 29 3b 0a 0a 20 20 2a 70 6e 57 72  ECTS );..  *pnWr
22800 69 74 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  ite = 0;..  /* C
22810 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65  heck that the re
22820 64 69 72 65 63 74 20 61 72 72 61 79 20 69 73 20  direct array is 
22830 6e 6f 74 20 61 6c 72 65 61 64 79 20 66 75 6c 6c  not already full
22840 2e 20 49 66 20 69 74 20 69 73 2c 20 72 65 74 75  . If it is, retu
22850 72 6e 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  rn.  ** without 
22860 6d 6f 76 69 6e 67 20 61 6e 79 20 64 61 74 61 62  moving any datab
22870 61 73 65 20 63 6f 6e 74 65 6e 74 2e 20 20 2a 2f  ase content.  */
22880 0a 20 20 69 66 28 20 70 2d 3e 72 65 64 69 72 65  .  if( p->redire
22890 63 74 2e 6e 3e 3d 4c 53 4d 5f 4d 41 58 5f 42 4c  ct.n>=LSM_MAX_BL
228a0 4f 43 4b 5f 52 45 44 49 52 45 43 54 53 20 29 20  OCK_REDIRECTS ) 
228b0 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 0a  return LSM_OK;..
228c0 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 61    /* Find the la
228d0 73 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 6e 74  st block of cont
228e0 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
228f0 61 73 65 20 66 69 6c 65 2e 20 44 6f 20 74 68 69  ase file. Do thi
22900 73 20 62 79 20 0a 20 20 2a 2a 20 74 72 61 76 65  s by .  ** trave
22910 72 73 69 6e 67 20 74 68 65 20 66 72 65 65 2d 6c  rsing the free-l
22920 69 73 74 20 69 6e 20 72 65 76 65 72 73 65 20 28  ist in reverse (
22930 64 65 73 63 65 6e 64 69 6e 67 20 62 6c 6f 63 6b  descending block
22940 20 6e 75 6d 62 65 72 29 20 6f 72 64 65 72 2e 0a   number) order..
22950 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62    ** The first b
22960 6c 6f 63 6b 20 6e 6f 74 20 6f 6e 20 74 68 65 20  lock not on the 
22970 66 72 65 65 20 6c 69 73 74 20 69 73 20 74 68 65  free list is the
22980 20 6f 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 62   one that will b
22990 65 20 6d 6f 76 65 64 2e 0a 20 20 2a 2a 20 53 69  e moved..  ** Si
229a0 6e 63 65 20 74 68 65 20 64 62 20 63 6f 6e 73 69  nce the db consi
229b0 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
229c0 73 65 67 6d 65 6e 74 2c 20 74 68 65 72 65 20 69  segment, there i
229d0 73 20 6e 6f 20 61 6d 62 69 67 75 69 74 79 20 61  s no ambiguity a
229e0 73 0a 20 20 2a 2a 20 74 6f 20 77 68 69 63 68 20  s.  ** to which 
229f0 73 65 67 6d 65 6e 74 20 74 68 65 20 62 6c 6f 63  segment the bloc
22a00 6b 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 20 20 2a  k belongs to.  *
22a10 2f 0a 20 20 73 43 74 78 2e 69 53 65 65 6e 20 3d  /.  sCtx.iSeen =
22a20 20 70 2d 3e 6e 42 6c 6f 63 6b 2b 31 3b 0a 20 20   p->nBlock+1;.  
22a30 73 43 74 78 2e 69 46 72 6f 6d 20 3d 20 30 3b 0a  sCtx.iFrom = 0;.
22a40 20 20 72 63 20 3d 20 6c 73 6d 57 61 6c 6b 46 72    rc = lsmWalkFr
22a50 65 65 6c 69 73 74 28 70 44 62 2c 20 31 2c 20 6d  eelist(pDb, 1, m
22a60 6f 76 65 42 6c 6f 63 6b 43 62 2c 20 26 73 43 74  oveBlockCb, &sCt
22a70 78 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 4c 53  x);.  if( rc!=LS
22a80 4d 5f 4f 4b 20 7c 7c 20 73 43 74 78 2e 69 46 72  M_OK || sCtx.iFr
22a90 6f 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  om==0 ) return r
22aa0 63 3b 0a 20 20 69 46 72 6f 6d 20 3d 20 73 43 74  c;.  iFrom = sCt
22ab0 78 2e 69 46 72 6f 6d 3b 0a 0a 20 20 2f 2a 20 46  x.iFrom;..  /* F
22ac0 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 66 72  ind the first fr
22ad0 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74 68 65 20  ee block in the 
22ae0 64 61 74 61 62 61 73 65 2c 20 69 67 6e 6f 72 69  database, ignori
22af0 6e 67 20 62 6c 6f 63 6b 20 31 2e 20 42 6c 6f 63  ng block 1. Bloc
22b00 6b 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 69 63  k.  ** 1 is tric
22b10 6b 79 20 61 73 20 69 74 20 69 73 20 73 6d 61 6c  ky as it is smal
22b20 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 74 68  ler than the oth
22b30 65 72 20 62 6c 6f 63 6b 73 2e 20 20 2a 2f 0a 20  er blocks.  */. 
22b40 20 72 63 20 3d 20 6c 73 6d 42 6c 6f 63 6b 41 6c   rc = lsmBlockAl
22b50 6c 6f 63 61 74 65 28 70 44 62 2c 20 69 46 72 6f  locate(pDb, iFro
22b60 6d 2c 20 26 69 54 6f 29 3b 0a 20 20 69 66 28 20  m, &iTo);.  if( 
22b70 72 63 21 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 69 54  rc!=LSM_OK || iT
22b80 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  o==0 ) return rc
22b90 3b 0a 20 20 61 73 73 65 72 74 28 20 69 54 6f 21  ;.  assert( iTo!
22ba0 3d 31 20 26 26 20 69 54 6f 3c 69 46 72 6f 6d 20  =1 && iTo<iFrom 
22bb0 29 3b 0a 0a 20 20 72 63 20 3d 20 6c 73 6d 46 73  );..  rc = lsmFs
22bc0 4d 6f 76 65 42 6c 6f 63 6b 28 70 44 62 2d 3e 70  MoveBlock(pDb->p
22bd0 46 53 2c 20 26 70 4c 76 6c 2d 3e 6c 68 73 2c 20  FS, &pLvl->lhs, 
22be0 69 54 6f 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 69  iTo, iFrom);.  i
22bf0 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc==LSM_OK ){
22c00 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 65 64 69  .    if( p->redi
22c10 72 65 63 74 2e 61 3d 3d 30 20 29 7b 0a 20 20 20  rect.a==0 ){.   
22c20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
22c30 69 7a 65 6f 66 28 73 74 72 75 63 74 20 52 65 64  izeof(struct Red
22c40 69 72 65 63 74 45 6e 74 72 79 29 20 2a 20 4c 53  irectEntry) * LS
22c50 4d 5f 4d 41 58 5f 42 4c 4f 43 4b 5f 52 45 44 49  M_MAX_BLOCK_REDI
22c60 52 45 43 54 53 3b 0a 20 20 20 20 20 20 70 2d 3e  RECTS;.      p->
22c70 72 65 64 69 72 65 63 74 2e 61 20 3d 20 6c 73 6d  redirect.a = lsm
22c80 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63 28 70 44 62  MallocZeroRc(pDb
22c90 2d 3e 70 45 6e 76 2c 20 6e 42 79 74 65 2c 20 26  ->pEnv, nByte, &
22ca0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rc);.    }.    i
22cb0 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc==LSM_OK ){
22cc0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
22cd0 20 69 66 20 74 68 65 20 62 6c 6f 63 6b 20 6a 75   if the block ju
22ce0 73 74 20 6d 6f 76 65 64 20 77 61 73 20 61 6c 72  st moved was alr
22cf0 65 61 64 79 20 72 65 64 69 72 65 63 74 65 64 2e  eady redirected.
22d00 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
22d10 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
22d20 69 3c 70 2d 3e 72 65 64 69 72 65 63 74 2e 6e 3b  i<p->redirect.n;
22d30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
22d40 66 28 20 70 2d 3e 72 65 64 69 72 65 63 74 2e 61  f( p->redirect.a
22d50 5b 69 5d 2e 69 54 6f 3d 3d 69 46 72 6f 6d 20 29  [i].iTo==iFrom )
22d60 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
22d70 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 2d  .      if( i==p-
22d80 3e 72 65 64 69 72 65 63 74 2e 6e 20 29 7b 0a 20  >redirect.n ){. 
22d90 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20         /* Block 
22da0 69 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 6c  iFrom was not al
22db0 72 65 61 64 79 20 72 65 64 69 72 65 63 74 65 64  ready redirected
22dc0 2e 20 41 64 64 20 61 20 6e 65 77 20 61 72 72 61  . Add a new arra
22dd0 79 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 20 20  y entry. */.    
22de0 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 2d 3e      memmove(&p->
22df0 72 65 64 69 72 65 63 74 2e 61 5b 31 5d 2c 20 26  redirect.a[1], &
22e00 70 2d 3e 72 65 64 69 72 65 63 74 2e 61 5b 30 5d  p->redirect.a[0]
22e10 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  , .            s
22e20 69 7a 65 6f 66 28 73 74 72 75 63 74 20 52 65 64  izeof(struct Red
22e30 69 72 65 63 74 45 6e 74 72 79 29 20 2a 20 70 2d  irectEntry) * p-
22e40 3e 72 65 64 69 72 65 63 74 2e 6e 0a 20 20 20 20  >redirect.n.    
22e50 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
22e60 20 20 20 70 2d 3e 72 65 64 69 72 65 63 74 2e 61     p->redirect.a
22e70 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 69 46 72 6f  [0].iFrom = iFro
22e80 6d 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65  m;.        p->re
22e90 64 69 72 65 63 74 2e 61 5b 30 5d 2e 69 54 6f 20  direct.a[0].iTo 
22ea0 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20 20 20 70  = iTo;.        p
22eb0 2d 3e 72 65 64 69 72 65 63 74 2e 6e 2b 2b 3b 0a  ->redirect.n++;.
22ec0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22ed0 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 46       /* Block iF
22ee0 72 6f 6d 20 77 61 73 20 61 6c 72 65 61 64 79 20  rom was already 
22ef0 72 65 64 69 72 65 63 74 65 64 2e 20 4f 76 65 72  redirected. Over
22f00 77 72 69 74 65 20 65 78 69 73 74 69 6e 67 20 65  write existing e
22f10 6e 74 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ntry. */.       
22f20 20 70 2d 3e 72 65 64 69 72 65 63 74 2e 61 5b 69   p->redirect.a[i
22f30 5d 2e 69 54 6f 20 3d 20 69 54 6f 3b 0a 20 20 20  ].iTo = iTo;.   
22f40 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d     }..      rc =
22f50 20 6c 73 6d 42 6c 6f 63 6b 46 72 65 65 28 70 44   lsmBlockFree(pD
22f60 62 2c 20 69 46 72 6f 6d 29 3b 0a 0a 20 20 20 20  b, iFrom);..    
22f70 20 20 2a 70 6e 57 72 69 74 65 20 3d 20 6c 73 6d    *pnWrite = lsm
22f80 46 73 42 6c 6f 63 6b 53 69 7a 65 28 70 44 62 2d  FsBlockSize(pDb-
22f90 3e 70 46 53 29 20 2f 20 6c 73 6d 46 73 50 61 67  >pFS) / lsmFsPag
22fa0 65 53 69 7a 65 28 70 44 62 2d 3e 70 46 53 29 3b  eSize(pDb->pFS);
22fb0 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6c 68 73  .      pLvl->lhs
22fc0 2e 70 52 65 64 69 72 65 63 74 20 3d 20 26 70 2d  .pRedirect = &p-
22fd0 3e 72 65 64 69 72 65 63 74 3b 0a 20 20 20 20 7d  >redirect;.    }
22fe0 0a 20 20 7d 0a 0a 23 69 66 20 4c 53 4d 5f 4c 4f  .  }..#if LSM_LO
22ff0 47 5f 53 54 52 55 43 54 55 52 45 0a 20 20 69 66  G_STRUCTURE.  if
23000 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
23010 20 20 20 20 63 68 61 72 20 61 42 75 66 5b 36 34      char aBuf[64
23020 5d 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 61  ];.    sprintf(a
23030 42 75 66 2c 20 22 6d 6f 76 65 2d 62 6c 6f 63 6b  Buf, "move-block
23040 20 25 64 2f 25 64 22 2c 20 70 2d 3e 72 65 64 69   %d/%d", p->redi
23050 72 65 63 74 2e 6e 2d 31 2c 20 4c 53 4d 5f 4d 41  rect.n-1, LSM_MA
23060 58 5f 42 4c 4f 43 4b 5f 52 45 44 49 52 45 43 54  X_BLOCK_REDIRECT
23070 53 29 3b 0a 20 20 20 20 6c 73 6d 53 6f 72 74 65  S);.    lsmSorte
23080 64 44 75 6d 70 53 74 72 75 63 74 75 72 65 28 70  dDumpStructure(p
23090 44 62 2c 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72  Db, pDb->pWorker
230a0 2c 20 4c 53 4d 5f 4c 4f 47 5f 44 41 54 41 2c 20  , LSM_LOG_DATA, 
230b0 30 2c 20 61 42 75 66 29 3b 0a 20 20 7d 0a 23 65  0, aBuf);.  }.#e
230c0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
230d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2f 0a 73 74 61 74 69  ;.}../*.*/.stati
230e0 63 20 69 6e 74 20 6d 65 72 67 65 49 6e 73 65 72  c int mergeInser
230f0 74 46 72 65 65 6c 69 73 74 53 65 67 6d 65 6e 74  tFreelistSegment
23100 73 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62  s(.  lsm_db *pDb
23110 2c 20 0a 20 20 69 6e 74 20 6e 46 72 65 65 2c 0a  , .  int nFree,.
23120 20 20 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70    MergeWorker *p
23130 4d 57 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  MW.){.  int rc =
23140 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 66 28 20 6e   LSM_OK;.  if( n
23150 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 4d 75  Free>0 ){.    Mu
23160 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ltiCursor *pCsr 
23170 3d 20 70 4d 57 2d 3e 70 43 73 72 3b 0a 20 20 20  = pMW->pCsr;.   
23180 20 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 70   Level *pLvl = p
23190 4d 57 2d 3e 70 4c 65 76 65 6c 3b 0a 20 20 20 20  MW->pLevel;.    
231a0 53 65 67 6d 65 6e 74 50 74 72 20 2a 61 4e 65 77  SegmentPtr *aNew
231b0 31 3b 0a 20 20 20 20 53 65 67 6d 65 6e 74 20 2a  1;.    Segment *
231c0 61 4e 65 77 32 3b 0a 0a 20 20 20 20 4c 65 76 65  aNew2;..    Leve
231d0 6c 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 4c 65  l *pIter;.    Le
231e0 76 65 6c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  vel *pNext;.    
231f0 69 6e 74 20 69 20 3d 20 30 3b 0a 0a 20 20 20 20  int i = 0;..    
23200 61 4e 65 77 31 20 3d 20 28 53 65 67 6d 65 6e 74  aNew1 = (Segment
23210 50 74 72 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a  Ptr *)lsmMallocZ
23220 65 72 6f 52 63 28 0a 20 20 20 20 20 20 20 20 70  eroRc(.        p
23230 44 62 2d 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66  Db->pEnv, sizeof
23240 28 53 65 67 6d 65 6e 74 50 74 72 29 20 2a 20 28  (SegmentPtr) * (
23250 70 43 73 72 2d 3e 6e 50 74 72 2b 6e 46 72 65 65  pCsr->nPtr+nFree
23260 29 2c 20 26 72 63 0a 20 20 20 20 29 3b 0a 20 20  ), &rc.    );.  
23270 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
23280 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 63 70 79  n rc;.    memcpy
23290 28 26 61 4e 65 77 31 5b 6e 46 72 65 65 5d 2c 20  (&aNew1[nFree], 
232a0 70 43 73 72 2d 3e 61 50 74 72 2c 20 73 69 7a 65  pCsr->aPtr, size
232b0 6f 66 28 53 65 67 6d 65 6e 74 50 74 72 29 2a 70  of(SegmentPtr)*p
232c0 43 73 72 2d 3e 6e 50 74 72 29 3b 0a 20 20 20 20  Csr->nPtr);.    
232d0 70 43 73 72 2d 3e 6e 50 74 72 20 2b 3d 20 6e 46  pCsr->nPtr += nF
232e0 72 65 65 3b 0a 20 20 20 20 6c 73 6d 46 72 65 65  ree;.    lsmFree
232f0 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70 43 73 72  (pDb->pEnv, pCsr
23300 2d 3e 61 54 72 65 65 29 3b 0a 20 20 20 20 6c 73  ->aTree);.    ls
23310 6d 46 72 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c  mFree(pDb->pEnv,
23320 20 70 43 73 72 2d 3e 61 50 74 72 29 3b 0a 20 20   pCsr->aPtr);.  
23330 20 20 70 43 73 72 2d 3e 61 54 72 65 65 20 3d 20    pCsr->aTree = 
23340 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 50 74  0;.    pCsr->aPt
23350 72 20 3d 20 61 4e 65 77 31 3b 0a 0a 20 20 20 20  r = aNew1;..    
23360 61 4e 65 77 32 20 3d 20 28 53 65 67 6d 65 6e 74  aNew2 = (Segment
23370 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f   *)lsmMallocZero
23380 52 63 28 0a 20 20 20 20 20 20 20 20 70 44 62 2d  Rc(.        pDb-
23390 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28 53 65  >pEnv, sizeof(Se
233a0 67 6d 65 6e 74 29 20 2a 20 28 70 4c 76 6c 2d 3e  gment) * (pLvl->
233b0 6e 52 69 67 68 74 2b 6e 46 72 65 65 29 2c 20 26  nRight+nFree), &
233c0 72 63 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  rc.    );.    if
233d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
233e0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4e  ;.    memcpy(&aN
233f0 65 77 32 5b 6e 46 72 65 65 5d 2c 20 70 4c 76 6c  ew2[nFree], pLvl
23400 2d 3e 61 52 68 73 2c 20 73 69 7a 65 6f 66 28 53  ->aRhs, sizeof(S
23410 65 67 6d 65 6e 74 29 2a 70 4c 76 6c 2d 3e 6e 52  egment)*pLvl->nR
23420 69 67 68 74 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  ight);.    pLvl-
23430 3e 6e 52 69 67 68 74 20 2b 3d 20 6e 46 72 65 65  >nRight += nFree
23440 3b 0a 20 20 20 20 6c 73 6d 46 72 65 65 28 70 44  ;.    lsmFree(pD
23450 62 2d 3e 70 45 6e 76 2c 20 70 4c 76 6c 2d 3e 61  b->pEnv, pLvl->a
23460 52 68 73 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  Rhs);.    pLvl->
23470 61 52 68 73 20 3d 20 61 4e 65 77 32 3b 0a 0a 20  aRhs = aNew2;.. 
23480 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 44 62     for(pIter=pDb
23490 2d 3e 70 57 6f 72 6b 65 72 2d 3e 70 4c 65 76 65  ->pWorker->pLeve
234a0 6c 3b 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  l; rc==LSM_OK &&
234b0 20 70 49 74 65 72 21 3d 70 4c 76 6c 3b 20 70 49   pIter!=pLvl; pI
234c0 74 65 72 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ter=pNext){.    
234d0 20 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20    Segment *pSeg 
234e0 3d 20 26 70 4c 76 6c 2d 3e 61 52 68 73 5b 69 5d  = &pLvl->aRhs[i]
234f0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
23500 53 65 67 2c 20 26 70 49 74 65 72 2d 3e 6c 68 73  Seg, &pIter->lhs
23510 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74  , sizeof(Segment
23520 29 29 3b 0a 0a 20 20 20 20 20 20 70 43 73 72 2d  ));..      pCsr-
23530 3e 61 50 74 72 5b 69 5d 2e 70 53 65 67 20 3d 20  >aPtr[i].pSeg = 
23540 70 53 65 67 3b 0a 20 20 20 20 20 20 70 43 73 72  pSeg;.      pCsr
23550 2d 3e 61 50 74 72 5b 69 5d 2e 70 4c 65 76 65 6c  ->aPtr[i].pLevel
23560 20 3d 20 70 4c 76 6c 3b 0a 20 20 20 20 20 20 72   = pLvl;.      r
23570 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 45 6e  c = segmentPtrEn
23580 64 28 70 43 73 72 2c 20 26 70 43 73 72 2d 3e 61  d(pCsr, &pCsr->a
23590 50 74 72 5b 69 5d 2c 20 30 29 3b 0a 0a 20 20 20  Ptr[i], 0);..   
235a0 20 20 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2d     pDb->pWorker-
235b0 3e 70 4c 65 76 65 6c 20 3d 20 70 4e 65 78 74 20  >pLevel = pNext 
235c0 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 3b 0a  = pIter->pNext;.
235d0 20 20 20 20 20 20 73 6f 72 74 65 64 46 72 65 65        sortedFree
235e0 4c 65 76 65 6c 28 70 44 62 2d 3e 70 45 6e 76 2c  Level(pDb->pEnv,
235f0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69   pIter);.      i
23600 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ++;.    }.    as
23610 73 65 72 74 28 20 69 3d 3d 6e 46 72 65 65 20 29  sert( i==nFree )
23620 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
23630 21 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 70 44 62 2d  !=LSM_OK || pDb-
23640 3e 70 57 6f 72 6b 65 72 2d 3e 70 4c 65 76 65 6c  >pWorker->pLevel
23650 3d 3d 70 4c 76 6c 20 29 3b 0a 0a 20 20 20 20 66  ==pLvl );..    f
23660 6f 72 28 69 3d 6e 46 72 65 65 3b 20 69 3c 70 43  or(i=nFree; i<pC
23670 73 72 2d 3e 6e 50 74 72 3b 20 69 2b 2b 29 7b 0a  sr->nPtr; i++){.
23680 20 20 20 20 20 20 70 43 73 72 2d 3e 61 50 74 72        pCsr->aPtr
23690 5b 69 5d 2e 70 53 65 67 20 3d 20 26 70 4c 76 6c  [i].pSeg = &pLvl
236a0 2d 3e 61 52 68 73 5b 69 5d 3b 0a 20 20 20 20 7d  ->aRhs[i];.    }
236b0 0a 0a 20 20 20 20 6c 73 6d 46 72 65 65 28 70 44  ..    lsmFree(pD
236c0 62 2d 3e 70 45 6e 76 2c 20 70 4d 57 2d 3e 61 47  b->pEnv, pMW->aG
236d0 6f 62 62 6c 65 29 3b 0a 20 20 20 20 70 4d 57 2d  obble);.    pMW-
236e0 3e 61 47 6f 62 62 6c 65 20 3d 20 30 3b 0a 20 20  >aGobble = 0;.  
236f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
23700 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72  ..static int sor
23710 74 65 64 57 6f 72 6b 28 0a 20 20 6c 73 6d 5f 64  tedWork(.  lsm_d
23720 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20  b *pDb,         
23730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
23740 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 4d  tabase handle. M
23750 75 73 74 20 62 65 20 77 6f 72 6b 65 72 2e 20 2a  ust be worker. *
23760 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 2c 20 20  /.  int nWork,  
23770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23780 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23790 20 70 61 67 65 73 20 6f 66 20 77 6f 72 6b 20 74   pages of work t
237a0 6f 20 64 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  o do */.  int nM
237b0 65 72 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  erge,           
237c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 79            /* Try
237d0 20 74 6f 20 6d 65 72 67 65 20 74 68 69 73 20 6d   to merge this m
237e0 61 6e 79 20 6c 65 76 65 6c 73 20 61 74 20 6f 6e  any levels at on
237f0 63 65 20 2a 2f 0a 20 20 69 6e 74 20 62 46 6c 75  ce */.  int bFlu
23800 73 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sh,             
23810 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69          /* Set i
23820 66 20 63 61 6c 6c 20 69 73 20 74 6f 20 6d 61 6b  f call is to mak
23830 65 20 72 6f 6f 6d 20 66 6f 72 20 61 20 66 6c 75  e room for a flu
23840 73 68 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 57  sh */.  int *pnW
23850 72 69 74 65 20 20 20 20 20 20 20 20 20 20 20 20  rite            
23860 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
23870 41 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66  Actual number of
23880 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a   pages written *
23890 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
238a0 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  LSM_OK;         
238b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
238c0 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
238d0 52 65 6d 61 69 6e 69 6e 67 20 3d 20 6e 57 6f 72  Remaining = nWor
238e0 6b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  k;         /* Un
238f0 69 74 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64  its of work to d
23900 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  o before returni
23910 6e 67 20 2a 2f 0a 20 20 53 6e 61 70 73 68 6f 74  ng */.  Snapshot
23920 20 2a 70 57 6f 72 6b 65 72 20 3d 20 70 44 62 2d   *pWorker = pDb-
23930 3e 70 57 6f 72 6b 65 72 3b 0a 0a 20 20 61 73 73  >pWorker;..  ass
23940 65 72 74 28 20 70 57 6f 72 6b 65 72 20 29 3b 0a  ert( pWorker );.
23950 20 20 69 66 28 20 6c 73 6d 44 62 53 6e 61 70 73    if( lsmDbSnaps
23960 68 6f 74 4c 65 76 65 6c 28 70 57 6f 72 6b 65 72  hotLevel(pWorker
23970 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 4c 53  )==0 ) return LS
23980 4d 5f 4f 4b 3b 0a 0a 20 20 77 68 69 6c 65 28 20  M_OK;..  while( 
23990 6e 52 65 6d 61 69 6e 69 6e 67 3e 30 20 29 7b 0a  nRemaining>0 ){.
239a0 20 20 20 20 4c 65 76 65 6c 20 2a 70 4c 65 76 65      Level *pLeve
239b0 6c 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46  l = 0;..    /* F
239c0 69 6e 64 20 61 20 6c 65 76 65 6c 20 74 6f 20 77  ind a level to w
239d0 6f 72 6b 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72  ork on. */.    r
239e0 63 20 3d 20 73 6f 72 74 65 64 53 65 6c 65 63 74  c = sortedSelect
239f0 4c 65 76 65 6c 28 70 44 62 2c 20 6e 4d 65 72 67  Level(pDb, nMerg
23a00 65 2c 20 26 70 4c 65 76 65 6c 29 3b 0a 20 20 20  e, &pLevel);.   
23a10 20 61 73 73 65 72 74 28 20 72 63 3d 3d 4c 53 4d   assert( rc==LSM
23a20 5f 4f 4b 20 7c 7c 20 70 4c 65 76 65 6c 3d 3d 30  _OK || pLevel==0
23a30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65   );..    if( pLe
23a40 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  vel==0 ){.      
23a50 69 6e 74 20 6e 44 6f 6e 65 20 3d 20 30 3b 0a 20  int nDone = 0;. 
23a60 20 20 20 20 20 4c 65 76 65 6c 20 2a 70 54 6f 70       Level *pTop
23a70 4c 65 76 65 6c 20 3d 20 6c 73 6d 44 62 53 6e 61  Level = lsmDbSna
23a80 70 73 68 6f 74 4c 65 76 65 6c 28 70 44 62 2d 3e  pshotLevel(pDb->
23a90 70 57 6f 72 6b 65 72 29 3b 0a 20 20 20 20 20 20  pWorker);.      
23aa0 69 66 28 20 62 46 6c 75 73 68 3d 3d 30 20 26 26  if( bFlush==0 &&
23ab0 20 6e 4d 65 72 67 65 3d 3d 31 20 26 26 20 70 54   nMerge==1 && pT
23ac0 6f 70 4c 65 76 65 6c 20 26 26 20 70 54 6f 70 4c  opLevel && pTopL
23ad0 65 76 65 6c 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  evel->pNext==0 )
23ae0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
23af0 6f 72 74 65 64 4d 6f 76 65 42 6c 6f 63 6b 28 70  ortedMoveBlock(p
23b00 44 62 2c 20 26 6e 44 6f 6e 65 29 3b 0a 20 20 20  Db, &nDone);.   
23b10 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 6d 61     }.      nRema
23b20 69 6e 69 6e 67 20 2d 3d 20 6e 44 6f 6e 65 3b 0a  ining -= nDone;.
23b30 0a 20 20 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20  .      /* Could 
23b40 6e 6f 74 20 66 69 6e 64 20 61 6e 79 20 77 6f 72  not find any wor
23b50 6b 20 74 6f 20 64 6f 2e 20 46 69 6e 69 73 68 65  k to do. Finishe
23b60 64 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  d. */.      if( 
23b70 6e 44 6f 6e 65 3d 3d 30 20 29 20 62 72 65 61 6b  nDone==0 ) break
23b80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23b90 20 20 20 69 6e 74 20 62 53 61 76 65 20 3d 20 30     int bSave = 0
23ba0 3b 0a 20 20 20 20 20 20 46 72 65 65 6c 69 73 74  ;.      Freelist
23bb0 20 66 72 65 65 6c 69 73 74 20 3d 20 7b 30 2c 20   freelist = {0, 
23bc0 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20 4d 65 72  0, 0};.      Mer
23bd0 67 65 57 6f 72 6b 65 72 20 6d 65 72 67 65 77 6f  geWorker mergewo
23be0 72 6b 65 72 3b 20 20 20 20 2f 2a 20 53 74 61 74  rker;    /* Stat
23bf0 65 20 75 73 65 64 20 74 6f 20 77 6f 72 6b 20 6f  e used to work o
23c00 6e 20 74 68 65 20 6c 65 76 65 6c 20 6d 65 72 67  n the level merg
23c10 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
23c20 72 74 28 20 70 44 62 2d 3e 62 49 6e 63 72 4d 65  rt( pDb->bIncrMe
23c30 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rge==0 );.      
23c40 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 46 72  assert( pDb->pFr
23c50 65 65 6c 69 73 74 3d 3d 30 20 26 26 20 70 44 62  eelist==0 && pDb
23c60 2d 3e 62 55 73 65 46 72 65 65 6c 69 73 74 3d 3d  ->bUseFreelist==
23c70 30 20 29 3b 0a 0a 20 20 20 20 20 20 70 44 62 2d  0 );..      pDb-
23c80 3e 62 49 6e 63 72 4d 65 72 67 65 20 3d 20 31 3b  >bIncrMerge = 1;
23c90 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 65 72 67  .      rc = merg
23ca0 65 57 6f 72 6b 65 72 49 6e 69 74 28 70 44 62 2c  eWorkerInit(pDb,
23cb0 20 70 4c 65 76 65 6c 2c 20 26 6d 65 72 67 65 77   pLevel, &mergew
23cc0 6f 72 6b 65 72 29 3b 0a 20 20 20 20 20 20 61 73  orker);.      as
23cd0 73 65 72 74 28 20 6d 65 72 67 65 77 6f 72 6b 65  sert( mergeworke
23ce0 72 2e 6e 57 6f 72 6b 3d 3d 30 20 29 3b 0a 20 20  r.nWork==0 );.  
23cf0 20 20 20 20 0a 20 20 20 20 20 20 77 68 69 6c 65      .      while
23d00 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 0a 20 20  ( rc==LSM_OK .  
23d10 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 6d 65          && 0==me
23d20 72 67 65 57 6f 72 6b 65 72 44 6f 6e 65 28 26 6d  rgeWorkerDone(&m
23d30 65 72 67 65 77 6f 72 6b 65 72 29 20 0a 20 20 20  ergeworker) .   
23d40 20 20 20 20 20 20 20 26 26 20 28 6d 65 72 67 65         && (merge
23d50 77 6f 72 6b 65 72 2e 6e 57 6f 72 6b 3c 6e 52 65  worker.nWork<nRe
23d60 6d 61 69 6e 69 6e 67 20 7c 7c 20 70 44 62 2d 3e  maining || pDb->
23d70 62 55 73 65 46 72 65 65 6c 69 73 74 29 0a 20 20  bUseFreelist).  
23d80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
23d90 6e 74 20 65 54 79 70 65 20 3d 20 72 74 54 6f 70  nt eType = rtTop
23da0 69 63 28 6d 65 72 67 65 77 6f 72 6b 65 72 2e 70  ic(mergeworker.p
23db0 43 73 72 2d 3e 65 54 79 70 65 29 3b 0a 20 20 20  Csr->eType);.   
23dc0 20 20 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57       rc = mergeW
23dd0 6f 72 6b 65 72 53 74 65 70 28 26 6d 65 72 67 65  orkerStep(&merge
23de0 77 6f 72 6b 65 72 29 3b 0a 0a 20 20 20 20 20 20  worker);..      
23df0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
23e00 6f 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74  or now points at
23e10 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
23e20 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
23e30 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
23e40 75 73 65 72 20 64 61 74 61 20 28 69 2e 65 2e 20  user data (i.e. 
23e50 65 69 74 68 65 72 20 74 6f 20 45 4f 46 20 6f 72  either to EOF or
23e60 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 66 72   to the first fr
23e70 65 65 2d 6c 69 73 74 20 65 6e 74 72 79 0a 20 20  ee-list entry.  
23e80 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69        ** that wi
23e90 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
23ea0 68 65 20 72 75 6e 29 2c 20 74 68 65 6e 20 63 68  he run), then ch
23eb0 65 63 6b 20 69 66 20 69 74 20 69 73 20 70 6f 73  eck if it is pos
23ec0 73 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 20  sible to.       
23ed0 20 2a 2a 20 6d 65 72 67 65 20 69 6e 20 61 6e 79   ** merge in any
23ee0 20 66 72 65 65 2d 6c 69 73 74 20 65 6e 74 72 69   free-list entri
23ef0 65 73 20 74 68 61 74 20 61 72 65 20 65 69 74 68  es that are eith
23f00 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 72 20  er in-memory or 
23f10 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72  in.        ** fr
23f20 65 65 2d 6c 69 73 74 2d 6f 6e 6c 79 20 62 6c 6f  ee-list-only blo
23f30 63 6b 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  cks.  */.       
23f40 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
23f50 26 26 20 6e 4d 65 72 67 65 3d 3d 31 20 26 26 20  && nMerge==1 && 
23f60 65 54 79 70 65 3d 3d 30 0a 20 20 20 20 20 20 20  eType==0.       
23f70 20 20 26 26 20 28 72 74 54 6f 70 69 63 28 6d 65    && (rtTopic(me
23f80 72 67 65 77 6f 72 6b 65 72 2e 70 43 73 72 2d 3e  rgeworker.pCsr->
23f90 65 54 79 70 65 29 20 7c 7c 20 6d 65 72 67 65 57  eType) || mergeW
23fa0 6f 72 6b 65 72 44 6f 6e 65 28 26 6d 65 72 67 65  orkerDone(&merge
23fb0 77 6f 72 6b 65 72 29 29 0a 20 20 20 20 20 20 20  worker)).       
23fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
23fd0 74 20 6e 46 72 65 65 20 3d 20 30 3b 20 20 20 20  t nFree = 0;    
23fe0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23ff0 6f 66 20 66 72 65 65 2d 6c 69 73 74 2d 6f 6e 6c  of free-list-onl
24000 79 20 6c 65 76 65 6c 73 20 74 6f 20 6d 65 72 67  y levels to merg
24010 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4c  e */.          L
24020 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20  evel *pLvl;.    
24030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
24040 62 2d 3e 70 46 72 65 65 6c 69 73 74 3d 3d 30 20  b->pFreelist==0 
24050 26 26 20 70 44 62 2d 3e 62 55 73 65 46 72 65 65  && pDb->bUseFree
24060 6c 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  list==0 );..    
24070 20 20 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65        /* Now che
24080 63 6b 20 69 66 20 61 6c 6c 20 6c 65 76 65 6c 73  ck if all levels
24090 20 63 6f 6e 74 61 69 6e 69 6e 67 20 64 61 74 61   containing data
240a0 20 6e 65 77 65 72 20 74 68 61 6e 20 74 68 69 73   newer than this
240b0 20 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 2a   one.          *
240c0 2a 20 61 72 65 20 73 69 6e 67 6c 65 2d 73 65 67  * are single-seg
240d0 6d 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 20 6f  ment free-list o
240e0 6e 6c 79 20 6c 65 76 65 6c 73 2e 20 49 66 20 73  nly levels. If s
240f0 6f 2c 20 74 68 65 79 20 77 69 6c 6c 20 62 65 0a  o, they will be.
24100 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 72            ** mer
24110 67 65 64 20 69 6e 20 6e 6f 77 2e 20 20 2a 2f 0a  ged in now.  */.
24120 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 4c            for(pL
24130 76 6c 3d 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2d  vl=pDb->pWorker-
24140 3e 70 4c 65 76 65 6c 3b 20 0a 20 20 20 20 20 20  >pLevel; .      
24150 20 20 20 20 20 20 20 20 70 4c 76 6c 21 3d 6d 65          pLvl!=me
24160 72 67 65 77 6f 72 6b 65 72 2e 70 4c 65 76 65 6c  rgeworker.pLevel
24170 20 26 26 20 28 70 4c 76 6c 2d 3e 66 6c 61 67 73   && (pLvl->flags
24180 20 26 20 4c 45 56 45 4c 5f 46 52 45 45 4c 49 53   & LEVEL_FREELIS
24190 54 5f 4f 4e 4c 59 29 3b 20 0a 20 20 20 20 20 20  T_ONLY); .      
241a0 20 20 20 20 20 20 20 20 70 4c 76 6c 3d 70 4c 76          pLvl=pLv
241b0 6c 2d 3e 70 4e 65 78 74 0a 20 20 20 20 20 20 20  l->pNext.       
241c0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
241d0 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
241e0 6e 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  nRight==0 );.   
241f0 20 20 20 20 20 20 20 20 20 6e 46 72 65 65 2b 2b           nFree++
24200 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24210 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
24220 3d 3d 6d 65 72 67 65 77 6f 72 6b 65 72 2e 70 4c  ==mergeworker.pL
24230 65 76 65 6c 20 29 7b 0a 0a 20 20 20 20 20 20 20  evel ){..       
24240 20 20 20 20 20 72 63 20 3d 20 6d 65 72 67 65 49       rc = mergeI
24250 6e 73 65 72 74 46 72 65 65 6c 69 73 74 53 65 67  nsertFreelistSeg
24260 6d 65 6e 74 73 28 70 44 62 2c 20 6e 46 72 65 65  ments(pDb, nFree
24270 2c 20 26 6d 65 72 67 65 77 6f 72 6b 65 72 29 3b  , &mergeworker);
24280 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
24290 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
242b0 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72 56 69 73  = multiCursorVis
242c0 69 74 46 72 65 65 6c 69 73 74 28 6d 65 72 67 65  itFreelist(merge
242d0 77 6f 72 6b 65 72 2e 70 43 73 72 29 3b 0a 20 20  worker.pCsr);.  
242e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
242f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
24300 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  LSM_OK ){.      
24310 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c          rc = mul
24320 74 69 43 75 72 73 6f 72 53 65 74 75 70 54 72 65  tiCursorSetupTre
24330 65 28 6d 65 72 67 65 77 6f 72 6b 65 72 2e 70 43  e(mergeworker.pC
24340 73 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  sr, 0);.        
24350 20 20 20 20 20 20 70 44 62 2d 3e 70 46 72 65 65        pDb->pFree
24360 6c 69 73 74 20 3d 20 26 66 72 65 65 6c 69 73 74  list = &freelist
24370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
24380 70 44 62 2d 3e 62 55 73 65 46 72 65 65 6c 69 73  pDb->bUseFreelis
24390 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
243a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
243b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
243c0 20 7d 0a 20 20 20 20 20 20 6e 52 65 6d 61 69 6e   }.      nRemain
243d0 69 6e 67 20 2d 3d 20 4c 53 4d 5f 4d 41 58 28 6d  ing -= LSM_MAX(m
243e0 65 72 67 65 77 6f 72 6b 65 72 2e 6e 57 6f 72 6b  ergeworker.nWork
243f0 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 1);..      if(
24400 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
24410 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
24420 69 66 20 74 68 65 20 6d 65 72 67 65 20 6f 70 65  if the merge ope
24430 72 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  ration is comple
24440 74 65 6c 79 20 66 69 6e 69 73 68 65 64 2e 20 49  tely finished. I
24450 66 20 6e 6f 74 2c 0a 20 20 20 20 20 20 20 20 2a  f not,.        *
24460 2a 20 67 6f 62 62 6c 65 20 75 70 20 28 64 65 63  * gobble up (dec
24470 6c 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66 6f  lare eligible fo
24480 72 20 72 65 63 79 63 6c 69 6e 67 29 20 61 6e 79  r recycling) any
24490 20 70 61 67 65 73 20 66 72 6f 6d 20 72 68 73 0a   pages from rhs.
244a0 20 20 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65          ** segme
244b0 6e 74 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  nts for which th
244c0 65 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  e content has be
244d0 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6d 65  en completely me
244e0 72 67 65 64 20 69 6e 74 6f 20 0a 20 20 20 20 20  rged into .     
244f0 20 20 20 2a 2a 20 74 68 65 20 6c 68 73 20 6f 66     ** the lhs of
24500 20 74 68 65 20 6c 65 76 65 6c 2e 20 20 2a 2f 0a   the level.  */.
24510 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 72 67          if( merg
24520 65 57 6f 72 6b 65 72 44 6f 6e 65 28 26 6d 65 72  eWorkerDone(&mer
24530 67 65 77 6f 72 6b 65 72 29 3d 3d 30 20 29 7b 0a  geworker)==0 ){.
24540 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
24550 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
24560 3d 30 3b 20 69 3c 70 4c 65 76 65 6c 2d 3e 6e 52  =0; i<pLevel->nR
24570 69 67 68 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ight; i++){.    
24580 20 20 20 20 20 20 20 20 53 65 67 6d 65 6e 74 50          SegmentP
24590 74 72 20 2a 70 47 6f 62 62 6c 65 20 3d 20 26 6d  tr *pGobble = &m
245a0 65 72 67 65 77 6f 72 6b 65 72 2e 70 43 73 72 2d  ergeworker.pCsr-
245b0 3e 61 50 74 72 5b 69 5d 3b 0a 20 20 20 20 20 20  >aPtr[i];.      
245c0 20 20 20 20 20 20 69 66 28 20 70 47 6f 62 62 6c        if( pGobbl
245d0 65 2d 3e 70 53 65 67 2d 3e 69 52 6f 6f 74 20 29  e->pSeg->iRoot )
245e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
245f0 72 63 20 3d 20 73 6f 72 74 65 64 42 74 72 65 65  rc = sortedBtree
24600 47 6f 62 62 6c 65 28 70 44 62 2c 20 6d 65 72 67  Gobble(pDb, merg
24610 65 77 6f 72 6b 65 72 2e 70 43 73 72 2c 20 69 29  eworker.pCsr, i)
24620 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
24630 6c 73 65 20 69 66 28 20 6d 65 72 67 65 77 6f 72  lse if( mergewor
24640 6b 65 72 2e 61 47 6f 62 62 6c 65 5b 69 5d 20 29  ker.aGobble[i] )
24650 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
24660 6c 73 6d 46 73 47 6f 62 62 6c 65 28 70 44 62 2c  lsmFsGobble(pDb,
24670 20 70 47 6f 62 62 6c 65 2d 3e 70 53 65 67 2c 20   pGobble->pSeg, 
24680 26 6d 65 72 67 65 77 6f 72 6b 65 72 2e 61 47 6f  &mergeworker.aGo
24690 62 62 6c 65 5b 69 5d 2c 20 31 29 3b 0a 20 20 20  bble[i], 1);.   
246a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
246b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
246c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
246d0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
246e0 20 69 6e 74 20 62 45 6d 70 74 79 3b 0a 20 20 20   int bEmpty;.   
246f0 20 20 20 20 20 20 20 6d 65 72 67 65 57 6f 72 6b         mergeWork
24700 65 72 53 68 75 74 64 6f 77 6e 28 26 6d 65 72 67  erShutdown(&merg
24710 65 77 6f 72 6b 65 72 2c 20 26 72 63 29 3b 0a 20  eworker, &rc);. 
24720 20 20 20 20 20 20 20 20 20 62 45 6d 70 74 79 20           bEmpty 
24730 3d 20 28 70 4c 65 76 65 6c 2d 3e 6c 68 73 2e 69  = (pLevel->lhs.i
24740 46 69 72 73 74 3d 3d 30 29 3b 0a 0a 20 20 20 20  First==0);..    
24750 20 20 20 20 20 20 69 66 28 20 62 45 6d 70 74 79        if( bEmpty
24760 3d 3d 30 20 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f  ==0 && rc==LSM_O
24770 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
24780 20 72 63 20 3d 20 6c 73 6d 46 73 53 6f 72 74 65   rc = lsmFsSorte
24790 64 46 69 6e 69 73 68 28 70 44 62 2d 3e 70 46 53  dFinish(pDb->pFS
247a0 2c 20 26 70 4c 65 76 65 6c 2d 3e 6c 68 73 29 3b  , &pLevel->lhs);
247b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
247c0 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d          if( pDb-
247d0 3e 62 55 73 65 46 72 65 65 6c 69 73 74 20 29 7b  >bUseFreelist ){
247e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 72 65  .            Fre
247f0 65 6c 69 73 74 20 2a 70 20 3d 20 26 70 44 62 2d  elist *p = &pDb-
24800 3e 70 57 6f 72 6b 65 72 2d 3e 66 72 65 65 6c 69  >pWorker->freeli
24810 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
24820 6c 73 6d 46 72 65 65 28 70 44 62 2d 3e 70 45 6e  lsmFree(pDb->pEn
24830 76 2c 20 70 2d 3e 61 45 6e 74 72 79 29 3b 0a 20  v, p->aEntry);. 
24840 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
24850 79 28 70 2c 20 26 66 72 65 65 6c 69 73 74 2c 20  y(p, &freelist, 
24860 73 69 7a 65 6f 66 28 66 72 65 65 6c 69 73 74 29  sizeof(freelist)
24870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
24880 44 62 2d 3e 62 55 73 65 46 72 65 65 6c 69 73 74  Db->bUseFreelist
24890 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
248a0 20 20 70 44 62 2d 3e 70 46 72 65 65 6c 69 73 74    pDb->pFreelist
248b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
248c0 20 20 62 53 61 76 65 20 3d 20 31 3b 0a 20 20 20    bSave = 1;.   
248d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
248e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
248f0 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3b 20 69  Level->nRight; i
24900 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
24910 20 6c 73 6d 46 73 53 6f 72 74 65 64 44 65 6c 65   lsmFsSortedDele
24920 74 65 28 70 44 62 2d 3e 70 46 53 2c 20 70 57 6f  te(pDb->pFS, pWo
24930 72 6b 65 72 2c 20 31 2c 20 26 70 4c 65 76 65 6c  rker, 1, &pLevel
24940 2d 3e 61 52 68 73 5b 69 5d 29 3b 0a 20 20 20 20  ->aRhs[i]);.    
24950 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
24960 20 20 20 69 66 28 20 62 45 6d 70 74 79 20 29 7b     if( bEmpty ){
24970 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
24980 49 66 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c  If the new level
24990 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   is completely e
249a0 6d 70 74 79 2c 20 72 65 6d 6f 76 65 20 69 74 20  mpty, remove it 
249b0 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
249c0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
249d0 65 20 73 6e 61 70 73 68 6f 74 2e 20 54 68 69 73  e snapshot. This
249e0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
249f0 20 69 66 20 61 6c 6c 20 69 6e 70 75 74 20 6b 65   if all input ke
24a00 79 73 20 77 65 72 65 0a 20 20 20 20 20 20 20 20  ys were.        
24a10 20 20 20 20 2a 2a 20 61 6e 6e 69 68 69 6c 61 74      ** annihilat
24a20 65 64 2e 20 53 69 6e 63 65 20 6b 65 79 73 20 61  ed. Since keys a
24a30 72 65 20 6f 6e 6c 79 20 61 6e 6e 69 68 69 6c 61  re only annihila
24a40 74 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 6c  ted if the new l
24a50 65 76 65 6c 0a 20 20 20 20 20 20 20 20 20 20 20  evel.           
24a60 20 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20   ** is the last 
24a70 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
24a80 73 74 20 28 63 6f 6e 74 61 69 6e 73 20 74 68 65  st (contains the
24a90 20 6d 6f 73 74 20 61 6e 63 69 65 6e 74 20 6f 66   most ancient of
24aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
24ab0 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
24ac0 29 2c 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  ), this guarante
24ad0 65 73 20 74 68 61 74 20 70 4c 65 76 65 6c 2d 3e  es that pLevel->
24ae0 70 4e 65 78 74 3d 3d 30 2e 20 20 2a 2f 20 0a 20  pNext==0.  */ . 
24af0 20 20 20 20 20 20 20 20 20 20 20 4c 65 76 65 6c             Level
24b00 20 2a 70 54 6f 70 3b 20 20 20 20 20 20 20 20 20   *pTop;         
24b10 20 2f 2a 20 54 6f 70 20 6c 65 76 65 6c 20 6f 66   /* Top level of
24b20 20 77 6f 72 6b 65 72 20 73 6e 61 70 73 68 6f 74   worker snapshot
24b30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
24b40 4c 65 76 65 6c 20 2a 2a 70 70 3b 20 20 20 20 20  Level **pp;     
24b50 20 20 20 20 20 20 2f 2a 20 52 65 61 64 2f 77 72        /* Read/wr
24b60 69 74 65 20 69 74 65 72 61 74 6f 72 20 66 6f 72  ite iterator for
24b70 20 4c 65 76 65 6c 2e 70 4e 65 78 74 20 6c 69 73   Level.pNext lis
24b80 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20  t */..          
24b90 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c    assert( pLevel
24ba0 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 0a 20  ->pNext==0 );.. 
24bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24bc0 6d 6f 76 65 20 74 68 65 20 6c 65 76 65 6c 20 66  move the level f
24bd0 72 6f 6d 20 74 68 65 20 77 6f 72 6b 65 72 20 73  rom the worker s
24be0 6e 61 70 73 68 6f 74 2e 20 2a 2f 0a 20 20 20 20  napshot. */.    
24bf0 20 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20 6c          pTop = l
24c00 73 6d 44 62 53 6e 61 70 73 68 6f 74 4c 65 76 65  smDbSnapshotLeve
24c10 6c 28 70 57 6f 72 6b 65 72 29 3b 0a 20 20 20 20  l(pWorker);.    
24c20 20 20 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26          for(pp=&
24c30 70 54 6f 70 3b 20 2a 70 70 21 3d 70 4c 65 76 65  pTop; *pp!=pLeve
24c40 6c 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70  l; pp=&((*pp)->p
24c50 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 20 20  Next));.        
24c60 20 20 20 20 2a 70 70 20 3d 20 70 4c 65 76 65 6c      *pp = pLevel
24c70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
24c80 20 20 20 20 20 6c 73 6d 44 62 53 6e 61 70 73 68       lsmDbSnapsh
24c90 6f 74 53 65 74 4c 65 76 65 6c 28 70 57 6f 72 6b  otSetLevel(pWork
24ca0 65 72 2c 20 70 54 6f 70 29 3b 0a 0a 20 20 20 20  er, pTop);..    
24cb0 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
24cc0 74 68 65 20 4c 65 76 65 6c 20 73 74 72 75 63 74  the Level struct
24cd0 75 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ure. */.        
24ce0 20 20 20 20 73 6f 72 74 65 64 46 72 65 65 4c 65      sortedFreeLe
24cf0 76 65 6c 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70  vel(pDb->pEnv, p
24d00 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  Level);.        
24d10 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 20 20    }else{..      
24d20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68        /* Free th
24d30 65 20 73 65 70 61 72 61 74 6f 72 73 20 6f 66 20  e separators of 
24d40 74 68 65 20 6e 65 78 74 20 6c 65 76 65 6c 2c 20  the next level, 
24d50 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
24d60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24d70 70 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65 2d 3e  pLevel->pMerge->
24d80 6e 49 6e 70 75 74 20 3e 20 70 4c 65 76 65 6c 2d  nInput > pLevel-
24d90 3e 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >nRight ){.     
24da0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
24db0 20 70 4c 65 76 65 6c 2d 3e 70 4e 65 78 74 2d 3e   pLevel->pNext->
24dc0 6c 68 73 2e 69 52 6f 6f 74 20 29 3b 0a 20 20 20  lhs.iRoot );.   
24dd0 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65             pLeve
24de0 6c 2d 3e 70 4e 65 78 74 2d 3e 6c 68 73 2e 69 52  l->pNext->lhs.iR
24df0 6f 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oot = 0;.       
24e00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
24e10 20 20 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20      /* Zero the 
24e20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20  right-hand-side 
24e30 6f 66 20 70 4c 65 76 65 6c 20 2a 2f 0a 20 20 20  of pLevel */.   
24e40 20 20 20 20 20 20 20 20 20 6c 73 6d 46 72 65 65           lsmFree
24e50 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70 4c 65 76  (pDb->pEnv, pLev
24e60 65 6c 2d 3e 61 52 68 73 29 3b 0a 20 20 20 20 20  el->aRhs);.     
24e70 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e         pLevel->n
24e80 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20  Right = 0;.     
24e90 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61         pLevel->a
24ea0 52 68 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  Rhs = 0;..      
24eb0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68        /* Free th
24ec0 65 20 4d 65 72 67 65 20 6f 62 6a 65 63 74 20 2a  e Merge object *
24ed0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 73  /.            ls
24ee0 6d 46 72 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c  mFree(pDb->pEnv,
24ef0 20 70 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65 29   pLevel->pMerge)
24f00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4c  ;.            pL
24f10 65 76 65 6c 2d 3e 70 4d 65 72 67 65 20 3d 20 30  evel->pMerge = 0
24f20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
24f30 20 20 20 20 20 20 20 20 20 69 66 28 20 62 53 61           if( bSa
24f40 76 65 20 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  ve && rc==LSM_OK
24f50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24f60 70 44 62 2d 3e 62 49 6e 63 72 4d 65 72 67 65 20  pDb->bIncrMerge 
24f70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
24f80 20 72 63 20 3d 20 6c 73 6d 53 61 76 65 57 6f 72   rc = lsmSaveWor
24f90 6b 65 72 28 70 44 62 2c 20 30 29 3b 0a 20 20 20  ker(pDb, 0);.   
24fa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24fb0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
24fc0 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 74 68    /* Clean up th
24fd0 65 20 4d 65 72 67 65 57 6f 72 6b 65 72 20 6f 62  e MergeWorker ob
24fe0 6a 65 63 74 20 69 6e 69 74 69 61 6c 69 7a 65 64  ject initialized
24ff0 20 61 62 6f 76 65 2e 20 49 66 20 6e 6f 20 65 72   above. If no er
25000 72 6f 72 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ror.      ** has
25010 20 6f 63 63 75 72 72 65 64 2c 20 69 6e 76 6f 6b   occurred, invok
25020 65 20 74 68 65 20 77 6f 72 6b 2d 68 6f 6f 6b 20  e the work-hook 
25030 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 61 70  to inform the ap
25040 70 6c 69 63 61 74 69 6f 6e 20 74 68 61 74 0a 20  plication that. 
25050 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
25060 62 61 73 65 20 73 74 72 75 63 74 75 72 65 20 68  base structure h
25070 61 73 20 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 20  as changed. */. 
25080 20 20 20 20 20 6d 65 72 67 65 57 6f 72 6b 65 72       mergeWorker
25090 53 68 75 74 64 6f 77 6e 28 26 6d 65 72 67 65 77  Shutdown(&mergew
250a0 6f 72 6b 65 72 2c 20 26 72 63 29 3b 0a 20 20 20  orker, &rc);.   
250b0 20 20 20 70 44 62 2d 3e 62 49 6e 63 72 4d 65 72     pDb->bIncrMer
250c0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ge = 0;.      if
250d0 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 73  ( rc==LSM_OK ) s
250e0 6f 72 74 65 64 49 6e 76 6f 6b 65 57 6f 72 6b 48  ortedInvokeWorkH
250f0 6f 6f 6b 28 70 44 62 29 3b 0a 0a 23 69 66 20 4c  ook(pDb);..#if L
25100 53 4d 5f 4c 4f 47 5f 53 54 52 55 43 54 55 52 45  SM_LOG_STRUCTURE
25110 0a 20 20 20 20 20 20 6c 73 6d 53 6f 72 74 65 64  .      lsmSorted
25120 44 75 6d 70 53 74 72 75 63 74 75 72 65 28 70 44  DumpStructure(pD
25130 62 2c 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2c  b, pDb->pWorker,
25140 20 4c 53 4d 5f 4c 4f 47 5f 44 41 54 41 2c 20 30   LSM_LOG_DATA, 0
25150 2c 20 22 77 6f 72 6b 22 29 3b 0a 23 65 6e 64 69  , "work");.#endi
25160 66 0a 20 20 20 20 20 20 61 73 73 65 72 74 42 74  f.      assertBt
25170 72 65 65 4f 6b 28 70 44 62 2c 20 26 70 4c 65 76  reeOk(pDb, &pLev
25180 65 6c 2d 3e 6c 68 73 29 3b 0a 20 20 20 20 20 20  el->lhs);.      
25190 61 73 73 65 72 74 52 75 6e 49 6e 4f 72 64 65 72  assertRunInOrder
251a0 28 70 44 62 2c 20 26 70 4c 65 76 65 6c 2d 3e 6c  (pDb, &pLevel->l
251b0 68 73 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  hs);..      /* I
251c0 66 20 62 46 6c 75 73 68 20 69 73 20 74 72 75 65  f bFlush is true
251d0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
251e0 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63  e is no longer c
251f0 6f 6e 73 69 64 65 72 65 64 20 22 66 75 6c 6c 22  onsidered "full"
25200 2c 0a 20 20 20 20 20 20 2a 2a 20 62 72 65 61 6b  ,.      ** break
25210 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
25220 20 65 76 65 6e 20 69 66 20 6e 52 65 6d 61 69 6e   even if nRemain
25230 69 6e 67 20 69 73 20 73 74 69 6c 6c 20 67 72 65  ing is still gre
25240 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20  ater than.      
25250 2a 2a 20 7a 65 72 6f 2e 20 54 68 65 20 63 61 6c  ** zero. The cal
25260 6c 65 72 20 68 61 73 20 61 6e 20 69 6e 2d 6d 65  ler has an in-me
25270 6d 6f 72 79 20 74 72 65 65 20 74 6f 20 66 6c 75  mory tree to flu
25280 73 68 20 74 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a  sh to disk.  */.
25290 20 20 20 20 20 20 69 66 28 20 62 46 6c 75 73 68        if( bFlush
252a0 20 26 26 20 73 6f 72 74 65 64 44 62 49 73 46 75   && sortedDbIsFu
252b0 6c 6c 28 70 44 62 29 3d 3d 30 20 29 20 62 72 65  ll(pDb)==0 ) bre
252c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
252d0 20 69 66 28 20 70 6e 57 72 69 74 65 20 29 20 2a   if( pnWrite ) *
252e0 70 6e 57 72 69 74 65 20 3d 20 28 6e 57 6f 72 6b  pnWrite = (nWork
252f0 20 2d 20 6e 52 65 6d 61 69 6e 69 6e 67 29 3b 0a   - nRemaining);.
25300 20 20 70 57 6f 72 6b 65 72 2d 3e 6e 57 72 69 74    pWorker->nWrit
25310 65 20 2b 3d 20 28 6e 57 6f 72 6b 20 2d 20 6e 52  e += (nWork - nR
25320 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a 23 69 66 64  emaining);..#ifd
25330 65 66 20 4c 53 4d 5f 4c 4f 47 5f 57 4f 52 4b 0a  ef LSM_LOG_WORK.
25340 20 20 6c 73 6d 4c 6f 67 4d 65 73 73 61 67 65 28    lsmLogMessage(
25350 70 44 62 2c 20 72 63 2c 20 22 73 6f 72 74 65 64  pDb, rc, "sorted
25360 57 6f 72 6b 28 29 3a 20 25 64 20 70 61 67 65 73  Work(): %d pages
25370 22 2c 20 28 6e 57 6f 72 6b 2d 6e 52 65 6d 61 69  ", (nWork-nRemai
25380 6e 69 6e 67 29 29 3b 0a 23 65 6e 64 69 66 0a 20  ning));.#endif. 
25390 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
253a0 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73  *.** The databas
253b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 61 73  e connection pas
253c0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
253d0 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
253e0 65 20 61 20 77 6f 72 6b 65 72 0a 2a 2a 20 63 6f  e a worker.** co
253f0 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 69 73 20 66  nnection. This f
25400 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
25410 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61  f there exists a
25420 6e 20 22 6f 6c 64 22 20 69 6e 2d 6d 65 6d 6f 72  n "old" in-memor
25430 79 20 74 72 65 65 0a 2a 2a 20 72 65 61 64 79 20  y tree.** ready 
25440 74 6f 20 62 65 20 66 6c 75 73 68 65 64 20 74 6f  to be flushed to
25450 20 64 69 73 6b 2e 20 49 66 20 73 6f 2c 20 74 72   disk. If so, tr
25460 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ue is returned. 
25470 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e  Otherwise false.
25480 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
25490 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 52 63 20  or occurs, *pRc 
254a0 69 73 20 73 65 74 20 74 6f 20 61 6e 20 4c 53 4d  is set to an LSM
254b0 20 65 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f   error code befo
254c0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
254d0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
254e0 68 61 74 20 2a 70 52 63 20 69 73 20 73 65 74 20  hat *pRc is set 
254f0 74 6f 20 4c 53 4d 5f 4f 4b 20 77 68 65 6e 20 74  to LSM_OK when t
25500 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25510 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
25520 63 20 69 6e 74 20 73 6f 72 74 65 64 54 72 65 65  c int sortedTree
25530 48 61 73 4f 6c 64 28 6c 73 6d 5f 64 62 20 2a 70  HasOld(lsm_db *p
25540 44 62 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  Db, int *pRc){. 
25550 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b   int rc = LSM_OK
25560 3b 0a 20 20 69 6e 74 20 62 52 65 74 20 3d 20 30  ;.  int bRet = 0
25570 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  ;..  assert( pDb
25580 2d 3e 70 57 6f 72 6b 65 72 20 29 3b 0a 20 20 69  ->pWorker );.  i
25590 66 28 20 2a 70 52 63 3d 3d 4c 53 4d 5f 4f 4b 20  f( *pRc==LSM_OK 
255a0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c  ){.    if( rc==L
255b0 53 4d 5f 4f 4b 20 0a 20 20 20 20 20 20 20 20 26  SM_OK .        &
255c0 26 20 70 44 62 2d 3e 74 72 65 65 68 64 72 2e 69  & pDb->treehdr.i
255d0 4f 6c 64 53 68 6d 69 64 0a 20 20 20 20 20 20 20  OldShmid.       
255e0 20 26 26 20 70 44 62 2d 3e 74 72 65 65 68 64 72   && pDb->treehdr
255f0 2e 69 4f 6c 64 4c 6f 67 21 3d 70 44 62 2d 3e 70  .iOldLog!=pDb->p
25600 57 6f 72 6b 65 72 2d 3e 69 4c 6f 67 4f 66 66 20  Worker->iLogOff 
25610 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
25620 62 52 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65  bRet = 1;.    }e
25630 6c 73 65 7b 0a 20 20 20 20 20 20 62 52 65 74 20  lse{.      bRet 
25640 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  = 0;.    }.    *
25650 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20  pRc = rc;.  }.  
25660 61 73 73 65 72 74 28 20 2a 70 52 63 3d 3d 4c 53  assert( *pRc==LS
25670 4d 5f 4f 4b 20 7c 7c 20 62 52 65 74 3d 3d 30 20  M_OK || bRet==0 
25680 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74  );.  return bRet
25690 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
256a0 65 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  e a new free-lis
256b0 74 20 6f 6e 6c 79 20 74 6f 70 2d 6c 65 76 65 6c  t only top-level
256c0 20 73 65 67 6d 65 6e 74 2e 20 52 65 74 75 72 6e   segment. Return
256d0 20 4c 53 4d 5f 4f 4b 20 69 66 20 73 75 63 63 65   LSM_OK if succe
256e0 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 61 6e 20 4c  ssful.** or an L
256f0 53 4d 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  SM error code if
25700 20 73 6f 6d 65 20 65 72 72 6f 72 20 6f 63 63 75   some error occu
25710 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
25720 74 20 73 6f 72 74 65 64 4e 65 77 46 72 65 65 6c  t sortedNewFreel
25730 69 73 74 4f 6e 6c 79 28 6c 73 6d 5f 64 62 20 2a  istOnly(lsm_db *
25740 70 44 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  pDb){.  return s
25750 6f 72 74 65 64 4e 65 77 54 6f 70 6c 65 76 65 6c  ortedNewToplevel
25760 28 70 44 62 2c 20 54 52 45 45 5f 4e 4f 4e 45 2c  (pDb, TREE_NONE,
25770 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 53   0);.}..int lsmS
25780 61 76 65 57 6f 72 6b 65 72 28 6c 73 6d 5f 64 62  aveWorker(lsm_db
25790 20 2a 70 44 62 2c 20 69 6e 74 20 62 46 6c 75 73   *pDb, int bFlus
257a0 68 29 7b 0a 20 20 53 6e 61 70 73 68 6f 74 20 2a  h){.  Snapshot *
257b0 70 20 3d 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72  p = pDb->pWorker
257c0 3b 0a 20 20 69 66 28 20 70 2d 3e 66 72 65 65 6c  ;.  if( p->freel
257d0 69 73 74 2e 6e 45 6e 74 72 79 3e 70 44 62 2d 3e  ist.nEntry>pDb->
257e0 6e 4d 61 78 46 72 65 65 6c 69 73 74 20 29 7b 0a  nMaxFreelist ){.
257f0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 6f 72      int rc = sor
25800 74 65 64 4e 65 77 46 72 65 65 6c 69 73 74 4f 6e  tedNewFreelistOn
25810 6c 79 28 70 44 62 29 3b 0a 20 20 20 20 69 66 28  ly(pDb);.    if(
25820 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72 65   rc!=LSM_OK ) re
25830 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
25840 65 74 75 72 6e 20 6c 73 6d 43 68 65 63 6b 70 6f  eturn lsmCheckpo
25850 69 6e 74 53 61 76 65 57 6f 72 6b 65 72 28 70 44  intSaveWorker(pD
25860 62 2c 20 62 46 6c 75 73 68 29 3b 0a 7d 0a 0a 73  b, bFlush);.}..s
25870 74 61 74 69 63 20 69 6e 74 20 64 6f 4c 73 6d 53  tatic int doLsmS
25880 69 6e 67 6c 65 57 6f 72 6b 28 0a 20 20 6c 73 6d  ingleWork(.  lsm
25890 5f 64 62 20 2a 70 44 62 2c 20 0a 20 20 69 6e 74  _db *pDb, .  int
258a0 20 62 53 68 75 74 64 6f 77 6e 2c 0a 20 20 69 6e   bShutdown,.  in
258b0 74 20 6e 4d 65 72 67 65 2c 20 20 20 20 20 20 20  t nMerge,       
258c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
258d0 20 4d 69 6e 69 6d 75 6d 20 73 65 67 6d 65 6e 74   Minimum segment
258e0 73 20 74 6f 20 6d 65 72 67 65 20 74 6f 67 65 74  s to merge toget
258f0 68 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  her */.  int nPa
25900 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
25910 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
25920 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 77  er of pages to w
25930 72 69 74 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a  rite to disk */.
25940 20 20 69 6e 74 20 2a 70 6e 57 72 69 74 65 2c 20    int *pnWrite, 
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25960 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 73 20    /* OUT: Pages 
25970 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
25980 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 6e   to disk */.  in
25990 74 20 2a 70 62 43 6b 70 74 20 20 20 20 20 20 20  t *pbCkpt       
259a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
259b0 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 61 6e   OUT: True if an
259c0 20 61 75 74 6f 2d 63 68 65 63 6b 70 6f 69 6e 74   auto-checkpoint
259d0 20 69 73 20 72 65 71 2e 20 2a 2f 0a 29 7b 0a 20   is req. */.){. 
259e0 20 53 6e 61 70 73 68 6f 74 20 2a 70 57 6f 72 6b   Snapshot *pWork
259f0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
25a00 20 2f 2a 20 57 6f 72 6b 65 72 20 73 6e 61 70 73   /* Worker snaps
25a10 68 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  hot */.  int rc 
25a20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20  = LSM_OK;       
25a30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
25a40 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
25a50 20 62 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69   bDirty = 0;.  i
25a60 6e 74 20 6e 4d 61 78 20 3d 20 6e 50 61 67 65 3b  nt nMax = nPage;
25a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25a80 2a 20 4d 61 78 69 6d 75 6d 20 70 61 67 65 73 20  * Maximum pages 
25a90 74 6f 20 77 72 69 74 65 20 74 6f 20 64 69 73 6b  to write to disk
25aa0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d   */.  int nRem =
25ab0 20 6e 50 61 67 65 3b 0a 20 20 69 6e 74 20 62 43   nPage;.  int bC
25ac0 6b 70 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  kpt = 0;..  asse
25ad0 72 74 28 20 6e 50 61 67 65 3e 30 20 29 3b 0a 0a  rt( nPage>0 );..
25ae0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 77 6f    /* Open the wo
25af0 72 6b 65 72 20 27 74 72 61 6e 73 61 63 74 69 6f  rker 'transactio
25b00 6e 27 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63  n'. It will be c
25b10 6c 6f 73 65 64 20 62 65 66 6f 72 65 20 74 68 69  losed before thi
25b20 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
25b30 72 65 74 75 72 6e 73 2e 20 20 2a 2f 0a 20 20 61  returns.  */.  a
25b40 73 73 65 72 74 28 20 70 44 62 2d 3e 70 57 6f 72  ssert( pDb->pWor
25b50 6b 65 72 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ker==0 );.  rc =
25b60 20 6c 73 6d 42 65 67 69 6e 57 6f 72 6b 28 70 44   lsmBeginWork(pD
25b70 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 4c 53  b);.  if( rc!=LS
25b80 4d 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  M_OK ) return rc
25b90 3b 0a 20 20 70 57 6f 72 6b 65 72 20 3d 20 70 44  ;.  pWorker = pD
25ba0 62 2d 3e 70 57 6f 72 6b 65 72 3b 0a 0a 20 20 2f  b->pWorker;..  /
25bb0 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * If this connec
25bc0 74 69 6f 6e 20 69 73 20 64 6f 69 6e 67 20 61 75  tion is doing au
25bd0 74 6f 2d 63 68 65 63 6b 70 6f 69 6e 74 73 2c 20  to-checkpoints, 
25be0 73 65 74 20 6e 4d 61 78 20 28 61 6e 64 20 6e 52  set nMax (and nR
25bf0 65 6d 29 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  em) so.  ** that
25c00 20 74 68 69 73 20 63 61 6c 6c 20 73 74 6f 70 73   this call stops
25c10 20 77 72 69 74 69 6e 67 20 77 68 65 6e 20 74 68   writing when th
25c20 65 20 61 75 74 6f 2d 63 68 65 63 6b 70 6f 69 6e  e auto-checkpoin
25c30 74 20 69 73 20 64 75 65 2e 20 54 68 65 0a 20 20  t is due. The.  
25c40 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64  ** caller will d
25c50 6f 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  o the checkpoint
25c60 2c 20 74 68 65 6e 20 70 6f 73 73 69 62 6c 79 20  , then possibly 
25c70 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
25c80 6f 6e 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69  on again. */.  i
25c90 66 28 20 62 53 68 75 74 64 6f 77 6e 3d 3d 30 20  f( bShutdown==0 
25ca0 26 26 20 70 44 62 2d 3e 6e 41 75 74 6f 63 6b 70  && pDb->nAutockp
25cb0 74 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 53 79  t ){.    u32 nSy
25cc0 6e 63 3b 0a 20 20 20 20 75 33 32 20 6e 55 6e 73  nc;.    u32 nUns
25cd0 79 6e 63 3b 0a 20 20 20 20 69 6e 74 20 6e 50 67  ync;.    int nPg
25ce0 73 7a 3b 0a 0a 20 20 20 20 6c 73 6d 43 68 65 63  sz;..    lsmChec
25cf0 6b 70 6f 69 6e 74 53 79 6e 63 65 64 28 70 44 62  kpointSynced(pDb
25d00 2c 20 30 2c 20 30 2c 20 26 6e 53 79 6e 63 29 3b  , 0, 0, &nSync);
25d10 0a 20 20 20 20 6e 55 6e 73 79 6e 63 20 3d 20 6c  .    nUnsync = l
25d20 73 6d 43 68 65 63 6b 70 6f 69 6e 74 4e 57 72 69  smCheckpointNWri
25d30 74 65 28 70 44 62 2d 3e 70 53 68 6d 68 64 72 2d  te(pDb->pShmhdr-
25d40 3e 61 53 6e 61 70 31 2c 20 30 29 3b 0a 20 20 20  >aSnap1, 0);.   
25d50 20 6e 50 67 73 7a 20 3d 20 6c 73 6d 43 68 65 63   nPgsz = lsmChec
25d60 6b 70 6f 69 6e 74 50 67 73 7a 28 70 44 62 2d 3e  kpointPgsz(pDb->
25d70 70 53 68 6d 68 64 72 2d 3e 61 53 6e 61 70 31 29  pShmhdr->aSnap1)
25d80 3b 0a 0a 20 20 20 20 6e 4d 61 78 20 3d 20 4c 53  ;..    nMax = LS
25d90 4d 5f 4d 49 4e 28 6e 4d 61 78 2c 20 28 70 44 62  M_MIN(nMax, (pDb
25da0 2d 3e 6e 41 75 74 6f 63 6b 70 74 2f 6e 50 67 73  ->nAutockpt/nPgs
25db0 7a 29 20 2d 20 28 69 6e 74 29 28 6e 55 6e 73 79  z) - (int)(nUnsy
25dc0 6e 63 2d 6e 53 79 6e 63 29 29 3b 0a 20 20 20 20  nc-nSync));.    
25dd0 69 66 28 20 6e 4d 61 78 3c 6e 52 65 6d 20 29 7b  if( nMax<nRem ){
25de0 0a 20 20 20 20 20 20 62 43 6b 70 74 20 3d 20 31  .      bCkpt = 1
25df0 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 3d 20 4c  ;.      nRem = L
25e00 53 4d 5f 4d 41 58 28 6e 4d 61 78 2c 20 30 29 3b  SM_MAX(nMax, 0);
25e10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
25e20 20 49 66 20 74 68 65 72 65 20 65 78 69 73 74 73   If there exists
25e30 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
25e40 72 65 61 64 79 20 74 6f 20 62 65 20 66 6c 75 73  ready to be flus
25e50 68 65 64 20 74 6f 20 64 69 73 6b 2c 20 61 74 74  hed to disk, att
25e60 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 66 6c 75  empt.  ** to flu
25e70 73 68 20 69 74 20 6e 6f 77 2e 20 20 2a 2f 0a 20  sh it now.  */. 
25e80 20 69 66 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73   if( pDb->nTrans
25e90 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Open==0 ){.    r
25ea0 63 20 3d 20 6c 73 6d 54 72 65 65 4c 6f 61 64 48  c = lsmTreeLoadH
25eb0 65 61 64 65 72 28 70 44 62 2c 20 30 29 3b 0a 20  eader(pDb, 0);. 
25ec0 20 7d 0a 20 20 69 66 28 20 73 6f 72 74 65 64 54   }.  if( sortedT
25ed0 72 65 65 48 61 73 4f 6c 64 28 70 44 62 2c 20 26  reeHasOld(pDb, &
25ee0 72 63 29 20 29 7b 0a 20 20 20 20 2f 2a 20 73 6f  rc) ){.    /* so
25ef0 72 74 65 64 44 62 49 73 46 75 6c 6c 28 29 20 72  rtedDbIsFull() r
25f00 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
25f10 69 66 20 65 69 74 68 65 72 20 28 61 29 20 74 68  if either (a) th
25f20 65 72 65 20 61 72 65 20 74 6f 6f 20 6d 61 6e 79  ere are too many
25f30 0a 20 20 20 20 2a 2a 20 6c 65 76 65 6c 73 20 69  .    ** levels i
25f40 6e 20 74 6f 74 61 6c 20 69 6e 20 74 68 65 20 64  n total in the d
25f50 62 2c 20 6f 72 20 28 62 29 20 74 68 65 72 65 20  b, or (b) there 
25f60 61 72 65 20 74 6f 6f 20 6d 61 6e 79 20 6c 65 76  are too many lev
25f70 65 6c 73 20 77 69 74 68 20 74 68 65 0a 20 20 20  els with the.   
25f80 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 67 65   ** the same age
25f90 20 69 6e 20 74 68 65 20 64 62 2e 20 45 69 74 68   in the db. Eith
25fa0 65 72 20 77 61 79 2c 20 63 61 6c 6c 20 73 6f 72  er way, call sor
25fb0 74 65 64 57 6f 72 6b 28 29 20 74 6f 20 6d 65 72  tedWork() to mer
25fc0 67 65 20 0a 20 20 20 20 2a 2a 20 65 78 69 73 74  ge .    ** exist
25fd0 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 74 6f 67  ing segments tog
25fe0 65 74 68 65 72 20 75 6e 74 69 6c 20 74 68 69 73  ether until this
25ff0 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 63 6c   condition is cl
26000 65 61 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  eared.  */.    i
26010 66 28 20 73 6f 72 74 65 64 44 62 49 73 46 75 6c  f( sortedDbIsFul
26020 6c 28 70 44 62 29 20 29 7b 0a 20 20 20 20 20 20  l(pDb) ){.      
26030 69 6e 74 20 6e 50 67 20 3d 20 30 3b 0a 20 20 20  int nPg = 0;.   
26040 20 20 20 72 63 20 3d 20 73 6f 72 74 65 64 57 6f     rc = sortedWo
26050 72 6b 28 70 44 62 2c 20 6e 52 65 6d 2c 20 6e 4d  rk(pDb, nRem, nM
26060 65 72 67 65 2c 20 31 2c 20 26 6e 50 67 29 3b 0a  erge, 1, &nPg);.
26070 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 50        nRem -= nP
26080 67 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  g;.      assert(
26090 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 6e   rc!=LSM_OK || n
260a0 52 65 6d 3c 3d 30 20 7c 7c 20 21 73 6f 72 74 65  Rem<=0 || !sorte
260b0 64 44 62 49 73 46 75 6c 6c 28 70 44 62 29 20 29  dDbIsFull(pDb) )
260c0 3b 0a 20 20 20 20 20 20 62 44 69 72 74 79 20 3d  ;.      bDirty =
260d0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   1;.    }..    i
260e0 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  f( rc==LSM_OK &&
260f0 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20   nRem>0 ){.     
26100 20 69 6e 74 20 6e 50 67 20 3d 20 30 3b 0a 20 20   int nPg = 0;.  
26110 20 20 20 20 72 63 20 3d 20 73 6f 72 74 65 64 4e      rc = sortedN
26120 65 77 54 6f 70 6c 65 76 65 6c 28 70 44 62 2c 20  ewToplevel(pDb, 
26130 54 52 45 45 5f 4f 4c 44 2c 20 26 6e 50 67 29 3b  TREE_OLD, &nPg);
26140 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e  .      nRem -= n
26150 50 67 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  Pg;.      if( rc
26160 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
26170 20 20 20 20 69 66 28 20 70 44 62 2d 3e 6e 54 72      if( pDb->nTr
26180 61 6e 73 4f 70 65 6e 3e 30 20 29 7b 0a 20 20 20  ansOpen>0 ){.   
26190 20 20 20 20 20 20 20 6c 73 6d 54 72 65 65 44 69         lsmTreeDi
261a0 73 63 61 72 64 4f 6c 64 28 70 44 62 29 3b 0a 20  scardOld(pDb);. 
261b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
261c0 20 72 63 20 3d 20 6c 73 6d 53 61 76 65 57 6f 72   rc = lsmSaveWor
261d0 6b 65 72 28 70 44 62 2c 20 31 29 3b 0a 20 20 20  ker(pDb, 1);.   
261e0 20 20 20 20 20 62 44 69 72 74 79 20 3d 20 30 3b       bDirty = 0;
261f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26200 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 50 61 67   }..  /* If nPag
26210 65 20 69 73 20 73 74 69 6c 6c 20 67 72 65 61 74  e is still great
26220 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 64 6f  er than zero, do
26230 20 73 6f 6d 65 20 6d 65 72 67 69 6e 67 2e 20 2a   some merging. *
26240 2f 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f  /.  if( rc==LSM_
26250 4f 4b 20 26 26 20 6e 52 65 6d 3e 30 20 26 26 20  OK && nRem>0 && 
26260 62 53 68 75 74 64 6f 77 6e 3d 3d 30 20 29 7b 0a  bShutdown==0 ){.
26270 20 20 20 20 69 6e 74 20 6e 50 67 20 3d 20 30 3b      int nPg = 0;
26280 0a 20 20 20 20 72 63 20 3d 20 73 6f 72 74 65 64  .    rc = sorted
26290 57 6f 72 6b 28 70 44 62 2c 20 6e 52 65 6d 2c 20  Work(pDb, nRem, 
262a0 6e 4d 65 72 67 65 2c 20 30 2c 20 26 6e 50 67 29  nMerge, 0, &nPg)
262b0 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 50  ;.    nRem -= nP
262c0 67 3b 0a 20 20 20 20 69 66 28 20 6e 50 67 20 29  g;.    if( nPg )
262d0 20 62 44 69 72 74 79 20 3d 20 31 3b 0a 20 20 7d   bDirty = 1;.  }
262e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e  ..  /* If the in
262f0 2d 6d 65 6d 6f 72 79 20 70 61 72 74 20 6f 66 20  -memory part of 
26300 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
26310 20 74 6f 6f 20 6c 61 72 67 65 2c 20 77 72 69 74   too large, writ
26320 65 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 74 6f  e a new .  ** to
26330 70 2d 6c 65 76 65 6c 20 63 6f 6e 74 61 69 6e 69  p-level containi
26340 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e 2d 6d  ng just the in-m
26350 65 6d 6f 72 79 20 66 72 65 65 2d 6c 69 73 74 20  emory free-list 
26360 65 6e 74 72 69 65 73 20 74 6f 20 64 69 73 6b 2e  entries to disk.
26370 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53   */.  if( rc==LS
26380 4d 5f 4f 4b 20 26 26 20 70 44 62 2d 3e 70 57 6f  M_OK && pDb->pWo
26390 72 6b 65 72 2d 3e 66 72 65 65 6c 69 73 74 2e 6e  rker->freelist.n
263a0 45 6e 74 72 79 20 3e 20 70 44 62 2d 3e 6e 4d 61  Entry > pDb->nMa
263b0 78 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20  xFreelist ){.   
263c0 20 69 6e 74 20 6e 50 67 20 3d 20 30 3b 0a 20 20   int nPg = 0;.  
263d0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 4c 53 4d    while( rc==LSM
263e0 5f 4f 4b 20 26 26 20 6c 73 6d 44 61 74 61 62 61  _OK && lsmDataba
263f0 73 65 46 75 6c 6c 28 70 44 62 29 20 29 7b 0a 20  seFull(pDb) ){. 
26400 20 20 20 20 20 72 63 20 3d 20 73 6f 72 74 65 64       rc = sorted
26410 57 6f 72 6b 28 70 44 62 2c 20 31 36 2c 20 6e 4d  Work(pDb, 16, nM
26420 65 72 67 65 2c 20 31 2c 20 26 6e 50 67 29 3b 0a  erge, 1, &nPg);.
26430 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 50        nRem -= nP
26440 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
26450 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
26460 20 20 20 20 20 72 63 20 3d 20 73 6f 72 74 65 64       rc = sorted
26470 4e 65 77 46 72 65 65 6c 69 73 74 4f 6e 6c 79 28  NewFreelistOnly(
26480 70 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pDb);.    }.    
26490 6e 52 65 6d 20 2d 3d 20 6e 50 67 3b 0a 20 20 20  nRem -= nPg;.   
264a0 20 69 66 28 20 6e 50 67 20 29 20 62 44 69 72 74   if( nPg ) bDirt
264b0 79 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 69 66  y = 1;.  }..  if
264c0 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
264d0 20 20 20 20 2a 70 6e 57 72 69 74 65 20 3d 20 28      *pnWrite = (
264e0 6e 4d 61 78 20 2d 20 6e 52 65 6d 29 3b 0a 20 20  nMax - nRem);.  
264f0 20 20 2a 70 62 43 6b 70 74 20 3d 20 28 62 43 6b    *pbCkpt = (bCk
26500 70 74 20 26 26 20 6e 52 65 6d 3c 3d 30 29 3b 0a  pt && nRem<=0);.
26510 20 20 20 20 69 66 28 20 6e 4d 65 72 67 65 3d 3d      if( nMerge==
26520 31 20 26 26 20 70 44 62 2d 3e 6e 41 75 74 6f 63  1 && pDb->nAutoc
26530 6b 70 74 3e 30 20 26 26 20 2a 70 6e 57 72 69 74  kpt>0 && *pnWrit
26540 65 3e 30 0a 20 20 20 20 20 26 26 20 70 57 6f 72  e>0.     && pWor
26550 6b 65 72 2d 3e 70 4c 65 76 65 6c 20 0a 20 20 20  ker->pLevel .   
26560 20 20 26 26 20 70 57 6f 72 6b 65 72 2d 3e 70 4c    && pWorker->pL
26570 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3d 3d 30 20  evel->nRight==0 
26580 0a 20 20 20 20 20 26 26 20 70 57 6f 72 6b 65 72  .     && pWorker
26590 2d 3e 70 4c 65 76 65 6c 2d 3e 70 4e 65 78 74 3d  ->pLevel->pNext=
265a0 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
265b0 20 2a 70 62 43 6b 70 74 20 3d 20 31 3b 0a 20 20   *pbCkpt = 1;.  
265c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
265d0 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 62 44 69  c==LSM_OK && bDi
265e0 72 74 79 20 29 7b 0a 20 20 20 20 6c 73 6d 46 69  rty ){.    lsmFi
265f0 6e 69 73 68 57 6f 72 6b 28 70 44 62 2c 20 30 2c  nishWork(pDb, 0,
26600 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   &rc);.  }else{.
26610 20 20 20 20 69 6e 74 20 72 63 64 75 6d 6d 79 20      int rcdummy 
26620 3d 20 4c 53 4d 5f 42 55 53 59 3b 0a 20 20 20 20  = LSM_BUSY;.    
26630 6c 73 6d 46 69 6e 69 73 68 57 6f 72 6b 28 70 44  lsmFinishWork(pD
26640 62 2c 20 30 2c 20 26 72 63 64 75 6d 6d 79 29 3b  b, 0, &rcdummy);
26650 0a 20 20 20 20 2a 70 6e 57 72 69 74 65 20 3d 20  .    *pnWrite = 
26660 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
26670 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 3d 3d 30   pDb->pWorker==0
26680 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
26690 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .}..static int d
266a0 6f 4c 73 6d 57 6f 72 6b 28 6c 73 6d 5f 64 62 20  oLsmWork(lsm_db 
266b0 2a 70 44 62 2c 20 69 6e 74 20 6e 4d 65 72 67 65  *pDb, int nMerge
266c0 2c 20 69 6e 74 20 6e 50 61 67 65 2c 20 69 6e 74  , int nPage, int
266d0 20 2a 70 6e 57 72 69 74 65 29 7b 0a 20 20 69 6e   *pnWrite){.  in
266e0 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20  t rc = LSM_OK;  
266f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26700 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
26710 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
26720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26730 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
26740 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ages written */.
26750 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 65 72 67  .  assert( nMerg
26760 65 3e 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20 6e  e>=1 );..  if( n
26770 50 61 67 65 21 3d 30 20 29 7b 0a 20 20 20 20 69  Page!=0 ){.    i
26780 6e 74 20 62 43 6b 70 74 20 3d 20 30 3b 0a 20 20  nt bCkpt = 0;.  
26790 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74    do {.      int
267a0 20 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20 20 20   nThis = 0;.    
267b0 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 28 6e 50    int nReq = (nP
267c0 61 67 65 3e 3d 30 29 20 3f 20 28 6e 50 61 67 65  age>=0) ? (nPage
267d0 2d 6e 57 72 69 74 65 29 20 3a 20 28 28 69 6e 74  -nWrite) : ((int
267e0 29 30 78 37 46 46 46 46 46 46 46 29 3b 0a 0a 20  )0x7FFFFFFF);.. 
267f0 20 20 20 20 20 62 43 6b 70 74 20 3d 20 30 3b 0a       bCkpt = 0;.
26800 20 20 20 20 20 20 72 63 20 3d 20 64 6f 4c 73 6d        rc = doLsm
26810 53 69 6e 67 6c 65 57 6f 72 6b 28 70 44 62 2c 20  SingleWork(pDb, 
26820 30 2c 20 6e 4d 65 72 67 65 2c 20 6e 52 65 71 2c  0, nMerge, nReq,
26830 20 26 6e 54 68 69 73 2c 20 26 62 43 6b 70 74 29   &nThis, &bCkpt)
26840 3b 0a 20 20 20 20 20 20 6e 57 72 69 74 65 20 2b  ;.      nWrite +
26850 3d 20 6e 54 68 69 73 3b 0a 20 20 20 20 20 20 69  = nThis;.      i
26860 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  f( rc==LSM_OK &&
26870 20 62 43 6b 70 74 20 29 7b 0a 20 20 20 20 20 20   bCkpt ){.      
26880 20 20 72 63 20 3d 20 6c 73 6d 5f 63 68 65 63 6b    rc = lsm_check
26890 70 6f 69 6e 74 28 70 44 62 2c 20 30 29 3b 0a 20  point(pDb, 0);. 
268a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
268b0 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  e( rc==LSM_OK &&
268c0 20 62 43 6b 70 74 20 26 26 20 28 6e 57 72 69 74   bCkpt && (nWrit
268d0 65 3c 6e 50 61 67 65 20 7c 7c 20 6e 50 61 67 65  e<nPage || nPage
268e0 3c 30 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  <0) );.  }..  if
268f0 28 20 70 6e 57 72 69 74 65 20 29 7b 0a 20 20 20  ( pnWrite ){.   
26900 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
26910 29 7b 0a 20 20 20 20 20 20 2a 70 6e 57 72 69 74  ){.      *pnWrit
26920 65 20 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20  e = nWrite;.    
26930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 6e  }else{.      *pn
26940 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 20 20 7d  Write = 0;.    }
26950 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  ;.}../*.** Perfo
26970 72 6d 20 77 6f 72 6b 20 74 6f 20 6d 65 72 67 65  rm work to merge
26980 20 64 61 74 61 62 61 73 65 20 73 65 67 6d 65 6e   database segmen
26990 74 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a  ts together..*/.
269a0 69 6e 74 20 6c 73 6d 5f 77 6f 72 6b 28 6c 73 6d  int lsm_work(lsm
269b0 5f 64 62 20 2a 70 44 62 2c 20 69 6e 74 20 6e 4d  _db *pDb, int nM
269c0 65 72 67 65 2c 20 69 6e 74 20 6e 4b 42 2c 20 69  erge, int nKB, i
269d0 6e 74 20 2a 70 6e 57 72 69 74 65 29 7b 0a 20 20  nt *pnWrite){.  
269e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a00 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
26a10 2f 0a 20 20 69 6e 74 20 6e 50 67 73 7a 3b 20 20  /.  int nPgsz;  
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a30 20 20 20 20 2f 2a 20 4e 6f 6d 69 6e 61 6c 20 70      /* Nominal p
26a40 61 67 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  age size in byte
26a50 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  s */.  int nPage
26a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26a70 20 20 20 20 20 20 20 2f 2a 20 45 71 75 69 76 61         /* Equiva
26a80 6c 65 6e 74 20 6f 66 20 6e 4b 42 20 69 6e 20 70  lent of nKB in p
26a90 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 57  ages */.  int nW
26aa0 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rite = 0;       
26ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26ac0 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
26ad0 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  tten */..  /* Th
26ae0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
26af0 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66  not be called if
26b00 20 70 44 62 20 68 61 73 20 61 6e 20 6f 70 65 6e   pDb has an open
26b10 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 20   read or write. 
26b20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e   ** transaction.
26b30 20 52 65 74 75 72 6e 20 4c 53 4d 5f 4d 49 53 55   Return LSM_MISU
26b40 53 45 20 69 66 20 61 6e 20 61 70 70 6c 69 63 61  SE if an applica
26b50 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 68  tion attempts th
26b60 69 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  is.  */.  if( pD
26b70 62 2d 3e 6e 54 72 61 6e 73 4f 70 65 6e 20 7c 7c  b->nTransOpen ||
26b80 20 70 44 62 2d 3e 70 43 73 72 20 29 20 72 65 74   pDb->pCsr ) ret
26b90 75 72 6e 20 4c 53 4d 5f 4d 49 53 55 53 45 5f 42  urn LSM_MISUSE_B
26ba0 4b 50 54 3b 0a 20 20 69 66 28 20 6e 4d 65 72 67  KPT;.  if( nMerg
26bb0 65 3c 3d 30 20 29 20 6e 4d 65 72 67 65 20 3d 20  e<=0 ) nMerge = 
26bc0 70 44 62 2d 3e 6e 4d 65 72 67 65 3b 0a 0a 20 20  pDb->nMerge;..  
26bd0 6c 73 6d 46 73 50 75 72 67 65 43 61 63 68 65 28  lsmFsPurgeCache(
26be0 70 44 62 2d 3e 70 46 53 29 3b 0a 0a 20 20 2f 2a  pDb->pFS);..  /*
26bf0 20 43 6f 6e 76 65 72 74 20 66 72 6f 6d 20 4b 42   Convert from KB
26c00 20 74 6f 20 70 61 67 65 73 20 2a 2f 0a 20 20 6e   to pages */.  n
26c10 50 67 73 7a 20 3d 20 6c 73 6d 46 73 50 61 67 65  Pgsz = lsmFsPage
26c20 53 69 7a 65 28 70 44 62 2d 3e 70 46 53 29 3b 0a  Size(pDb->pFS);.
26c30 20 20 69 66 28 20 6e 4b 42 3e 3d 30 20 29 7b 0a    if( nKB>=0 ){.
26c40 20 20 20 20 6e 50 61 67 65 20 3d 20 28 28 69 36      nPage = ((i6
26c50 34 29 6e 4b 42 20 2a 20 31 30 32 34 20 2b 20 6e  4)nKB * 1024 + n
26c60 50 67 73 7a 20 2d 20 31 29 20 2f 20 6e 50 67 73  Pgsz - 1) / nPgs
26c70 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  z;.  }else{.    
26c80 6e 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 7d 0a  nPage = -1;.  }.
26c90 0a 20 20 72 63 20 3d 20 64 6f 4c 73 6d 57 6f 72  .  rc = doLsmWor
26ca0 6b 28 70 44 62 2c 20 6e 4d 65 72 67 65 2c 20 6e  k(pDb, nMerge, n
26cb0 50 61 67 65 2c 20 26 6e 57 72 69 74 65 29 3b 0a  Page, &nWrite);.
26cc0 20 20 0a 20 20 69 66 28 20 70 6e 57 72 69 74 65    .  if( pnWrite
26cd0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65   ){.    /* Conve
26ce0 72 74 20 62 61 63 6b 20 66 72 6f 6d 20 70 61 67  rt back from pag
26cf0 65 73 20 74 6f 20 4b 42 20 2a 2f 0a 20 20 20 20  es to KB */.    
26d00 2a 70 6e 57 72 69 74 65 20 3d 20 28 69 6e 74 29  *pnWrite = (int)
26d10 28 28 28 69 36 34 29 6e 57 72 69 74 65 20 2a 20  (((i64)nWrite * 
26d20 31 30 32 34 20 2b 20 6e 50 67 73 7a 20 2d 20 31  1024 + nPgsz - 1
26d30 29 20 2f 20 6e 50 67 73 7a 29 3b 0a 20 20 7d 0a  ) / nPgsz);.  }.
26d40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26d50 69 6e 74 20 6c 73 6d 5f 66 6c 75 73 68 28 6c 73  int lsm_flush(ls
26d60 6d 5f 64 62 20 2a 64 62 29 7b 0a 20 20 69 6e 74  m_db *db){.  int
26d70 20 72 63 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e   rc;..  if( db->
26d80 6e 54 72 61 6e 73 4f 70 65 6e 3e 30 20 7c 7c 20  nTransOpen>0 || 
26d90 64 62 2d 3e 70 43 73 72 20 29 7b 0a 20 20 20 20  db->pCsr ){.    
26da0 72 63 20 3d 20 4c 53 4d 5f 4d 49 53 55 53 45 5f  rc = LSM_MISUSE_
26db0 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BKPT;.  }else{. 
26dc0 20 20 20 72 63 20 3d 20 6c 73 6d 42 65 67 69 6e     rc = lsmBegin
26dd0 57 72 69 74 65 54 72 61 6e 73 28 64 62 29 3b 0a  WriteTrans(db);.
26de0 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f      if( rc==LSM_
26df0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6c 73 6d 46  OK ){.      lsmF
26e00 6c 75 73 68 54 72 65 65 54 6f 44 69 73 6b 28 64  lushTreeToDisk(d
26e10 62 29 3b 0a 20 20 20 20 20 20 6c 73 6d 54 72 65  b);.      lsmTre
26e20 65 44 69 73 63 61 72 64 4f 6c 64 28 64 62 29 3b  eDiscardOld(db);
26e30 0a 20 20 20 20 20 20 6c 73 6d 54 72 65 65 4d 61  .      lsmTreeMa
26e40 6b 65 4f 6c 64 28 64 62 29 3b 0a 20 20 20 20 20  keOld(db);.     
26e50 20 6c 73 6d 54 72 65 65 44 69 73 63 61 72 64 4f   lsmTreeDiscardO
26e60 6c 64 28 64 62 29 3b 0a 20 20 20 20 7d 0a 0a 20  ld(db);.    }.. 
26e70 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
26e80 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
26e90 6c 73 6d 46 69 6e 69 73 68 57 72 69 74 65 54 72  lsmFinishWriteTr
26ea0 61 6e 73 28 64 62 2c 20 31 29 3b 0a 20 20 20 20  ans(db, 1);.    
26eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 73 6d  }else{.      lsm
26ec0 46 69 6e 69 73 68 57 72 69 74 65 54 72 61 6e 73  FinishWriteTrans
26ed0 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  (db, 0);.    }. 
26ee0 20 20 20 6c 73 6d 46 69 6e 69 73 68 52 65 61 64     lsmFinishRead
26ef0 54 72 61 6e 73 28 64 62 29 3b 0a 20 20 7d 0a 0a  Trans(db);.  }..
26f00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26f10 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
26f20 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 6e  ion is called in
26f30 20 61 75 74 6f 2d 77 6f 72 6b 20 6d 6f 64 65 20   auto-work mode 
26f40 74 6f 20 70 65 72 66 6f 72 6d 20 6d 65 72 67 69  to perform mergi
26f50 6e 67 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20 74 68  ng work on.** th
26f60 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
26f70 2e 20 49 74 20 70 65 72 66 6f 72 6d 73 20 65 6e  . It performs en
26f80 6f 75 67 68 20 6d 65 72 67 69 6e 67 20 77 6f 72  ough merging wor
26f90 6b 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  k to prevent the
26fa0 0a 2a 2a 20 68 65 69 67 68 74 20 6f 66 20 74 68  .** height of th
26fb0 65 20 74 72 65 65 20 66 72 6f 6d 20 67 72 6f 77  e tree from grow
26fc0 69 6e 67 20 69 6e 64 65 66 69 6e 69 74 65 6c 79  ing indefinitely
26fd0 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 72   assuming that r
26fe0 6f 75 67 68 6c 79 0a 2a 2a 20 6e 55 6e 69 74 20  oughly.** nUnit 
26ff0 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20 77  database pages w
27000 6f 72 74 68 20 6f 66 20 64 61 74 61 20 68 61 76  orth of data hav
27010 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
27020 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
27030 2a 20 28 69 2e 65 2e 20 74 68 65 20 69 6e 2d 6d  * (i.e. the in-m
27040 65 6d 6f 72 79 20 74 72 65 65 29 20 73 69 6e 63  emory tree) sinc
27050 65 20 74 68 65 20 6c 61 73 74 20 63 61 6c 6c 2e  e the last call.
27060 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 53 6f 72 74 65  .*/.int lsmSorte
27070 64 41 75 74 6f 57 6f 72 6b 28 0a 20 20 6c 73 6d  dAutoWork(.  lsm
27080 5f 64 62 20 2a 70 44 62 2c 20 20 20 20 20 20 20  _db *pDb,       
27090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
270a0 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
270b0 2a 2f 0a 20 20 69 6e 74 20 6e 55 6e 69 74 20 20  */.  int nUnit  
270c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270d0 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6f 66       /* Pages of
270e0 20 64 61 74 61 20 77 72 69 74 74 65 6e 20 74 6f   data written to
270f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65 20   in-memory tree 
27100 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
27110 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20   LSM_OK;        
27120 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
27130 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
27140 6e 44 65 70 74 68 20 3d 20 30 3b 20 20 20 20 20  nDepth = 0;     
27150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
27160 75 72 72 65 6e 74 20 68 65 69 67 68 74 20 6f 66  urrent height of
27170 20 74 72 65 65 20 28 6c 6f 6e 67 65 73 74 20 70   tree (longest p
27180 61 74 68 29 20 2a 2f 0a 20 20 4c 65 76 65 6c 20  ath) */.  Level 
27190 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  *pLevel;        
271a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
271b0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
271c0 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
271d0 20 69 6e 74 20 62 52 65 73 74 6f 72 65 20 3d 20   int bRestore = 
271e0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  0;..  assert( pD
271f0 62 2d 3e 70 57 6f 72 6b 65 72 3d 3d 30 20 29 3b  b->pWorker==0 );
27200 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
27210 6e 54 72 61 6e 73 4f 70 65 6e 3e 30 20 29 3b 0a  nTransOpen>0 );.
27220 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
27230 68 6f 77 20 6d 61 6e 79 20 75 6e 69 74 73 20 6f  how many units o
27240 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 62 65 66  f work to do bef
27250 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 4f  ore returning. O
27260 6e 65 20 75 6e 69 74 20 6f 66 0a 20 20 2a 2a 20  ne unit of.  ** 
27270 77 6f 72 6b 20 69 73 20 61 63 68 69 65 76 65 64  work is achieved
27280 20 62 79 20 77 72 69 74 69 6e 67 20 6f 6e 65 20   by writing one 
27290 70 61 67 65 20 28 7e 34 4b 42 29 20 6f 66 20 6d  page (~4KB) of m
272a0 65 72 67 65 64 20 64 61 74 61 2e 20 20 2a 2f 0a  erged data.  */.
272b0 20 20 66 6f 72 28 70 4c 65 76 65 6c 3d 6c 73 6d    for(pLevel=lsm
272c0 44 62 53 6e 61 70 73 68 6f 74 4c 65 76 65 6c 28  DbSnapshotLevel(
272d0 70 44 62 2d 3e 70 43 6c 69 65 6e 74 29 3b 20 70  pDb->pClient); p
272e0 4c 65 76 65 6c 3b 20 70 4c 65 76 65 6c 3d 70 4c  Level; pLevel=pL
272f0 65 76 65 6c 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  evel->pNext){.  
27300 20 20 2f 2a 20 6e 44 65 70 74 68 20 2b 3d 20 4c    /* nDepth += L
27310 53 4d 5f 4d 41 58 28 31 2c 20 70 4c 65 76 65 6c  SM_MAX(1, pLevel
27320 2d 3e 6e 52 69 67 68 74 29 3b 20 2a 2f 0a 20 20  ->nRight); */.  
27330 20 20 6e 44 65 70 74 68 20 2b 3d 20 31 3b 0a 20    nDepth += 1;. 
27340 20 7d 0a 20 20 69 66 28 20 6c 73 6d 54 72 65 65   }.  if( lsmTree
27350 48 61 73 4f 6c 64 28 70 44 62 29 20 29 7b 0a 20  HasOld(pDb) ){. 
27360 20 20 20 6e 44 65 70 74 68 20 2b 3d 20 31 3b 0a     nDepth += 1;.
27370 20 20 20 20 62 52 65 73 74 6f 72 65 20 3d 20 31      bRestore = 1
27380 3b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 53 61  ;.    rc = lsmSa
27390 76 65 43 75 72 73 6f 72 73 28 70 44 62 29 3b 0a  veCursors(pDb);.
273a0 20 20 20 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f      if( rc!=LSM_
273b0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
273c0 20 20 7d 0a 0a 20 20 69 66 28 20 6e 44 65 70 74    }..  if( nDept
273d0 68 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  h>0 ){.    int n
273e0 52 65 6d 61 69 6e 69 6e 67 3b 20 20 20 20 20 20  Remaining;      
273f0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 74           /* Unit
27400 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s of work to do 
27410 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
27420 20 2a 2f 0a 0a 20 20 20 20 6e 52 65 6d 61 69 6e   */..    nRemain
27430 69 6e 67 20 3d 20 6e 55 6e 69 74 20 2a 20 6e 44  ing = nUnit * nD
27440 65 70 74 68 3b 0a 23 69 66 64 65 66 20 4c 53 4d  epth;.#ifdef LSM
27450 5f 4c 4f 47 5f 57 4f 52 4b 0a 20 20 20 20 6c 73  _LOG_WORK.    ls
27460 6d 4c 6f 67 4d 65 73 73 61 67 65 28 70 44 62 2c  mLogMessage(pDb,
27470 20 72 63 2c 20 22 6c 73 6d 53 6f 72 74 65 64 41   rc, "lsmSortedA
27480 75 74 6f 57 6f 72 6b 28 29 3a 20 25 64 2a 25 64  utoWork(): %d*%d
27490 20 3d 20 25 64 20 70 61 67 65 73 22 2c 20 0a 20   = %d pages", . 
274a0 20 20 20 20 20 20 20 6e 55 6e 69 74 2c 20 6e 44         nUnit, nD
274b0 65 70 74 68 2c 20 6e 52 65 6d 61 69 6e 69 6e 67  epth, nRemaining
274c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  );.#endif.    as
274d0 73 65 72 74 28 20 6e 52 65 6d 61 69 6e 69 6e 67  sert( nRemaining
274e0 3e 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  >=0 );.    rc = 
274f0 64 6f 4c 73 6d 57 6f 72 6b 28 70 44 62 2c 20 70  doLsmWork(pDb, p
27500 44 62 2d 3e 6e 4d 65 72 67 65 2c 20 6e 52 65 6d  Db->nMerge, nRem
27510 61 69 6e 69 6e 67 2c 20 30 29 3b 0a 20 20 20 20  aining, 0);.    
27520 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 42 55 53 59  if( rc==LSM_BUSY
27530 20 29 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a   ) rc = LSM_OK;.
27540 0a 20 20 20 20 69 66 28 20 62 52 65 73 74 6f 72  .    if( bRestor
27550 65 20 26 26 20 70 44 62 2d 3e 70 43 73 72 20 29  e && pDb->pCsr )
27560 7b 0a 20 20 20 20 20 20 6c 73 6d 4d 43 75 72 73  {.      lsmMCurs
27570 6f 72 46 72 65 65 43 61 63 68 65 28 70 44 62 29  orFreeCache(pDb)
27580 3b 0a 20 20 20 20 20 20 6c 73 6d 46 72 65 65 53  ;.      lsmFreeS
27590 6e 61 70 73 68 6f 74 28 70 44 62 2d 3e 70 45 6e  napshot(pDb->pEn
275a0 76 2c 20 70 44 62 2d 3e 70 43 6c 69 65 6e 74 29  v, pDb->pClient)
275b0 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 43 6c  ;.      pDb->pCl
275c0 69 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ient = 0;.      
275d0 72 63 20 3d 20 6c 73 6d 43 68 65 63 6b 70 6f 69  rc = lsmCheckpoi
275e0 6e 74 4c 6f 61 64 28 70 44 62 2c 20 30 29 3b 0a  ntLoad(pDb, 0);.
275f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53        if( rc==LS
27600 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  M_OK ){.        
27610 72 63 20 3d 20 6c 73 6d 43 68 65 63 6b 70 6f 69  rc = lsmCheckpoi
27620 6e 74 44 65 73 65 72 69 61 6c 69 7a 65 28 70 44  ntDeserialize(pD
27630 62 2c 20 30 2c 20 70 44 62 2d 3e 61 53 6e 61 70  b, 0, pDb->aSnap
27640 73 68 6f 74 2c 20 26 70 44 62 2d 3e 70 43 6c 69  shot, &pDb->pCli
27650 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ent);.      }.  
27660 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f      if( rc==LSM_
27670 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
27680 20 3d 20 6c 73 6d 52 65 73 74 6f 72 65 43 75 72   = lsmRestoreCur
27690 73 6f 72 73 28 70 44 62 29 3b 0a 20 20 20 20 20  sors(pDb);.     
276a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
276b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
276c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
276d0 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
276e0 20 64 75 72 69 6e 67 20 73 79 73 74 65 6d 20 73   during system s
276f0 68 75 74 64 6f 77 6e 2e 20 54 68 65 20 63 6f 6e  hutdown. The con
27700 74 65 6e 74 73 20 6f 66 0a 2a 2a 20 61 6e 79 20  tents of.** any 
27710 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65 73 20  in-memory trees 
27720 70 72 65 73 65 6e 74 20 28 6f 6c 64 20 6f 72 20  present (old or 
27730 63 75 72 72 65 6e 74 29 20 61 72 65 20 77 72 69  current) are wri
27740 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tten out to disk
27750 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 46 6c 75 73  ..*/.int lsmFlus
27760 68 54 72 65 65 54 6f 44 69 73 6b 28 6c 73 6d 5f  hTreeToDisk(lsm_
27770 64 62 20 2a 70 44 62 29 7b 0a 20 20 69 6e 74 20  db *pDb){.  int 
27780 72 63 3b 0a 0a 20 20 72 63 20 3d 20 6c 73 6d 42  rc;..  rc = lsmB
27790 65 67 69 6e 57 6f 72 6b 28 70 44 62 29 3b 0a 20  eginWork(pDb);. 
277a0 20 77 68 69 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f   while( rc==LSM_
277b0 4f 4b 20 26 26 20 73 6f 72 74 65 64 44 62 49 73  OK && sortedDbIs
277c0 46 75 6c 6c 28 70 44 62 29 20 29 7b 0a 20 20 20  Full(pDb) ){.   
277d0 20 72 63 20 3d 20 73 6f 72 74 65 64 57 6f 72 6b   rc = sortedWork
277e0 28 70 44 62 2c 20 32 35 36 2c 20 70 44 62 2d 3e  (pDb, 256, pDb->
277f0 6e 4d 65 72 67 65 2c 20 31 2c 20 30 29 3b 0a 20  nMerge, 1, 0);. 
27800 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53   }..  if( rc==LS
27810 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  M_OK ){.    rc =
27820 20 73 6f 72 74 65 64 4e 65 77 54 6f 70 6c 65 76   sortedNewToplev
27830 65 6c 28 70 44 62 2c 20 54 52 45 45 5f 42 4f 54  el(pDb, TREE_BOT
27840 48 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 6c 73  H, 0);.  }..  ls
27850 6d 46 69 6e 69 73 68 57 6f 72 6b 28 70 44 62 2c  mFinishWork(pDb,
27860 20 31 2c 20 26 72 63 29 3b 0a 20 20 72 65 74 75   1, &rc);.  retu
27870 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27880 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  Return a string 
27890 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
278a0 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 70 61  f the segment pa
278b0 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
278c0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 53 70   argument..** Sp
278d0 61 63 65 20 66 6f 72 20 74 68 65 20 72 65 74 75  ace for the retu
278e0 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 61  rned string is a
278f0 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 6c  llocated using l
27900 73 6d 4d 61 6c 6c 6f 63 28 29 2c 20 61 6e 64 20  smMalloc(), and 
27910 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 66 72 65  should.** be fre
27920 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
27930 20 75 73 69 6e 67 20 6c 73 6d 46 72 65 65 28 29   using lsmFree()
27940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
27950 20 2a 73 65 67 54 6f 53 74 72 69 6e 67 28 6c 73   *segToString(ls
27960 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 53 65 67  m_env *pEnv, Seg
27970 6d 65 6e 74 20 2a 70 53 65 67 2c 20 69 6e 74 20  ment *pSeg, int 
27980 6e 4d 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 53 69  nMin){.  int nSi
27990 7a 65 20 3d 20 70 53 65 67 2d 3e 6e 53 69 7a 65  ze = pSeg->nSize
279a0 3b 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 20 3d  ;.  Pgno iRoot =
279b0 20 70 53 65 67 2d 3e 69 52 6f 6f 74 3b 0a 20 20   pSeg->iRoot;.  
279c0 50 67 6e 6f 20 69 46 69 72 73 74 20 3d 20 70 53  Pgno iFirst = pS
279d0 65 67 2d 3e 69 46 69 72 73 74 3b 0a 20 20 50 67  eg->iFirst;.  Pg
279e0 6e 6f 20 69 4c 61 73 74 20 3d 20 70 53 65 67 2d  no iLast = pSeg-
279f0 3e 69 4c 61 73 74 50 67 3b 0a 20 20 63 68 61 72  >iLastPg;.  char
27a00 20 2a 7a 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 31   *z;..  char *z1
27a10 3b 0a 20 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20  ;.  char *z2;.  
27a20 69 6e 74 20 6e 50 61 64 3b 0a 0a 20 20 7a 31 20  int nPad;..  z1 
27a30 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 50 72 69 6e 74  = lsmMallocPrint
27a40 66 28 70 45 6e 76 2c 20 22 25 64 2e 25 64 22 2c  f(pEnv, "%d.%d",
27a50 20 69 46 69 72 73 74 2c 20 69 4c 61 73 74 29 3b   iFirst, iLast);
27a60 0a 20 20 69 66 28 20 69 52 6f 6f 74 20 29 7b 0a  .  if( iRoot ){.
27a70 20 20 20 20 7a 32 20 3d 20 6c 73 6d 4d 61 6c 6c      z2 = lsmMall
27a80 6f 63 50 72 69 6e 74 66 28 70 45 6e 76 2c 20 22  ocPrintf(pEnv, "
27a90 72 6f 6f 74 3d 25 64 22 2c 20 69 52 6f 6f 74 29  root=%d", iRoot)
27aa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
27ab0 32 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 50 72 69  2 = lsmMallocPri
27ac0 6e 74 66 28 70 45 6e 76 2c 20 22 73 69 7a 65 3d  ntf(pEnv, "size=
27ad0 25 64 22 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d  %d", nSize);.  }
27ae0 0a 0a 20 20 6e 50 61 64 20 3d 20 6e 4d 69 6e 20  ..  nPad = nMin 
27af0 2d 20 32 20 2d 20 73 74 72 6c 65 6e 28 7a 31 29  - 2 - strlen(z1)
27b00 20 2d 20 31 20 2d 20 73 74 72 6c 65 6e 28 7a 32   - 1 - strlen(z2
27b10 29 3b 0a 20 20 6e 50 61 64 20 3d 20 4c 53 4d 5f  );.  nPad = LSM_
27b20 4d 41 58 28 30 2c 20 6e 50 61 64 29 3b 0a 0a 20  MAX(0, nPad);.. 
27b30 20 69 66 28 20 69 52 6f 6f 74 20 29 7b 0a 20 20   if( iRoot ){.  
27b40 20 20 7a 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 50    z = lsmMallocP
27b50 72 69 6e 74 66 28 70 45 6e 76 2c 20 22 2f 25 73  rintf(pEnv, "/%s
27b60 20 25 2a 73 25 73 5c 5c 22 2c 20 7a 31 2c 20 6e   %*s%s\\", z1, n
27b70 50 61 64 2c 20 22 22 2c 20 7a 32 29 3b 0a 20 20  Pad, "", z2);.  
27b80 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 6c  }else{.    z = l
27b90 73 6d 4d 61 6c 6c 6f 63 50 72 69 6e 74 66 28 70  smMallocPrintf(p
27ba0 45 6e 76 2c 20 22 7c 25 73 20 25 2a 73 25 73 7c  Env, "|%s %*s%s|
27bb0 22 2c 20 7a 31 2c 20 6e 50 61 64 2c 20 22 22 2c  ", z1, nPad, "",
27bc0 20 7a 32 29 3b 0a 20 20 7d 0a 20 20 6c 73 6d 46   z2);.  }.  lsmF
27bd0 72 65 65 28 70 45 6e 76 2c 20 7a 31 29 3b 0a 20  ree(pEnv, z1);. 
27be0 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c 20 7a   lsmFree(pEnv, z
27bf0 32 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 3b  2);..  return z;
27c00 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
27c10 69 6c 65 54 6f 53 74 72 69 6e 67 28 0a 20 20 6c  ileToString(.  l
27c20 73 6d 5f 64 62 20 2a 70 44 62 2c 20 20 20 20 20  sm_db *pDb,     
27c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27c40 2a 20 46 6f 72 20 78 4d 61 6c 6c 6f 63 28 29 20  * For xMalloc() 
27c50 2a 2f 0a 20 20 63 68 61 72 20 2a 61 42 75 66 2c  */.  char *aBuf,
27c60 20 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 0a 20   .  int nBuf, . 
27c70 20 69 6e 74 20 6e 4d 69 6e 2c 0a 20 20 53 65 67   int nMin,.  Seg
27c80 6d 65 6e 74 20 2a 70 53 65 67 0a 29 7b 0a 20 20  ment *pSeg.){.  
27c90 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 66 28  int i = 0;.  if(
27ca0 20 70 53 65 67 20 29 7b 0a 20 20 20 20 63 68 61   pSeg ){.    cha
27cb0 72 20 2a 7a 53 65 67 3b 0a 0a 20 20 20 20 7a 53  r *zSeg;..    zS
27cc0 65 67 20 3d 20 73 65 67 54 6f 53 74 72 69 6e 67  eg = segToString
27cd0 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70 53 65 67  (pDb->pEnv, pSeg
27ce0 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 73 71 6c  , nMin);.    sql
27cf0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
27d00 75 66 2d 69 2c 20 26 61 42 75 66 5b 69 5d 2c 20  uf-i, &aBuf[i], 
27d10 22 25 73 22 2c 20 7a 53 65 67 29 3b 0a 20 20 20  "%s", zSeg);.   
27d20 20 69 20 2b 3d 20 73 74 72 6c 65 6e 28 26 61 42   i += strlen(&aB
27d30 75 66 5b 69 5d 29 3b 0a 20 20 20 20 6c 73 6d 46  uf[i]);.    lsmF
27d40 72 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20 7a  ree(pDb->pEnv, z
27d50 53 65 67 29 3b 0a 0a 23 69 66 64 65 66 20 4c 53  Seg);..#ifdef LS
27d60 4d 5f 4c 4f 47 5f 46 52 45 45 4c 49 53 54 0a 20  M_LOG_FREELIST. 
27d70 20 20 20 6c 73 6d 49 6e 66 6f 41 72 72 61 79 53     lsmInfoArrayS
27d80 74 72 75 63 74 75 72 65 28 70 44 62 2c 20 31 2c  tructure(pDb, 1,
27d90 20 70 53 65 67 2d 3e 69 46 69 72 73 74 2c 20 26   pSeg->iFirst, &
27da0 7a 53 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  zSeg);.    sqlit
27db0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
27dc0 2d 69 2c 20 26 61 42 75 66 5b 69 5d 2c 20 22 20  -i, &aBuf[i], " 
27dd0 20 20 20 28 25 73 29 22 2c 20 7a 53 65 67 29 3b     (%s)", zSeg);
27de0 0a 20 20 20 20 69 20 2b 3d 20 73 74 72 6c 65 6e  .    i += strlen
27df0 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20  (&aBuf[i]);.    
27e00 6c 73 6d 46 72 65 65 28 70 44 62 2d 3e 70 45 6e  lsmFree(pDb->pEn
27e10 76 2c 20 7a 53 65 67 29 3b 0a 23 65 6e 64 69 66  v, zSeg);.#endif
27e20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 42  .  }else{.    aB
27e30 75 66 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  uf[0] = '\0';.  
27e40 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  }..  return i;.}
27e50 0a 0a 76 6f 69 64 20 73 6f 72 74 65 64 44 75 6d  ..void sortedDum
27e60 70 50 61 67 65 28 6c 73 6d 5f 64 62 20 2a 70 44  pPage(lsm_db *pD
27e70 62 2c 20 53 65 67 6d 65 6e 74 20 2a 70 52 75 6e  b, Segment *pRun
27e80 2c 20 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74  , Page *pPg, int
27e90 20 62 56 61 6c 73 29 7b 0a 20 20 42 6c 6f 62 20   bVals){.  Blob 
27ea0 62 6c 6f 62 20 3d 20 7b 30 2c 20 30 2c 20 30 7d  blob = {0, 0, 0}
27eb0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6c 6f  ;         /* Blo
27ec0 62 20 75 73 65 64 20 66 6f 72 20 6b 65 79 73 20  b used for keys 
27ed0 2a 2f 0a 20 20 4c 73 6d 53 74 72 69 6e 67 20 73  */.  LsmString s
27ee0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 6e  ;.  int i;..  in
27ef0 74 20 6e 52 65 63 3b 0a 20 20 69 6e 74 20 69 50  t nRec;.  int iP
27f00 74 72 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b  tr;.  int flags;
27f10 0a 20 20 75 38 20 2a 61 44 61 74 61 3b 0a 20 20  .  u8 *aData;.  
27f20 69 6e 74 20 6e 44 61 74 61 3b 0a 0a 20 20 61 44  int nData;..  aD
27f30 61 74 61 20 3d 20 66 73 50 61 67 65 44 61 74 61  ata = fsPageData
27f40 28 70 50 67 2c 20 26 6e 44 61 74 61 29 3b 0a 0a  (pPg, &nData);..
27f50 20 20 6e 52 65 63 20 3d 20 70 61 67 65 47 65 74    nRec = pageGet
27f60 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44 61 74  NRec(aData, nDat
27f70 61 29 3b 0a 20 20 69 50 74 72 20 3d 20 70 61 67  a);.  iPtr = pag
27f80 65 47 65 74 50 74 72 28 61 44 61 74 61 2c 20 6e  eGetPtr(aData, n
27f90 44 61 74 61 29 3b 0a 20 20 66 6c 61 67 73 20 3d  Data);.  flags =
27fa0 20 70 61 67 65 47 65 74 46 6c 61 67 73 28 61 44   pageGetFlags(aD
27fb0 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 0a 20 20  ata, nData);..  
27fc0 6c 73 6d 53 74 72 69 6e 67 49 6e 69 74 28 26 73  lsmStringInit(&s
27fd0 2c 20 70 44 62 2d 3e 70 45 6e 76 29 3b 0a 20 20  , pDb->pEnv);.  
27fe0 6c 73 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66  lsmStringAppendf
27ff0 28 26 73 2c 22 6e 43 65 6c 6c 3d 25 64 20 69 50  (&s,"nCell=%d iP
28000 74 72 3d 25 64 20 66 6c 61 67 73 3d 25 64 20 7b  tr=%d flags=%d {
28010 22 2c 20 6e 52 65 63 2c 20 69 50 74 72 2c 20 66  ", nRec, iPtr, f
28020 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 66 6c 61  lags);.  if( fla
28030 67 73 26 53 45 47 4d 45 4e 54 5f 42 54 52 45 45  gs&SEGMENT_BTREE
28040 5f 46 4c 41 47 20 29 20 69 50 74 72 20 3d 20 30  _FLAG ) iPtr = 0
28050 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
28060 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nRec; i++){.    
28070 50 61 67 65 20 2a 70 52 65 66 20 3d 20 30 3b 20  Page *pRef = 0; 
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28090 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
280a0 20 69 52 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74   iRef */.    int
280b0 20 69 43 68 61 72 3b 0a 20 20 20 20 75 38 20 2a   iChar;.    u8 *
280c0 61 4b 65 79 3b 20 69 6e 74 20 6e 4b 65 79 20 3d  aKey; int nKey =
280d0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4b 65 79   0;       /* Key
280e0 20 2a 2f 0a 20 20 20 20 75 38 20 2a 61 56 61 6c   */.    u8 *aVal
280f0 3b 20 69 6e 74 20 6e 56 61 6c 20 3d 20 30 3b 20  ; int nVal = 0; 
28100 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 2a        /* Value *
28110 2f 0a 20 20 20 20 69 6e 74 20 69 54 6f 70 69 63  /.    int iTopic
28120 3b 0a 20 20 20 20 75 38 20 2a 61 43 65 6c 6c 3b  ;.    u8 *aCell;
28130 0a 20 20 20 20 69 6e 74 20 69 50 67 50 74 72 3b  .    int iPgPtr;
28140 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a  .    int eType;.
28150 0a 20 20 20 20 61 43 65 6c 6c 20 3d 20 70 61 67  .    aCell = pag
28160 65 47 65 74 43 65 6c 6c 28 61 44 61 74 61 2c 20  eGetCell(aData, 
28170 6e 44 61 74 61 2c 20 69 29 3b 0a 20 20 20 20 65  nData, i);.    e
28180 54 79 70 65 20 3d 20 2a 61 43 65 6c 6c 2b 2b 3b  Type = *aCell++;
28190 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c  .    assert( (fl
281a0 61 67 73 20 26 20 53 45 47 4d 45 4e 54 5f 42 54  ags & SEGMENT_BT
281b0 52 45 45 5f 46 4c 41 47 29 20 7c 7c 20 65 54 79  REE_FLAG) || eTy
281c0 70 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 43 65  pe!=0 );.    aCe
281d0 6c 6c 20 2b 3d 20 6c 73 6d 56 61 72 69 6e 74 47  ll += lsmVarintG
281e0 65 74 33 32 28 61 43 65 6c 6c 2c 20 26 69 50 67  et32(aCell, &iPg
281f0 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 65  Ptr);..    if( e
28200 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Type==0 ){.     
28210 20 50 67 6e 6f 20 69 52 65 66 3b 20 20 20 20 20   Pgno iRef;     
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28230 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  Page number of r
28240 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 20 2a  eferenced page *
28250 2f 0a 20 20 20 20 20 20 61 43 65 6c 6c 20 2b 3d  /.      aCell +=
28260 20 6c 73 6d 56 61 72 69 6e 74 47 65 74 36 34 28   lsmVarintGet64(
28270 61 43 65 6c 6c 2c 20 26 69 52 65 66 29 3b 0a 20  aCell, &iRef);. 
28280 20 20 20 20 20 6c 73 6d 46 73 44 62 50 61 67 65       lsmFsDbPage
28290 47 65 74 28 70 44 62 2d 3e 70 46 53 2c 20 70 52  Get(pDb->pFS, pR
282a0 75 6e 2c 20 69 52 65 66 2c 20 26 70 52 65 66 29  un, iRef, &pRef)
282b0 3b 0a 20 20 20 20 20 20 61 4b 65 79 20 3d 20 70  ;.      aKey = p
282c0 61 67 65 47 65 74 4b 65 79 28 70 52 75 6e 2c 20  ageGetKey(pRun, 
282d0 70 52 65 66 2c 20 30 2c 20 26 69 54 6f 70 69 63  pRef, 0, &iTopic
282e0 2c 20 26 6e 4b 65 79 2c 20 26 62 6c 6f 62 29 3b  , &nKey, &blob);
282f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28300 20 20 61 43 65 6c 6c 20 2b 3d 20 6c 73 6d 56 61    aCell += lsmVa
28310 72 69 6e 74 47 65 74 33 32 28 61 43 65 6c 6c 2c  rintGet32(aCell,
28320 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 69   &nKey);.      i
28330 66 28 20 72 74 49 73 57 72 69 74 65 28 65 54 79  f( rtIsWrite(eTy
28340 70 65 29 20 29 20 61 43 65 6c 6c 20 2b 3d 20 6c  pe) ) aCell += l
28350 73 6d 56 61 72 69 6e 74 47 65 74 33 32 28 61 43  smVarintGet32(aC
28360 65 6c 6c 2c 20 26 6e 56 61 6c 29 3b 0a 20 20 20  ell, &nVal);.   
28370 20 20 20 73 6f 72 74 65 64 52 65 61 64 44 61 74     sortedReadDat
28380 61 28 30 2c 20 70 50 67 2c 20 28 61 43 65 6c 6c  a(0, pPg, (aCell
28390 2d 61 44 61 74 61 29 2c 20 6e 4b 65 79 2b 6e 56  -aData), nKey+nV
283a0 61 6c 2c 20 28 76 6f 69 64 20 2a 2a 29 26 61 4b  al, (void **)&aK
283b0 65 79 2c 20 26 62 6c 6f 62 29 3b 0a 20 20 20 20  ey, &blob);.    
283c0 20 20 61 56 61 6c 20 3d 20 26 61 4b 65 79 5b 6e    aVal = &aKey[n
283d0 4b 65 79 5d 3b 0a 20 20 20 20 20 20 69 54 6f 70  Key];.      iTop
283e0 69 63 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  ic = eType;.    
283f0 7d 0a 0a 20 20 20 20 6c 73 6d 53 74 72 69 6e 67  }..    lsmString
28400 41 70 70 65 6e 64 66 28 26 73 2c 20 22 25 73 25  Appendf(&s, "%s%
28410 32 58 3a 22 2c 20 28 69 3d 3d 30 3f 22 22 3a 22  2X:", (i==0?"":"
28420 20 22 29 2c 20 69 54 6f 70 69 63 29 3b 0a 20 20   "), iTopic);.  
28430 20 20 66 6f 72 28 69 43 68 61 72 3d 30 3b 20 69    for(iChar=0; i
28440 43 68 61 72 3c 6e 4b 65 79 3b 20 69 43 68 61 72  Char<nKey; iChar
28450 2b 2b 29 7b 0a 20 20 20 20 20 20 6c 73 6d 53 74  ++){.      lsmSt
28460 72 69 6e 67 41 70 70 65 6e 64 66 28 26 73 2c 20  ringAppendf(&s, 
28470 22 25 63 22 2c 20 69 73 61 6c 6e 75 6d 28 61 4b  "%c", isalnum(aK
28480 65 79 5b 69 43 68 61 72 5d 29 20 3f 20 61 4b 65  ey[iChar]) ? aKe
28490 79 5b 69 43 68 61 72 5d 20 3a 20 27 2e 27 29 3b  y[iChar] : '.');
284a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
284b0 56 61 6c 3e 30 20 26 26 20 62 56 61 6c 73 20 29  Val>0 && bVals )
284c0 7b 0a 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e  {.      lsmStrin
284d0 67 41 70 70 65 6e 64 66 28 26 73 2c 20 22 23 23  gAppendf(&s, "##
284e0 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  ");.      for(iC
284f0 68 61 72 3d 30 3b 20 69 43 68 61 72 3c 6e 56 61  har=0; iChar<nVa
28500 6c 3b 20 69 43 68 61 72 2b 2b 29 7b 0a 20 20 20  l; iChar++){.   
28510 20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70       lsmStringAp
28520 70 65 6e 64 66 28 26 73 2c 20 22 25 63 22 2c 20  pendf(&s, "%c", 
28530 69 73 61 6c 6e 75 6d 28 61 56 61 6c 5b 69 43 68  isalnum(aVal[iCh
28540 61 72 5d 29 20 3f 20 61 56 61 6c 5b 69 43 68 61  ar]) ? aVal[iCha
28550 72 5d 20 3a 20 27 2e 27 29 3b 0a 20 20 20 20 20  r] : '.');.     
28560 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c 73   }.    }..    ls
28570 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66 28 26  mStringAppendf(&
28580 73 2c 20 22 20 25 64 22 2c 20 69 50 67 50 74 72  s, " %d", iPgPtr
28590 2b 69 50 74 72 29 3b 0a 20 20 20 20 6c 73 6d 46  +iPtr);.    lsmF
285a0 73 50 61 67 65 52 65 6c 65 61 73 65 28 70 52 65  sPageRelease(pRe
285b0 66 29 3b 0a 20 20 7d 0a 20 20 6c 73 6d 53 74 72  f);.  }.  lsmStr
285c0 69 6e 67 41 70 70 65 6e 64 28 26 73 2c 20 22 7d  ingAppend(&s, "}
285d0 22 2c 20 31 29 3b 0a 0a 20 20 6c 73 6d 4c 6f 67  ", 1);..  lsmLog
285e0 4d 65 73 73 61 67 65 28 70 44 62 2c 20 4c 53 4d  Message(pDb, LSM
285f0 5f 4f 4b 2c 20 22 20 20 20 20 20 20 50 61 67 65  _OK, "      Page
28600 20 25 64 3a 20 25 73 22 2c 20 6c 73 6d 46 73 50   %d: %s", lsmFsP
28610 61 67 65 4e 75 6d 62 65 72 28 70 50 67 29 2c 20  ageNumber(pPg), 
28620 73 2e 7a 29 3b 0a 20 20 6c 73 6d 53 74 72 69 6e  s.z);.  lsmStrin
28630 67 43 6c 65 61 72 28 26 73 29 3b 0a 0a 20 20 73  gClear(&s);..  s
28640 6f 72 74 65 64 42 6c 6f 62 46 72 65 65 28 26 62  ortedBlobFree(&b
28650 6c 6f 62 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  lob);.}..static 
28660 76 6f 69 64 20 69 6e 66 6f 43 65 6c 6c 44 75 6d  void infoCellDum
28670 70 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62  p(.  lsm_db *pDb
28680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28690 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
286a0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67   handle */.  Seg
286b0 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20  ment *pSeg,     
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
286d0 53 65 67 6d 65 6e 74 20 70 61 67 65 20 62 65 6c  Segment page bel
286e0 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  ongs to */.  int
286f0 20 62 49 6e 64 69 72 65 63 74 2c 20 20 20 20 20   bIndirect,     
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28710 54 72 75 65 20 74 6f 20 66 6f 6c 6c 6f 77 20 69  True to follow i
28720 6e 64 69 72 65 63 74 20 72 65 66 73 20 2a 2f 0a  ndirect refs */.
28730 20 20 50 61 67 65 20 2a 70 50 67 2c 0a 20 20 69    Page *pPg,.  i
28740 6e 74 20 69 43 65 6c 6c 2c 0a 20 20 69 6e 74 20  nt iCell,.  int 
28750 2a 70 65 54 79 70 65 2c 0a 20 20 69 6e 74 20 2a  *peType,.  int *
28760 70 69 50 67 50 74 72 2c 0a 20 20 75 38 20 2a 2a  piPgPtr,.  u8 **
28770 70 61 4b 65 79 2c 20 69 6e 74 20 2a 70 6e 4b 65  paKey, int *pnKe
28780 79 2c 0a 20 20 75 38 20 2a 2a 70 61 56 61 6c 2c  y,.  u8 **paVal,
28790 20 69 6e 74 20 2a 70 6e 56 61 6c 2c 0a 20 20 42   int *pnVal,.  B
287a0 6c 6f 62 20 2a 70 42 6c 6f 62 0a 29 7b 0a 20 20  lob *pBlob.){.  
287b0 75 38 20 2a 61 44 61 74 61 3b 20 69 6e 74 20 6e  u8 *aData; int n
287c0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
287d0 2f 2a 20 50 61 67 65 20 64 61 74 61 20 2a 2f 0a  /* Page data */.
287e0 20 20 75 38 20 2a 61 4b 65 79 3b 20 69 6e 74 20    u8 *aKey; int 
287f0 6e 4b 65 79 20 3d 20 30 3b 20 20 20 20 20 20 20  nKey = 0;       
28800 20 20 2f 2a 20 4b 65 79 20 2a 2f 0a 20 20 75 38    /* Key */.  u8
28810 20 2a 61 56 61 6c 3b 20 69 6e 74 20 6e 56 61 6c   *aVal; int nVal
28820 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
28830 20 56 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   Value */.  int 
28840 65 54 79 70 65 3b 0a 20 20 69 6e 74 20 69 50 67  eType;.  int iPg
28850 50 74 72 3b 0a 20 20 50 61 67 65 20 2a 70 52 65  Ptr;.  Page *pRe
28860 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
28870 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
28880 72 20 74 6f 20 70 61 67 65 20 69 52 65 66 20 2a  r to page iRef *
28890 2f 0a 20 20 75 38 20 2a 61 43 65 6c 6c 3b 0a 0a  /.  u8 *aCell;..
288a0 20 20 61 44 61 74 61 20 3d 20 66 73 50 61 67 65    aData = fsPage
288b0 44 61 74 61 28 70 50 67 2c 20 26 6e 44 61 74 61  Data(pPg, &nData
288c0 29 3b 0a 0a 20 20 61 43 65 6c 6c 20 3d 20 70 61  );..  aCell = pa
288d0 67 65 47 65 74 43 65 6c 6c 28 61 44 61 74 61 2c  geGetCell(aData,
288e0 20 6e 44 61 74 61 2c 20 69 43 65 6c 6c 29 3b 0a   nData, iCell);.
288f0 20 20 65 54 79 70 65 20 3d 20 2a 61 43 65 6c 6c    eType = *aCell
28900 2b 2b 3b 0a 20 20 61 43 65 6c 6c 20 2b 3d 20 6c  ++;.  aCell += l
28910 73 6d 56 61 72 69 6e 74 47 65 74 33 32 28 61 43  smVarintGet32(aC
28920 65 6c 6c 2c 20 26 69 50 67 50 74 72 29 3b 0a 0a  ell, &iPgPtr);..
28930 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29    if( eType==0 )
28940 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b  {.    int dummy;
28950 0a 20 20 20 20 50 67 6e 6f 20 69 52 65 66 3b 20  .    Pgno iRef; 
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28970 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
28980 6f 66 20 72 65 66 65 72 65 6e 63 65 64 20 70 61  of referenced pa
28990 67 65 20 2a 2f 0a 20 20 20 20 61 43 65 6c 6c 20  ge */.    aCell 
289a0 2b 3d 20 6c 73 6d 56 61 72 69 6e 74 47 65 74 36  += lsmVarintGet6
289b0 34 28 61 43 65 6c 6c 2c 20 26 69 52 65 66 29 3b  4(aCell, &iRef);
289c0 0a 20 20 20 20 69 66 28 20 62 49 6e 64 69 72 65  .    if( bIndire
289d0 63 74 20 29 7b 0a 20 20 20 20 20 20 6c 73 6d 46  ct ){.      lsmF
289e0 73 44 62 50 61 67 65 47 65 74 28 70 44 62 2d 3e  sDbPageGet(pDb->
289f0 70 46 53 2c 20 70 53 65 67 2c 20 69 52 65 66 2c  pFS, pSeg, iRef,
28a00 20 26 70 52 65 66 29 3b 0a 20 20 20 20 20 20 70   &pRef);.      p
28a10 61 67 65 47 65 74 4b 65 79 43 6f 70 79 28 70 44  ageGetKeyCopy(pD
28a20 62 2d 3e 70 45 6e 76 2c 20 70 53 65 67 2c 20 70  b->pEnv, pSeg, p
28a30 52 65 66 2c 20 30 2c 20 26 64 75 6d 6d 79 2c 20  Ref, 0, &dummy, 
28a40 70 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 61 4b  pBlob);.      aK
28a50 65 79 20 3d 20 28 75 38 20 2a 29 70 42 6c 6f 62  ey = (u8 *)pBlob
28a60 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 6e  ->pData;.      n
28a70 4b 65 79 20 3d 20 70 42 6c 6f 62 2d 3e 6e 44 61  Key = pBlob->nDa
28a80 74 61 3b 0a 20 20 20 20 20 20 6c 73 6d 46 73 50  ta;.      lsmFsP
28a90 61 67 65 52 65 6c 65 61 73 65 28 70 52 65 66 29  ageRelease(pRef)
28aa0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28ab0 20 20 20 61 4b 65 79 20 3d 20 28 75 38 20 2a 29     aKey = (u8 *)
28ac0 22 3c 69 6e 64 69 72 65 63 74 3e 22 3b 0a 20 20  "<indirect>";.  
28ad0 20 20 20 20 6e 4b 65 79 20 3d 20 31 31 3b 0a 20      nKey = 11;. 
28ae0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
28af0 20 20 61 43 65 6c 6c 20 2b 3d 20 6c 73 6d 56 61    aCell += lsmVa
28b00 72 69 6e 74 47 65 74 33 32 28 61 43 65 6c 6c 2c  rintGet32(aCell,
28b10 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28   &nKey);.    if(
28b20 20 72 74 49 73 57 72 69 74 65 28 65 54 79 70 65   rtIsWrite(eType
28b30 29 20 29 20 61 43 65 6c 6c 20 2b 3d 20 6c 73 6d  ) ) aCell += lsm
28b40 56 61 72 69 6e 74 47 65 74 33 32 28 61 43 65 6c  VarintGet32(aCel
28b50 6c 2c 20 26 6e 56 61 6c 29 3b 0a 20 20 20 20 73  l, &nVal);.    s
28b60 6f 72 74 65 64 52 65 61 64 44 61 74 61 28 70 53  ortedReadData(pS
28b70 65 67 2c 20 70 50 67 2c 20 28 61 43 65 6c 6c 2d  eg, pPg, (aCell-
28b80 61 44 61 74 61 29 2c 20 6e 4b 65 79 2b 6e 56 61  aData), nKey+nVa
28b90 6c 2c 20 28 76 6f 69 64 20 2a 2a 29 26 61 4b 65  l, (void **)&aKe
28ba0 79 2c 20 70 42 6c 6f 62 29 3b 0a 20 20 20 20 61  y, pBlob);.    a
28bb0 56 61 6c 20 3d 20 26 61 4b 65 79 5b 6e 4b 65 79  Val = &aKey[nKey
28bc0 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 65  ];.  }..  if( pe
28bd0 54 79 70 65 20 29 20 2a 70 65 54 79 70 65 20 3d  Type ) *peType =
28be0 20 65 54 79 70 65 3b 0a 20 20 69 66 28 20 70 69   eType;.  if( pi
28bf0 50 67 50 74 72 20 29 20 2a 70 69 50 67 50 74 72  PgPtr ) *piPgPtr
28c00 20 3d 20 69 50 67 50 74 72 3b 0a 20 20 69 66 28   = iPgPtr;.  if(
28c10 20 70 61 4b 65 79 20 29 20 2a 70 61 4b 65 79 20   paKey ) *paKey 
28c20 3d 20 61 4b 65 79 3b 0a 20 20 69 66 28 20 70 61  = aKey;.  if( pa
28c30 56 61 6c 20 29 20 2a 70 61 56 61 6c 20 3d 20 61  Val ) *paVal = a
28c40 56 61 6c 3b 0a 20 20 69 66 28 20 70 6e 4b 65 79  Val;.  if( pnKey
28c50 20 29 20 2a 70 6e 4b 65 79 20 3d 20 6e 4b 65 79   ) *pnKey = nKey
28c60 3b 0a 20 20 69 66 28 20 70 6e 56 61 6c 20 29 20  ;.  if( pnVal ) 
28c70 2a 70 6e 56 61 6c 20 3d 20 6e 56 61 6c 3b 0a 7d  *pnVal = nVal;.}
28c80 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 66  ..static int inf
28c90 6f 41 70 70 65 6e 64 42 6c 6f 62 28 4c 73 6d 53  oAppendBlob(LsmS
28ca0 74 72 69 6e 67 20 2a 70 53 74 72 2c 20 69 6e 74  tring *pStr, int
28cb0 20 62 48 65 78 2c 20 75 38 20 2a 7a 2c 20 69 6e   bHex, u8 *z, in
28cc0 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 43 68 61  t n){.  int iCha
28cd0 72 3b 0a 20 20 66 6f 72 28 69 43 68 61 72 3d 30  r;.  for(iChar=0
28ce0 3b 20 69 43 68 61 72 3c 6e 3b 20 69 43 68 61 72  ; iChar<n; iChar
28cf0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 62 48 65  ++){.    if( bHe
28d00 78 20 29 7b 0a 20 20 20 20 20 20 6c 73 6d 53 74  x ){.      lsmSt
28d10 72 69 6e 67 41 70 70 65 6e 64 66 28 70 53 74 72  ringAppendf(pStr
28d20 2c 20 22 25 30 32 58 22 2c 20 7a 5b 69 43 68 61  , "%02X", z[iCha
28d30 72 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  r]);.    }else{.
28d40 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41        lsmStringA
28d50 70 70 65 6e 64 66 28 70 53 74 72 2c 20 22 25 63  ppendf(pStr, "%c
28d60 22 2c 20 69 73 61 6c 6e 75 6d 28 7a 5b 69 43 68  ", isalnum(z[iCh
28d70 61 72 5d 29 20 3f 7a 5b 69 43 68 61 72 5d 20 3a  ar]) ?z[iChar] :
28d80 20 27 2e 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   '.');.    }.  }
28d90 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b  .  return LSM_OK
28da0 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 49 4e 46  ;.}..#define INF
28db0 4f 5f 50 41 47 45 5f 44 55 4d 50 5f 44 41 54 41  O_PAGE_DUMP_DATA
28dc0 20 20 20 20 20 30 78 30 31 0a 23 64 65 66 69 6e       0x01.#defin
28dd0 65 20 49 4e 46 4f 5f 50 41 47 45 5f 44 55 4d 50  e INFO_PAGE_DUMP
28de0 5f 56 41 4c 55 45 53 20 20 20 30 78 30 32 0a 23  _VALUES   0x02.#
28df0 64 65 66 69 6e 65 20 49 4e 46 4f 5f 50 41 47 45  define INFO_PAGE
28e00 5f 44 55 4d 50 5f 48 45 58 20 20 20 20 20 20 30  _DUMP_HEX      0
28e10 78 30 34 0a 23 64 65 66 69 6e 65 20 49 4e 46 4f  x04.#define INFO
28e20 5f 50 41 47 45 5f 44 55 4d 50 5f 49 4e 44 49 52  _PAGE_DUMP_INDIR
28e30 45 43 54 20 30 78 30 38 0a 0a 73 74 61 74 69 63  ECT 0x08..static
28e40 20 69 6e 74 20 69 6e 66 6f 50 61 67 65 44 75 6d   int infoPageDum
28e50 70 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62  p(.  lsm_db *pDb
28e60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28e70 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
28e80 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e   handle */.  Pgn
28e90 6f 20 69 50 67 2c 20 20 20 20 20 20 20 20 20 20  o iPg,          
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28eb0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  Page number of p
28ec0 61 67 65 20 74 6f 20 64 75 6d 70 20 2a 2f 0a 20  age to dump */. 
28ed0 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 63 68   int flags,.  ch
28ee0 61 72 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20  ar **pzOut      
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28f00 20 4f 55 54 3a 20 6c 73 6d 4d 61 6c 6c 6f 63 27   OUT: lsmMalloc'
28f10 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  d string */.){. 
28f20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b   int rc = LSM_OK
28f30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28f40 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
28f50 2a 2f 0a 20 20 50 61 67 65 20 2a 70 50 67 20 3d  */.  Page *pPg =
28f60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
28f70 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
28f80 6f 72 20 70 61 67 65 20 69 50 67 20 2a 2f 0a 20  or page iPg */. 
28f90 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
28fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fb0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
28fc0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  s */.  const int
28fd0 20 70 65 72 4c 69 6e 65 20 3d 20 31 36 3b 20 20   perLine = 16;  
28fe0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
28ff0 70 65 72 20 6c 69 6e 65 20 69 6e 20 74 68 65 20  per line in the 
29000 72 61 77 20 68 65 78 20 64 75 6d 70 20 2a 2f 0a  raw hex dump */.
29010 20 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20    Segment *pSeg 
29020 3d 20 30 3b 0a 20 20 53 6e 61 70 73 68 6f 74 20  = 0;.  Snapshot 
29030 2a 70 53 6e 61 70 3b 0a 0a 20 20 69 6e 74 20 62  *pSnap;..  int b
29040 56 61 6c 75 65 73 20 3d 20 28 66 6c 61 67 73 20  Values = (flags 
29050 26 20 49 4e 46 4f 5f 50 41 47 45 5f 44 55 4d 50  & INFO_PAGE_DUMP
29060 5f 56 41 4c 55 45 53 29 3b 0a 20 20 69 6e 74 20  _VALUES);.  int 
29070 62 48 65 78 20 3d 20 28 66 6c 61 67 73 20 26 20  bHex = (flags & 
29080 49 4e 46 4f 5f 50 41 47 45 5f 44 55 4d 50 5f 48  INFO_PAGE_DUMP_H
29090 45 58 29 3b 0a 20 20 69 6e 74 20 62 44 61 74 61  EX);.  int bData
290a0 20 3d 20 28 66 6c 61 67 73 20 26 20 49 4e 46 4f   = (flags & INFO
290b0 5f 50 41 47 45 5f 44 55 4d 50 5f 44 41 54 41 29  _PAGE_DUMP_DATA)
290c0 3b 0a 20 20 69 6e 74 20 62 49 6e 64 69 72 65 63  ;.  int bIndirec
290d0 74 20 3d 20 28 66 6c 61 67 73 20 26 20 49 4e 46  t = (flags & INF
290e0 4f 5f 50 41 47 45 5f 44 55 4d 50 5f 49 4e 44 49  O_PAGE_DUMP_INDI
290f0 52 45 43 54 29 3b 0a 0a 20 20 2a 70 7a 4f 75 74  RECT);..  *pzOut
29100 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 50 67 3d   = 0;.  if( iPg=
29110 3d 30 20 29 20 72 65 74 75 72 6e 20 4c 53 4d 5f  =0 ) return LSM_
29120 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74  ERROR;..  assert
29130 28 20 70 44 62 2d 3e 70 43 6c 69 65 6e 74 20 7c  ( pDb->pClient |
29140 7c 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 20 29  | pDb->pWorker )
29150 3b 0a 20 20 70 53 6e 61 70 20 3d 20 70 44 62 2d  ;.  pSnap = pDb-
29160 3e 70 43 6c 69 65 6e 74 3b 0a 20 20 69 66 28 20  >pClient;.  if( 
29170 70 53 6e 61 70 3d 3d 30 20 29 20 70 53 6e 61 70  pSnap==0 ) pSnap
29180 20 3d 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 3b   = pDb->pWorker;
29190 0a 20 20 69 66 28 20 70 53 6e 61 70 2d 3e 72 65  .  if( pSnap->re
291a0 64 69 72 65 63 74 2e 6e 3e 30 20 29 7b 0a 20 20  direct.n>0 ){.  
291b0 20 20 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20    Level *pLvl;. 
291c0 20 20 20 69 6e 74 20 62 55 73 65 20 3d 20 30 3b     int bUse = 0;
291d0 0a 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d 70 53  .    for(pLvl=pS
291e0 6e 61 70 2d 3e 70 4c 65 76 65 6c 3b 20 70 4c 76  nap->pLevel; pLv
291f0 6c 2d 3e 70 4e 65 78 74 3b 20 70 4c 76 6c 3d 70  l->pNext; pLvl=p
29200 4c 76 6c 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20  Lvl->pNext);.   
29210 20 70 53 65 67 20 3d 20 28 70 4c 76 6c 2d 3e 6e   pSeg = (pLvl->n
29220 52 69 67 68 74 3d 3d 30 20 3f 20 26 70 4c 76 6c  Right==0 ? &pLvl
29230 2d 3e 6c 68 73 20 3a 20 26 70 4c 76 6c 2d 3e 61  ->lhs : &pLvl->a
29240 52 68 73 5b 70 4c 76 6c 2d 3e 6e 52 69 67 68 74  Rhs[pLvl->nRight
29250 2d 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 6c  -1]);.    rc = l
29260 73 6d 46 73 53 65 67 6d 65 6e 74 43 6f 6e 74 61  smFsSegmentConta
29270 69 6e 73 50 67 28 70 44 62 2d 3e 70 46 53 2c 20  insPg(pDb->pFS, 
29280 70 53 65 67 2c 20 69 50 67 2c 20 26 62 55 73 65  pSeg, iPg, &bUse
29290 29 3b 0a 20 20 20 20 69 66 28 20 62 55 73 65 3d  );.    if( bUse=
292a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67  =0 ){.      pSeg
292b0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
292c0 0a 20 20 2f 2a 20 69 50 67 20 69 73 20 61 20 72  .  /* iPg is a r
292d0 65 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eal page number 
292e0 28 6e 6f 74 20 73 75 62 6a 65 63 74 20 74 6f 20  (not subject to 
292f0 72 65 64 69 72 65 63 74 69 6f 6e 29 2e 20 53 6f  redirection). So
29300 20 69 74 20 69 73 20 73 61 66 65 20 0a 20 20 2a   it is safe .  *
29310 2a 20 74 6f 20 70 61 73 73 20 61 20 4e 55 4c 4c  * to pass a NULL
29320 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65   in place of the
29330 20 73 65 67 6d 65 6e 74 20 70 6f 69 6e 74 65 72   segment pointer
29340 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
29350 72 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20  rgument.  ** to 
29360 6c 73 6d 46 73 44 62 50 61 67 65 47 65 74 28 29  lsmFsDbPageGet()
29370 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28   here.  */.  if(
29380 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
29390 20 20 20 72 63 20 3d 20 6c 73 6d 46 73 44 62 50     rc = lsmFsDbP
293a0 61 67 65 47 65 74 28 70 44 62 2d 3e 70 46 53 2c  ageGet(pDb->pFS,
293b0 20 30 2c 20 69 50 67 2c 20 26 70 50 67 29 3b 0a   0, iPg, &pPg);.
293c0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 4c    }..  if( rc==L
293d0 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 6c 6f  SM_OK ){.    Blo
293e0 62 20 62 6c 6f 62 20 3d 20 7b 30 2c 20 30 2c 20  b blob = {0, 0, 
293f0 30 2c 20 30 7d 3b 0a 20 20 20 20 69 6e 74 20 6e  0, 0};.    int n
29400 4b 65 79 57 69 64 74 68 20 3d 20 30 3b 0a 20 20  KeyWidth = 0;.  
29410 20 20 4c 73 6d 53 74 72 69 6e 67 20 73 74 72 3b    LsmString str;
29420 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 3b 0a 20  .    int nRec;. 
29430 20 20 20 69 6e 74 20 69 50 74 72 3b 0a 20 20 20     int iPtr;.   
29440 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20   int flags;.    
29450 69 6e 74 20 69 43 65 6c 6c 3b 0a 20 20 20 20 75  int iCell;.    u
29460 38 20 2a 61 44 61 74 61 3b 20 69 6e 74 20 6e 44  8 *aData; int nD
29470 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
29480 50 61 67 65 20 64 61 74 61 20 61 6e 64 20 73 69  Page data and si
29490 7a 65 20 74 68 65 72 65 6f 66 20 2a 2f 0a 0a 20  ze thereof */.. 
294a0 20 20 20 61 44 61 74 61 20 3d 20 66 73 50 61 67     aData = fsPag
294b0 65 44 61 74 61 28 70 50 67 2c 20 26 6e 44 61 74  eData(pPg, &nDat
294c0 61 29 3b 0a 20 20 20 20 6e 52 65 63 20 3d 20 70  a);.    nRec = p
294d0 61 67 65 47 65 74 4e 52 65 63 28 61 44 61 74 61  ageGetNRec(aData
294e0 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 50  , nData);.    iP
294f0 74 72 20 3d 20 70 61 67 65 47 65 74 50 74 72 28  tr = pageGetPtr(
29500 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  aData, nData);. 
29510 20 20 20 66 6c 61 67 73 20 3d 20 70 61 67 65 47     flags = pageG
29520 65 74 46 6c 61 67 73 28 61 44 61 74 61 2c 20 6e  etFlags(aData, n
29530 44 61 74 61 29 3b 0a 0a 20 20 20 20 6c 73 6d 53  Data);..    lsmS
29540 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 2c 20  tringInit(&str, 
29550 70 44 62 2d 3e 70 45 6e 76 29 3b 0a 20 20 20 20  pDb->pEnv);.    
29560 6c 73 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66  lsmStringAppendf
29570 28 26 73 74 72 2c 20 22 50 61 67 65 20 3a 20 25  (&str, "Page : %
29580 6c 6c 64 20 20 28 25 64 20 62 79 74 65 73 29 5c  lld  (%d bytes)\
29590 6e 22 2c 20 69 50 67 2c 20 6e 44 61 74 61 29 3b  n", iPg, nData);
295a0 0a 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70  .    lsmStringAp
295b0 70 65 6e 64 66 28 26 73 74 72 2c 20 22 6e 52 65  pendf(&str, "nRe
295c0 63 20 3a 20 25 64 5c 6e 22 2c 20 6e 52 65 63 29  c : %d\n", nRec)
295d0 3b 0a 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41  ;.    lsmStringA
295e0 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22 69 50  ppendf(&str, "iP
295f0 74 72 20 3a 20 25 64 5c 6e 22 2c 20 69 50 74 72  tr : %d\n", iPtr
29600 29 3b 0a 20 20 20 20 6c 73 6d 53 74 72 69 6e 67  );.    lsmString
29610 41 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22 66  Appendf(&str, "f
29620 6c 61 67 73 3a 20 25 30 34 78 5c 6e 22 2c 20 66  lags: %04x\n", f
29630 6c 61 67 73 29 3b 0a 20 20 20 20 6c 73 6d 53 74  lags);.    lsmSt
29640 72 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72  ringAppendf(&str
29650 2c 20 22 5c 6e 22 29 3b 0a 0a 20 20 20 20 66 6f  , "\n");..    fo
29660 72 28 69 43 65 6c 6c 3d 30 3b 20 69 43 65 6c 6c  r(iCell=0; iCell
29670 3c 6e 52 65 63 3b 20 69 43 65 6c 6c 2b 2b 29 7b  <nRec; iCell++){
29680 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b  .      int nKey;
29690 0a 20 20 20 20 20 20 69 6e 66 6f 43 65 6c 6c 44  .      infoCellD
296a0 75 6d 70 28 0a 20 20 20 20 20 20 20 20 20 20 70  ump(.          p
296b0 44 62 2c 20 70 53 65 67 2c 20 62 49 6e 64 69 72  Db, pSeg, bIndir
296c0 65 63 74 2c 20 70 50 67 2c 20 69 43 65 6c 6c 2c  ect, pPg, iCell,
296d0 20 30 2c 20 30 2c 20 30 2c 20 26 6e 4b 65 79 2c   0, 0, 0, &nKey,
296e0 20 30 2c 20 30 2c 20 26 62 6c 6f 62 0a 20 20 20   0, 0, &blob.   
296f0 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
29700 6e 4b 65 79 3e 6e 4b 65 79 57 69 64 74 68 20 29  nKey>nKeyWidth )
29710 20 6e 4b 65 79 57 69 64 74 68 20 3d 20 6e 4b 65   nKeyWidth = nKe
29720 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  y;.    }.    if(
29730 20 62 48 65 78 20 29 20 6e 4b 65 79 57 69 64 74   bHex ) nKeyWidt
29740 68 20 3d 20 6e 4b 65 79 57 69 64 74 68 20 2a 20  h = nKeyWidth * 
29750 32 3b 0a 0a 20 20 20 20 66 6f 72 28 69 43 65 6c  2;..    for(iCel
29760 6c 3d 30 3b 20 69 43 65 6c 6c 3c 6e 52 65 63 3b  l=0; iCell<nRec;
29770 20 69 43 65 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20   iCell++){.     
29780 20 75 38 20 2a 61 4b 65 79 3b 20 69 6e 74 20 6e   u8 *aKey; int n
29790 4b 65 79 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  Key = 0;       /
297a0 2a 20 4b 65 79 20 2a 2f 0a 20 20 20 20 20 20 75  * Key */.      u
297b0 38 20 2a 61 56 61 6c 3b 20 69 6e 74 20 6e 56 61  8 *aVal; int nVa
297c0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  l = 0;       /* 
297d0 56 61 6c 75 65 20 2a 2f 0a 20 20 20 20 20 20 69  Value */.      i
297e0 6e 74 20 69 50 67 50 74 72 3b 0a 20 20 20 20 20  nt iPgPtr;.     
297f0 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20   int eType;.    
29800 20 20 50 67 6e 6f 20 69 41 62 73 50 74 72 3b 0a    Pgno iAbsPtr;.
29810 20 20 20 20 20 20 63 68 61 72 20 7a 46 6c 61 67        char zFlag
29820 73 5b 38 5d 3b 0a 0a 20 20 20 20 20 20 69 6e 66  s[8];..      inf
29830 6f 43 65 6c 6c 44 75 6d 70 28 70 44 62 2c 20 70  oCellDump(pDb, p
29840 53 65 67 2c 20 62 49 6e 64 69 72 65 63 74 2c 20  Seg, bIndirect, 
29850 70 50 67 2c 20 69 43 65 6c 6c 2c 20 26 65 54 79  pPg, iCell, &eTy
29860 70 65 2c 20 26 69 50 67 50 74 72 2c 0a 20 20 20  pe, &iPgPtr,.   
29870 20 20 20 20 20 20 20 26 61 4b 65 79 2c 20 26 6e         &aKey, &n
29880 4b 65 79 2c 20 26 61 56 61 6c 2c 20 26 6e 56 61  Key, &aVal, &nVa
29890 6c 2c 20 26 62 6c 6f 62 0a 20 20 20 20 20 20 29  l, &blob.      )
298a0 3b 0a 20 20 20 20 20 20 69 41 62 73 50 74 72 20  ;.      iAbsPtr 
298b0 3d 20 69 50 67 50 74 72 20 2b 20 28 28 66 6c 61  = iPgPtr + ((fla
298c0 67 73 20 26 20 53 45 47 4d 45 4e 54 5f 42 54 52  gs & SEGMENT_BTR
298d0 45 45 5f 46 4c 41 47 29 20 3f 20 30 20 3a 20 69  EE_FLAG) ? 0 : i
298e0 50 74 72 29 3b 0a 0a 20 20 20 20 20 20 6c 73 6d  Ptr);..      lsm
298f0 46 6c 61 67 73 54 6f 53 74 72 69 6e 67 28 65 54  FlagsToString(eT
29900 79 70 65 2c 20 7a 46 6c 61 67 73 29 3b 0a 20 20  ype, zFlags);.  
29910 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70      lsmStringApp
29920 65 6e 64 66 28 26 73 74 72 2c 20 22 25 73 20 25  endf(&str, "%s %
29930 64 20 28 25 73 29 20 22 2c 20 0a 20 20 20 20 20  d (%s) ", .     
29940 20 20 20 20 20 7a 46 6c 61 67 73 2c 20 69 41 62       zFlags, iAb
29950 73 50 74 72 2c 20 28 72 74 54 6f 70 69 63 28 65  sPtr, (rtTopic(e
29960 54 79 70 65 29 20 3f 20 22 73 79 73 22 20 3a 20  Type) ? "sys" : 
29970 22 75 73 72 22 29 0a 20 20 20 20 20 20 29 3b 0a  "usr").      );.
29980 20 20 20 20 20 20 69 6e 66 6f 41 70 70 65 6e 64        infoAppend
29990 42 6c 6f 62 28 26 73 74 72 2c 20 62 48 65 78 2c  Blob(&str, bHex,
299a0 20 61 4b 65 79 2c 20 6e 4b 65 79 29 3b 20 0a 20   aKey, nKey); . 
299b0 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3e 30 20       if( nVal>0 
299c0 26 26 20 62 56 61 6c 75 65 73 20 29 7b 0a 20 20  && bValues ){.  
299d0 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41        lsmStringA
299e0 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22 25 2a  ppendf(&str, "%*
299f0 73 22 2c 20 6e 4b 65 79 57 69 64 74 68 20 2d 20  s", nKeyWidth - 
29a00 28 6e 4b 65 79 2a 28 31 2b 62 48 65 78 29 29 2c  (nKey*(1+bHex)),
29a10 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 6c 73   "");.        ls
29a20 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66 28 26  mStringAppendf(&
29a30 73 74 72 2c 20 22 20 22 29 3b 0a 20 20 20 20 20  str, " ");.     
29a40 20 20 20 69 6e 66 6f 41 70 70 65 6e 64 42 6c 6f     infoAppendBlo
29a50 62 28 26 73 74 72 2c 20 62 48 65 78 2c 20 61 56  b(&str, bHex, aV
29a60 61 6c 2c 20 6e 56 61 6c 29 3b 20 0a 20 20 20 20  al, nVal); .    
29a70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 74    }.      if( rt
29a80 54 6f 70 69 63 28 65 54 79 70 65 29 20 29 7b 0a  Topic(eType) ){.
29a90 20 20 20 20 20 20 20 20 69 6e 74 20 69 42 6c 6b          int iBlk
29aa0 20 3d 20 28 69 6e 74 29 7e 6c 73 6d 47 65 74 55   = (int)~lsmGetU
29ab0 33 32 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  32(aKey);.      
29ac0 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70 65 6e    lsmStringAppen
29ad0 64 66 28 26 73 74 72 2c 20 22 20 20 28 62 6c 6f  df(&str, "  (blo
29ae0 63 6b 3d 25 64 22 2c 20 69 42 6c 6b 29 3b 0a 20  ck=%d", iBlk);. 
29af0 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3e         if( nVal>
29b00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
29b10 36 34 20 69 53 6e 61 70 20 3d 20 6c 73 6d 47 65  64 iSnap = lsmGe
29b20 74 55 36 34 28 61 56 61 6c 29 3b 0a 20 20 20 20  tU64(aVal);.    
29b30 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41        lsmStringA
29b40 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22 20 73  ppendf(&str, " s
29b50 6e 61 70 73 68 6f 74 3d 25 6c 6c 64 22 2c 20 69  napshot=%lld", i
29b60 53 6e 61 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  Snap);.        }
29b70 0a 20 20 20 20 20 20 20 20 6c 73 6d 53 74 72 69  .        lsmStri
29b80 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c 20  ngAppendf(&str, 
29b90 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ")");.      }.  
29ba0 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70      lsmStringApp
29bb0 65 6e 64 66 28 26 73 74 72 2c 20 22 5c 6e 22 29  endf(&str, "\n")
29bc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
29bd0 20 62 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   bData ){.      
29be0 6c 73 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66  lsmStringAppendf
29bf0 28 26 73 74 72 2c 20 22 5c 6e 2d 2d 2d 2d 2d 2d  (&str, "\n------
29c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 20 0a  -------------" .
29c10 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d            "-----
29c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29c50 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20  --------\n");.  
29c60 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70      lsmStringApp
29c70 65 6e 64 66 28 26 73 74 72 2c 20 22 50 61 67 65  endf(&str, "Page
29c80 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
29c90 20 20 69 50 67 2c 20 28 69 50 67 2d 31 29 2a 6e    iPg, (iPg-1)*n
29ca0 44 61 74 61 2c 20 69 50 67 2a 6e 44 61 74 61 20  Data, iPg*nData 
29cb0 2d 20 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - 1);.      for(
29cc0 69 3d 30 3b 20 69 3c 6e 44 61 74 61 3b 20 69 20  i=0; i<nData; i 
29cd0 2b 3d 20 70 65 72 4c 69 6e 65 29 7b 0a 20 20 20  += perLine){.   
29ce0 20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70       lsmStringAp
29cf0 70 65 6e 64 66 28 26 73 74 72 2c 20 22 25 30 34  pendf(&str, "%04
29d00 78 3a 20 22 2c 20 69 29 3b 0a 20 20 20 20 20 20  x: ", i);.      
29d10 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 65 72    for(j=0; j<per
29d20 4c 69 6e 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Line; j++){.    
29d30 20 20 20 20 20 20 69 66 28 20 69 2b 6a 3e 6e 44        if( i+j>nD
29d40 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
29d50 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70 65     lsmStringAppe
29d60 6e 64 66 28 26 73 74 72 2c 20 22 20 20 20 22 29  ndf(&str, "   ")
29d70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
29d80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  e{.            l
29d90 73 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66 28  smStringAppendf(
29da0 26 73 74 72 2c 20 22 25 30 32 78 20 22 2c 20 61  &str, "%02x ", a
29db0 44 61 74 61 5b 69 2b 6a 5d 29 3b 0a 20 20 20 20  Data[i+j]);.    
29dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29dd0 7d 0a 20 20 20 20 20 20 20 20 6c 73 6d 53 74 72  }.        lsmStr
29de0 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c  ingAppendf(&str,
29df0 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20   "  ");.        
29e00 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 65 72 4c 69  for(j=0; j<perLi
29e10 6e 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ne; j++){.      
29e20 20 20 20 20 69 66 28 20 69 2b 6a 3e 6e 44 61 74      if( i+j>nDat
29e30 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  a ){.           
29e40 20 6c 73 6d 53 74 72 69 6e 67 41 70 70 65 6e 64   lsmStringAppend
29e50 66 28 26 73 74 72 2c 20 22 20 22 29 3b 0a 20 20  f(&str, " ");.  
29e60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29e70 20 20 20 20 20 20 20 20 20 20 20 6c 73 6d 53 74             lsmSt
29e80 72 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72  ringAppendf(&str
29e90 2c 22 25 63 22 2c 20 69 73 70 72 69 6e 74 28 61  ,"%c", isprint(a
29ea0 44 61 74 61 5b 69 2b 6a 5d 29 20 3f 20 61 44 61  Data[i+j]) ? aDa
29eb0 74 61 5b 69 2b 6a 5d 20 3a 20 27 2e 27 29 3b 0a  ta[i+j] : '.');.
29ec0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 73      }.        ls
29ee0 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66 28 26  mStringAppendf(&
29ef0 73 74 72 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20  str,"\n");.     
29f00 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70   }.    }..    *p
29f10 7a 4f 75 74 20 3d 20 73 74 72 2e 7a 3b 0a 20 20  zOut = str.z;.  
29f20 20 20 73 6f 72 74 65 64 42 6c 6f 62 46 72 65 65    sortedBlobFree
29f30 28 26 62 6c 6f 62 29 3b 0a 20 20 20 20 6c 73 6d  (&blob);.    lsm
29f40 46 73 50 61 67 65 52 65 6c 65 61 73 65 28 70 50  FsPageRelease(pP
29f50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
29f60 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d  n rc;.}..int lsm
29f70 49 6e 66 6f 50 61 67 65 44 75 6d 70 28 0a 20 20  InfoPageDump(.  
29f80 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 20 20 20  lsm_db *pDb,    
29f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fa0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
29fb0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 67  le */.  Pgno iPg
29fc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29fd0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
29fe0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 74  number of page t
29ff0 6f 20 64 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20  o dump */.  int 
2a000 62 48 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  bHex,           
2a010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a020 72 75 65 20 74 6f 20 6f 75 74 70 75 74 20 6b 65  rue to output ke
2a030 79 2f 76 61 6c 75 65 20 69 6e 20 68 65 78 20 66  y/value in hex f
2a040 6f 72 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  orm */.  char **
2a050 70 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  pzOut           
2a060 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2a070 20 6c 73 6d 4d 61 6c 6c 6f 63 27 64 20 73 74 72   lsmMalloc'd str
2a080 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ing */.){.  int 
2a090 66 6c 61 67 73 20 3d 20 49 4e 46 4f 5f 50 41 47  flags = INFO_PAG
2a0a0 45 5f 44 55 4d 50 5f 44 41 54 41 20 7c 20 49 4e  E_DUMP_DATA | IN
2a0b0 46 4f 5f 50 41 47 45 5f 44 55 4d 50 5f 56 41 4c  FO_PAGE_DUMP_VAL
2a0c0 55 45 53 3b 0a 20 20 69 66 28 20 62 48 65 78 20  UES;.  if( bHex 
2a0d0 29 20 66 6c 61 67 73 20 7c 3d 20 49 4e 46 4f 5f  ) flags |= INFO_
2a0e0 50 41 47 45 5f 44 55 4d 50 5f 48 45 58 3b 0a 20  PAGE_DUMP_HEX;. 
2a0f0 20 72 65 74 75 72 6e 20 69 6e 66 6f 50 61 67 65   return infoPage
2a100 44 75 6d 70 28 70 44 62 2c 20 69 50 67 2c 20 66  Dump(pDb, iPg, f
2a110 6c 61 67 73 2c 20 70 7a 4f 75 74 29 3b 0a 7d 0a  lags, pzOut);.}.
2a120 0a 76 6f 69 64 20 73 6f 72 74 65 64 44 75 6d 70  .void sortedDump
2a130 53 65 67 6d 65 6e 74 28 6c 73 6d 5f 64 62 20 2a  Segment(lsm_db *
2a140 70 44 62 2c 20 53 65 67 6d 65 6e 74 20 2a 70 52  pDb, Segment *pR
2a150 75 6e 2c 20 69 6e 74 20 62 56 61 6c 73 29 7b 0a  un, int bVals){.
2a160 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 78    assert( pDb->x
2a170 4c 6f 67 20 29 3b 0a 20 20 69 66 28 20 70 52 75  Log );.  if( pRu
2a180 6e 20 26 26 20 70 52 75 6e 2d 3e 69 46 69 72 73  n && pRun->iFirs
2a190 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61  t ){.    int fla
2a1a0 67 73 20 3d 20 28 62 56 61 6c 73 20 3f 20 49 4e  gs = (bVals ? IN
2a1b0 46 4f 5f 50 41 47 45 5f 44 55 4d 50 5f 56 41 4c  FO_PAGE_DUMP_VAL
2a1c0 55 45 53 20 3a 20 30 29 3b 0a 20 20 20 20 63 68  UES : 0);.    ch
2a1d0 61 72 20 2a 7a 53 65 67 3b 0a 20 20 20 20 50 61  ar *zSeg;.    Pa
2a1e0 67 65 20 2a 70 50 67 3b 0a 0a 20 20 20 20 7a 53  ge *pPg;..    zS
2a1f0 65 67 20 3d 20 73 65 67 54 6f 53 74 72 69 6e 67  eg = segToString
2a200 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70 52 75 6e  (pDb->pEnv, pRun
2a210 2c 20 30 29 3b 0a 20 20 20 20 6c 73 6d 4c 6f 67  , 0);.    lsmLog
2a220 4d 65 73 73 61 67 65 28 70 44 62 2c 20 4c 53 4d  Message(pDb, LSM
2a230 5f 4f 4b 2c 20 22 53 65 67 6d 65 6e 74 3a 20 25  _OK, "Segment: %
2a240 73 22 2c 20 7a 53 65 67 29 3b 0a 20 20 20 20 6c  s", zSeg);.    l
2a250 73 6d 46 72 65 65 28 70 44 62 2d 3e 70 45 6e 76  smFree(pDb->pEnv
2a260 2c 20 7a 53 65 67 29 3b 0a 0a 20 20 20 20 6c 73  , zSeg);..    ls
2a270 6d 46 73 44 62 50 61 67 65 47 65 74 28 70 44 62  mFsDbPageGet(pDb
2a280 2d 3e 70 46 53 2c 20 70 52 75 6e 2c 20 70 52 75  ->pFS, pRun, pRu
2a290 6e 2d 3e 69 46 69 72 73 74 2c 20 26 70 50 67 29  n->iFirst, &pPg)
2a2a0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
2a2b0 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 20 2a   ){.      Page *
2a2c0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 63 68 61  pNext;.      cha
2a2d0 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  r *z = 0;.      
2a2e0 69 6e 66 6f 50 61 67 65 44 75 6d 70 28 70 44 62  infoPageDump(pDb
2a2f0 2c 20 6c 73 6d 46 73 50 61 67 65 4e 75 6d 62 65  , lsmFsPageNumbe
2a300 72 28 70 50 67 29 2c 20 66 6c 61 67 73 2c 20 26  r(pPg), flags, &
2a310 7a 29 3b 0a 20 20 20 20 20 20 6c 73 6d 4c 6f 67  z);.      lsmLog
2a320 4d 65 73 73 61 67 65 28 70 44 62 2c 20 4c 53 4d  Message(pDb, LSM
2a330 5f 4f 4b 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20  _OK, "%s", z);. 
2a340 20 20 20 20 20 6c 73 6d 46 72 65 65 28 70 44 62       lsmFree(pDb
2a350 2d 3e 70 45 6e 76 2c 20 7a 29 3b 0a 23 69 66 20  ->pEnv, z);.#if 
2a360 30 0a 20 20 20 20 20 20 73 6f 72 74 65 64 44 75  0.      sortedDu
2a370 6d 70 50 61 67 65 28 70 44 62 2c 20 70 52 75 6e  mpPage(pDb, pRun
2a380 2c 20 70 50 67 2c 20 62 56 61 6c 73 29 3b 0a 23  , pPg, bVals);.#
2a390 65 6e 64 69 66 0a 20 20 20 20 20 20 6c 73 6d 46  endif.      lsmF
2a3a0 73 44 62 50 61 67 65 4e 65 78 74 28 70 52 75 6e  sDbPageNext(pRun
2a3b0 2c 20 70 50 67 2c 20 31 2c 20 26 70 4e 65 78 74  , pPg, 1, &pNext
2a3c0 29 3b 0a 20 20 20 20 20 20 6c 73 6d 46 73 50 61  );.      lsmFsPa
2a3d0 67 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  geRelease(pPg);.
2a3e0 20 20 20 20 20 20 70 50 67 20 3d 20 70 4e 65 78        pPg = pNex
2a3f0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
2a400 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
2a410 20 6c 6f 67 20 63 61 6c 6c 62 61 63 6b 20 7a 65   log callback ze
2a420 72 6f 20 6f 72 20 6d 6f 72 65 20 74 69 6d 65 73  ro or more times
2a430 20 77 69 74 68 20 6d 65 73 73 61 67 65 73 20 74   with messages t
2a440 68 61 74 20 64 65 73 63 72 69 62 65 0a 2a 2a 20  hat describe.** 
2a450 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
2a460 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  base structure..
2a470 2a 2f 0a 76 6f 69 64 20 6c 73 6d 53 6f 72 74 65  */.void lsmSorte
2a480 64 44 75 6d 70 53 74 72 75 63 74 75 72 65 28 0a  dDumpStructure(.
2a490 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 20    lsm_db *pDb,  
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4b0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
2a4c0 6e 64 6c 65 20 28 75 73 65 64 20 66 6f 72 20 78  ndle (used for x
2a4d0 4c 6f 67 20 63 61 6c 6c 62 61 63 6b 29 20 2a 2f  Log callback) */
2a4e0 0a 20 20 53 6e 61 70 73 68 6f 74 20 2a 70 53 6e  .  Snapshot *pSn
2a4f0 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
2a500 20 20 20 2f 2a 20 53 6e 61 70 73 68 6f 74 20 74     /* Snapshot t
2a510 6f 20 64 75 6d 70 20 2a 2f 0a 20 20 69 6e 74 20  o dump */.  int 
2a520 62 4b 65 79 73 2c 20 20 20 20 20 20 20 20 20 20  bKeys,          
2a530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2a540 75 74 70 75 74 20 74 68 65 20 6b 65 79 73 20 66  utput the keys f
2a550 72 6f 6d 20 65 61 63 68 20 73 65 67 6d 65 6e 74  rom each segment
2a560 20 2a 2f 0a 20 20 69 6e 74 20 62 56 61 6c 73 2c   */.  int bVals,
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a580 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2a590 74 68 65 20 76 61 6c 75 65 73 20 66 72 6f 6d 20  the values from 
2a5a0 65 61 63 68 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  each segment */.
2a5b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
2a5c0 68 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  hy              
2a5d0 20 20 2f 2a 20 43 61 70 74 69 6f 6e 20 74 6f 20    /* Caption to 
2a5e0 70 72 69 6e 74 20 6e 65 61 72 20 74 6f 70 20 6f  print near top o
2a5f0 66 20 64 75 6d 70 20 2a 2f 0a 29 7b 0a 20 20 53  f dump */.){.  S
2a600 6e 61 70 73 68 6f 74 20 2a 70 44 75 6d 70 20 3d  napshot *pDump =
2a610 20 70 53 6e 61 70 3b 0a 20 20 4c 65 76 65 6c 20   pSnap;.  Level 
2a620 2a 70 54 6f 70 4c 65 76 65 6c 3b 0a 20 20 63 68  *pTopLevel;.  ch
2a630 61 72 20 2a 7a 46 72 65 65 20 3d 20 30 3b 0a 0a  ar *zFree = 0;..
2a640 20 20 61 73 73 65 72 74 28 20 70 53 6e 61 70 20    assert( pSnap 
2a650 29 3b 0a 20 20 70 54 6f 70 4c 65 76 65 6c 20 3d  );.  pTopLevel =
2a660 20 6c 73 6d 44 62 53 6e 61 70 73 68 6f 74 4c 65   lsmDbSnapshotLe
2a670 76 65 6c 28 70 44 75 6d 70 29 3b 0a 20 20 69 66  vel(pDump);.  if
2a680 28 20 70 44 62 2d 3e 78 4c 6f 67 20 26 26 20 70  ( pDb->xLog && p
2a690 54 6f 70 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  TopLevel ){.    
2a6a0 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c  static int nCall
2a6b0 20 3d 20 30 3b 0a 20 20 20 20 4c 65 76 65 6c 20   = 0;.    Level 
2a6c0 2a 70 4c 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74  *pLevel;.    int
2a6d0 20 69 4c 65 76 65 6c 20 3d 20 30 3b 0a 0a 20 20   iLevel = 0;..  
2a6e0 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 20 20 20 20 6c    nCall++;.    l
2a6f0 73 6d 4c 6f 67 4d 65 73 73 61 67 65 28 70 44 62  smLogMessage(pDb
2a700 2c 20 4c 53 4d 5f 4f 4b 2c 20 22 44 61 74 61 62  , LSM_OK, "Datab
2a710 61 73 65 20 73 74 72 75 63 74 75 72 65 20 25 64  ase structure %d
2a720 20 28 25 73 29 22 2c 20 6e 43 61 6c 6c 2c 20 7a   (%s)", nCall, z
2a730 57 68 79 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20  Why);..#if 0.   
2a740 20 69 66 28 20 6e 43 61 6c 6c 3d 3d 31 30 33 31   if( nCall==1031
2a750 20 7c 7c 20 6e 43 61 6c 6c 3d 3d 31 30 33 32 20   || nCall==1032 
2a760 29 20 62 4b 65 79 73 3d 31 3b 0a 23 65 6e 64 69  ) bKeys=1;.#endi
2a770 66 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 76 65  f..    for(pLeve
2a780 6c 3d 70 54 6f 70 4c 65 76 65 6c 3b 20 70 4c 65  l=pTopLevel; pLe
2a790 76 65 6c 3b 20 70 4c 65 76 65 6c 3d 70 4c 65 76  vel; pLevel=pLev
2a7a0 65 6c 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  el->pNext){.    
2a7b0 20 20 63 68 61 72 20 7a 4c 65 66 74 5b 31 30 32    char zLeft[102
2a7c0 34 5d 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a  4];.      char z
2a7d0 52 69 67 68 74 5b 31 30 32 34 5d 3b 0a 20 20 20  Right[1024];.   
2a7e0 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 0a 20     int i = 0;.. 
2a7f0 20 20 20 20 20 53 65 67 6d 65 6e 74 20 2a 61 4c       Segment *aL
2a800 65 66 74 5b 32 34 5d 3b 20 20 0a 20 20 20 20 20  eft[24];  .     
2a810 20 53 65 67 6d 65 6e 74 20 2a 61 52 69 67 68 74   Segment *aRight
2a820 5b 32 34 5d 3b 0a 0a 20 20 20 20 20 20 69 6e 74  [24];..      int
2a830 20 6e 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20   nLeft = 0;.    
2a840 20 20 69 6e 74 20 6e 52 69 67 68 74 20 3d 20 30    int nRight = 0
2a850 3b 0a 0a 20 20 20 20 20 20 53 65 67 6d 65 6e 74  ;..      Segment
2a860 20 2a 70 53 65 67 20 3d 20 26 70 4c 65 76 65 6c   *pSeg = &pLevel
2a870 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 61 4c 65  ->lhs;.      aLe
2a880 66 74 5b 6e 4c 65 66 74 2b 2b 5d 20 3d 20 70 53  ft[nLeft++] = pS
2a890 65 67 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69  eg;..      for(i
2a8a0 3d 30 3b 20 69 3c 70 4c 65 76 65 6c 2d 3e 6e 52  =0; i<pLevel->nR
2a8b0 69 67 68 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ight; i++){.    
2a8c0 20 20 20 20 61 52 69 67 68 74 5b 6e 52 69 67 68      aRight[nRigh
2a8d0 74 2b 2b 5d 20 3d 20 26 70 4c 65 76 65 6c 2d 3e  t++] = &pLevel->
2a8e0 61 52 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 7d  aRhs[i];.      }
2a8f0 0a 0a 23 69 66 64 65 66 20 4c 53 4d 5f 4c 4f 47  ..#ifdef LSM_LOG
2a900 5f 46 52 45 45 4c 49 53 54 0a 20 20 20 20 20 20  _FREELIST.      
2a910 69 66 28 20 6e 52 69 67 68 74 20 29 7b 0a 20 20  if( nRight ){.  
2a920 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61        memmove(&a
2a930 52 69 67 68 74 5b 31 5d 2c 20 61 52 69 67 68 74  Right[1], aRight
2a940 2c 20 73 69 7a 65 6f 66 28 61 52 69 67 68 74 5b  , sizeof(aRight[
2a950 30 5d 29 2a 6e 52 69 67 68 74 29 3b 0a 20 20 20  0])*nRight);.   
2a960 20 20 20 20 20 61 52 69 67 68 74 5b 30 5d 20 3d       aRight[0] =
2a970 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 52 69 67   0;.        nRig
2a980 68 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  ht++;.      }.#e
2a990 6e 64 69 66 0a 0a 20 20 20 20 20 20 66 6f 72 28  ndif..      for(
2a9a0 69 3d 30 3b 20 69 3c 6e 4c 65 66 74 20 7c 7c 20  i=0; i<nLeft || 
2a9b0 69 3c 6e 52 69 67 68 74 3b 20 69 2b 2b 29 7b 0a  i<nRight; i++){.
2a9c0 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 61 64          int iPad
2a9d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
2a9e0 61 72 20 7a 4c 65 76 65 6c 5b 33 32 5d 3b 0a 20  ar zLevel[32];. 
2a9f0 20 20 20 20 20 20 20 7a 4c 65 66 74 5b 30 5d 20         zLeft[0] 
2aa00 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
2aa10 7a 52 69 67 68 74 5b 30 5d 20 3d 20 27 5c 30 27  zRight[0] = '\0'
2aa20 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ;..        if( i
2aa30 3c 6e 4c 65 66 74 20 29 7b 20 0a 20 20 20 20 20  <nLeft ){ .     
2aa40 20 20 20 20 20 66 69 6c 65 54 6f 53 74 72 69 6e       fileToStrin
2aa50 67 28 70 44 62 2c 20 7a 4c 65 66 74 2c 20 73 69  g(pDb, zLeft, si
2aa60 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 20 32 34 2c  zeof(zLeft), 24,
2aa70 20 61 4c 65 66 74 5b 69 5d 29 3b 20 0a 20 20 20   aLeft[i]); .   
2aa80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2aa90 66 28 20 69 3c 6e 52 69 67 68 74 20 29 7b 20 0a  f( i<nRight ){ .
2aaa0 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 54 6f            fileTo
2aab0 53 74 72 69 6e 67 28 70 44 62 2c 20 7a 52 69 67  String(pDb, zRig
2aac0 68 74 2c 20 73 69 7a 65 6f 66 28 7a 52 69 67 68  ht, sizeof(zRigh
2aad0 74 29 2c 20 32 34 2c 20 61 52 69 67 68 74 5b 69  t), 24, aRight[i
2aae0 5d 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ]); .        }..
2aaf0 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30          if( i==0
2ab00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2ab10 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2ab20 69 7a 65 6f 66 28 7a 4c 65 76 65 6c 29 2c 20 7a  izeof(zLevel), z
2ab30 4c 65 76 65 6c 2c 20 22 4c 25 64 3a 20 28 61 67  Level, "L%d: (ag
2ab40 65 3d 25 64 29 20 28 66 6c 61 67 73 3d 25 2e 34  e=%d) (flags=%.4
2ab50 78 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  x)",.           
2ab60 20 20 20 69 4c 65 76 65 6c 2c 20 28 69 6e 74 29     iLevel, (int)
2ab70 70 4c 65 76 65 6c 2d 3e 69 41 67 65 2c 20 28 69  pLevel->iAge, (i
2ab80 6e 74 29 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  nt)pLevel->flags
2ab90 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
2aba0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2abb0 20 20 20 20 20 20 20 7a 4c 65 76 65 6c 5b 30 5d         zLevel[0]
2abc0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20   = '\0';.       
2abd0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
2abe0 6e 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20  nRight==0 ){.   
2abf0 20 20 20 20 20 20 20 69 50 61 64 20 3d 20 31 30         iPad = 10
2ac00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2ac10 20 20 20 20 20 6c 73 6d 4c 6f 67 4d 65 73 73 61       lsmLogMessa
2ac20 67 65 28 70 44 62 2c 20 4c 53 4d 5f 4f 4b 2c 20  ge(pDb, LSM_OK, 
2ac30 22 25 20 32 35 73 20 25 20 2a 73 25 20 2d 33 35  "% 25s % *s% -35
2ac40 73 20 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20  s %s", .        
2ac50 20 20 20 20 7a 4c 65 76 65 6c 2c 20 69 50 61 64      zLevel, iPad
2ac60 2c 20 22 22 2c 20 7a 4c 65 66 74 2c 20 7a 52 69  , "", zLeft, zRi
2ac70 67 68 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ght.        );. 
2ac80 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 4c       }..      iL
2ac90 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  evel++;.    }.. 
2aca0 20 20 20 69 66 28 20 62 4b 65 79 73 20 29 7b 0a     if( bKeys ){.
2acb0 20 20 20 20 20 20 66 6f 72 28 70 4c 65 76 65 6c        for(pLevel
2acc0 3d 70 54 6f 70 4c 65 76 65 6c 3b 20 70 4c 65 76  =pTopLevel; pLev
2acd0 65 6c 3b 20 70 4c 65 76 65 6c 3d 70 4c 65 76 65  el; pLevel=pLeve
2ace0 6c 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  l->pNext){.     
2acf0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2ad00 20 20 73 6f 72 74 65 64 44 75 6d 70 53 65 67 6d    sortedDumpSegm
2ad10 65 6e 74 28 70 44 62 2c 20 26 70 4c 65 76 65 6c  ent(pDb, &pLevel
2ad20 2d 3e 6c 68 73 2c 20 62 56 61 6c 73 29 3b 0a 20  ->lhs, bVals);. 
2ad30 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2ad40 69 3c 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74  i<pLevel->nRight
2ad50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2ad60 20 20 73 6f 72 74 65 64 44 75 6d 70 53 65 67 6d    sortedDumpSegm
2ad70 65 6e 74 28 70 44 62 2c 20 26 70 4c 65 76 65 6c  ent(pDb, &pLevel
2ad80 2d 3e 61 52 68 73 5b 69 5d 2c 20 62 56 61 6c 73  ->aRhs[i], bVals
2ad90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2ada0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2adb0 20 20 6c 73 6d 49 6e 66 6f 46 72 65 65 6c 69 73    lsmInfoFreelis
2adc0 74 28 70 44 62 2c 20 26 7a 46 72 65 65 29 3b 0a  t(pDb, &zFree);.
2add0 20 20 6c 73 6d 4c 6f 67 4d 65 73 73 61 67 65 28    lsmLogMessage(
2ade0 70 44 62 2c 20 4c 53 4d 5f 4f 4b 2c 20 22 46 72  pDb, LSM_OK, "Fr
2adf0 65 65 6c 69 73 74 3a 20 25 73 22 2c 20 7a 46 72  eelist: %s", zFr
2ae00 65 65 29 3b 0a 20 20 6c 73 6d 46 72 65 65 28 70  ee);.  lsmFree(p
2ae10 44 62 2d 3e 70 45 6e 76 2c 20 7a 46 72 65 65 29  Db->pEnv, zFree)
2ae20 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6c 73 6d  ;..  assert( lsm
2ae30 46 73 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  FsIntegrityCheck
2ae40 28 70 44 62 29 20 29 3b 0a 7d 0a 0a 76 6f 69 64  (pDb) );.}..void
2ae50 20 6c 73 6d 53 6f 72 74 65 64 46 72 65 65 4c 65   lsmSortedFreeLe
2ae60 76 65 6c 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e  vel(lsm_env *pEn
2ae70 76 2c 20 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  v, Level *pLevel
2ae80 29 7b 0a 20 20 4c 65 76 65 6c 20 2a 70 4e 65 78  ){.  Level *pNex
2ae90 74 3b 0a 20 20 4c 65 76 65 6c 20 2a 70 3b 0a 0a  t;.  Level *p;..
2aea0 20 20 66 6f 72 28 70 3d 70 4c 65 76 65 6c 3b 20    for(p=pLevel; 
2aeb0 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
2aec0 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
2aed0 74 3b 0a 20 20 20 20 73 6f 72 74 65 64 46 72 65  t;.    sortedFre
2aee0 65 4c 65 76 65 6c 28 70 45 6e 76 2c 20 70 29 3b  eLevel(pEnv, p);
2aef0 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 6c 73 6d  .  }.}..void lsm
2af00 53 6f 72 74 65 64 53 61 76 65 54 72 65 65 43 75  SortedSaveTreeCu
2af10 72 73 6f 72 73 28 6c 73 6d 5f 64 62 20 2a 70 44  rsors(lsm_db *pD
2af20 62 29 7b 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f  b){.  MultiCurso
2af30 72 20 2a 70 43 73 72 3b 0a 20 20 66 6f 72 28 70  r *pCsr;.  for(p
2af40 43 73 72 3d 70 44 62 2d 3e 70 43 73 72 3b 20 70  Csr=pDb->pCsr; p
2af50 43 73 72 3b 20 70 43 73 72 3d 70 43 73 72 2d 3e  Csr; pCsr=pCsr->
2af60 70 4e 65 78 74 29 7b 0a 20 20 20 20 6c 73 6d 54  pNext){.    lsmT
2af70 72 65 65 43 75 72 73 6f 72 53 61 76 65 28 70 43  reeCursorSave(pC
2af80 73 72 2d 3e 61 70 54 72 65 65 43 73 72 5b 30 5d  sr->apTreeCsr[0]
2af90 29 3b 0a 20 20 20 20 6c 73 6d 54 72 65 65 43 75  );.    lsmTreeCu
2afa0 72 73 6f 72 53 61 76 65 28 70 43 73 72 2d 3e 61  rsorSave(pCsr->a
2afb0 70 54 72 65 65 43 73 72 5b 31 5d 29 3b 0a 20 20  pTreeCsr[1]);.  
2afc0 7d 0a 7d 0a 0a 76 6f 69 64 20 6c 73 6d 53 6f 72  }.}..void lsmSor
2afd0 74 65 64 45 78 70 61 6e 64 42 74 72 65 65 50 61  tedExpandBtreePa
2afe0 67 65 28 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  ge(Page *pPg, in
2aff0 74 20 6e 4f 72 69 67 29 7b 0a 20 20 75 38 20 2a  t nOrig){.  u8 *
2b000 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 44 61  aData;.  int nDa
2b010 74 61 3b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  ta;.  int nEntry
2b020 3b 0a 20 20 69 6e 74 20 69 48 64 72 3b 0a 0a 20  ;.  int iHdr;.. 
2b030 20 61 44 61 74 61 20 3d 20 6c 73 6d 46 73 50 61   aData = lsmFsPa
2b040 67 65 44 61 74 61 28 70 50 67 2c 20 26 6e 44 61  geData(pPg, &nDa
2b050 74 61 29 3b 0a 20 20 6e 45 6e 74 72 79 20 3d 20  ta);.  nEntry = 
2b060 70 61 67 65 47 65 74 4e 52 65 63 28 61 44 61 74  pageGetNRec(aDat
2b070 61 2c 20 6e 4f 72 69 67 29 3b 0a 20 20 69 48 64  a, nOrig);.  iHd
2b080 72 20 3d 20 53 45 47 4d 45 4e 54 5f 45 4f 46 28  r = SEGMENT_EOF(
2b090 6e 4f 72 69 67 2c 20 6e 45 6e 74 72 79 29 3b 0a  nOrig, nEntry);.
2b0a0 20 20 6d 65 6d 6d 6f 76 65 28 26 61 44 61 74 61    memmove(&aData
2b0b0 5b 69 48 64 72 20 2b 20 28 6e 44 61 74 61 2d 6e  [iHdr + (nData-n
2b0c0 4f 72 69 67 29 5d 2c 20 26 61 44 61 74 61 5b 69  Orig)], &aData[i
2b0d0 48 64 72 5d 2c 20 6e 4f 72 69 67 2d 69 48 64 72  Hdr], nOrig-iHdr
2b0e0 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 4c 53 4d  );.}..#ifdef LSM
2b0f0 5f 44 45 42 55 47 5f 45 58 50 45 4e 53 49 56 45  _DEBUG_EXPENSIVE
2b100 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
2b110 65 72 74 52 75 6e 49 6e 4f 72 64 65 72 28 6c 73  ertRunInOrder(ls
2b120 6d 5f 64 62 20 2a 70 44 62 2c 20 53 65 67 6d 65  m_db *pDb, Segme
2b130 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20 50 61 67  nt *pSeg){.  Pag
2b140 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 42 6c  e *pPg = 0;.  Bl
2b150 6f 62 20 62 6c 6f 62 31 20 3d 20 7b 30 2c 20 30  ob blob1 = {0, 0
2b160 2c 20 30 2c 20 30 7d 3b 0a 20 20 42 6c 6f 62 20  , 0, 0};.  Blob 
2b170 62 6c 6f 62 32 20 3d 20 7b 30 2c 20 30 2c 20 30  blob2 = {0, 0, 0
2b180 2c 20 30 7d 3b 0a 0a 20 20 6c 73 6d 46 73 44 62  , 0};..  lsmFsDb
2b190 50 61 67 65 47 65 74 28 70 44 62 2d 3e 70 46 53  PageGet(pDb->pFS
2b1a0 2c 20 70 53 65 67 2c 20 70 53 65 67 2d 3e 69 46  , pSeg, pSeg->iF
2b1b0 69 72 73 74 2c 20 26 70 50 67 29 3b 0a 20 20 77  irst, &pPg);.  w
2b1c0 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20  hile( pPg ){.   
2b1d0 20 75 38 20 2a 61 44 61 74 61 3b 20 69 6e 74 20   u8 *aData; int 
2b1e0 6e 44 61 74 61 3b 0a 20 20 20 20 50 61 67 65 20  nData;.    Page 
2b1f0 2a 70 4e 65 78 74 3b 0a 0a 20 20 20 20 61 44 61  *pNext;..    aDa
2b200 74 61 20 3d 20 6c 73 6d 46 73 50 61 67 65 44 61  ta = lsmFsPageDa
2b210 74 61 28 70 50 67 2c 20 26 6e 44 61 74 61 29 3b  ta(pPg, &nData);
2b220 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 61 67  .    if( 0==(pag
2b230 65 47 65 74 46 6c 61 67 73 28 61 44 61 74 61 2c  eGetFlags(aData,
2b240 20 6e 44 61 74 61 29 20 26 20 53 45 47 4d 45 4e   nData) & SEGMEN
2b250 54 5f 42 54 52 45 45 5f 46 4c 41 47 29 20 29 7b  T_BTREE_FLAG) ){
2b260 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2b270 20 20 20 20 69 6e 74 20 6e 52 65 63 20 3d 20 70      int nRec = p
2b280 61 67 65 47 65 74 4e 52 65 63 28 61 44 61 74 61  ageGetNRec(aData
2b290 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , nData);.      
2b2a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b  for(i=0; i<nRec;
2b2b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
2b2c0 6e 74 20 69 54 6f 70 69 63 31 2c 20 69 54 6f 70  nt iTopic1, iTop
2b2d0 69 63 32 3b 0a 20 20 20 20 20 20 20 20 70 61 67  ic2;.        pag
2b2e0 65 47 65 74 4b 65 79 43 6f 70 79 28 70 44 62 2d  eGetKeyCopy(pDb-
2b2f0 3e 70 45 6e 76 2c 20 70 53 65 67 2c 20 70 50 67  >pEnv, pSeg, pPg
2b300 2c 20 69 2c 20 26 69 54 6f 70 69 63 31 2c 20 26  , i, &iTopic1, &
2b310 62 6c 6f 62 31 29 3b 0a 0a 20 20 20 20 20 20 20  blob1);..       
2b320 20 69 66 28 20 69 3d 3d 30 20 26 26 20 62 6c 6f   if( i==0 && blo
2b330 62 32 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20  b2.nData ){.    
2b340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 6f        assert( so
2b350 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65 28 0a  rtedKeyCompare(.
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b370 70 44 62 2d 3e 78 43 6d 70 2c 20 69 54 6f 70 69  pDb->xCmp, iTopi
2b380 63 32 2c 20 62 6c 6f 62 32 2e 70 44 61 74 61 2c  c2, blob2.pData,
2b390 20 62 6c 6f 62 32 2e 6e 44 61 74 61 2c 0a 20 20   blob2.nData,.  
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54                iT
2b3b0 6f 70 69 63 31 2c 20 62 6c 6f 62 31 2e 70 44 61  opic1, blob1.pDa
2b3c0 74 61 2c 20 62 6c 6f 62 31 2e 6e 44 61 74 61 0a  ta, blob1.nData.
2b3d0 20 20 20 20 20 20 20 20 20 20 29 3c 30 20 29 3b            )<0 );
2b3e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2b3f0 20 20 20 20 69 66 28 20 69 3c 28 6e 52 65 63 2d      if( i<(nRec-
2b400 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
2b410 70 61 67 65 47 65 74 4b 65 79 43 6f 70 79 28 70  pageGetKeyCopy(p
2b420 44 62 2d 3e 70 45 6e 76 2c 20 70 53 65 67 2c 20  Db->pEnv, pSeg, 
2b430 70 50 67 2c 20 69 2b 31 2c 20 26 69 54 6f 70 69  pPg, i+1, &iTopi
2b440 63 32 2c 20 26 62 6c 6f 62 32 29 3b 0a 20 20 20  c2, &blob2);.   
2b450 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2b460 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65 28  ortedKeyCompare(
2b470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b480 20 70 44 62 2d 3e 78 43 6d 70 2c 20 69 54 6f 70   pDb->xCmp, iTop
2b490 69 63 31 2c 20 62 6c 6f 62 31 2e 70 44 61 74 61  ic1, blob1.pData
2b4a0 2c 20 62 6c 6f 62 31 2e 6e 44 61 74 61 2c 0a 20  , blob1.nData,. 
2b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2b4c0 54 6f 70 69 63 32 2c 20 62 6c 6f 62 32 2e 70 44  Topic2, blob2.pD
2b4d0 61 74 61 2c 20 62 6c 6f 62 32 2e 6e 44 61 74 61  ata, blob2.nData
2b4e0 0a 20 20 20 20 20 20 20 20 20 20 29 3c 30 20 29  .          )<0 )
2b4f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b500 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c    }.    }..    l
2b510 73 6d 46 73 44 62 50 61 67 65 4e 65 78 74 28 70  smFsDbPageNext(p
2b520 53 65 67 2c 20 70 50 67 2c 20 31 2c 20 26 70 4e  Seg, pPg, 1, &pN
2b530 65 78 74 29 3b 0a 20 20 20 20 6c 73 6d 46 73 50  ext);.    lsmFsP
2b540 61 67 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  ageRelease(pPg);
2b550 0a 20 20 20 20 70 50 67 20 3d 20 70 4e 65 78 74  .    pPg = pNext
2b560 3b 0a 20 20 7d 0a 0a 20 20 73 6f 72 74 65 64 42  ;.  }..  sortedB
2b570 6c 6f 62 46 72 65 65 28 26 62 6c 6f 62 31 29 3b  lobFree(&blob1);
2b580 0a 20 20 73 6f 72 74 65 64 42 6c 6f 62 46 72 65  .  sortedBlobFre
2b590 65 28 26 62 6c 6f 62 32 29 3b 0a 7d 0a 23 65 6e  e(&blob2);.}.#en
2b5a0 64 69 66 0a 0a 23 69 66 64 65 66 20 4c 53 4d 5f  dif..#ifdef LSM_
2b5b0 44 45 42 55 47 5f 45 58 50 45 4e 53 49 56 45 0a  DEBUG_EXPENSIVE.
2b5c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2b5d0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 69 6e 63 6c  ion is only incl
2b5e0 75 64 65 64 20 69 6e 20 74 68 65 20 62 75 69 6c  uded in the buil
2b5f0 64 20 69 66 20 4c 53 4d 5f 44 45 42 55 47 5f 45  d if LSM_DEBUG_E
2b600 58 50 45 4e 53 49 56 45 20 69 73 20 0a 2a 2a 20  XPENSIVE is .** 
2b610 64 65 66 69 6e 65 64 2e 20 49 74 73 20 6f 6e 6c  defined. Its onl
2b620 79 20 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20  y purpose is to 
2b630 65 76 61 6c 75 61 74 65 20 76 61 72 69 6f 75 73  evaluate various
2b640 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
2b650 65 6e 74 73 20 74 6f 20 0a 2a 2a 20 76 65 72 69  ents to .** veri
2b660 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61  fy that the data
2b670 62 61 73 65 20 69 73 20 77 65 6c 6c 20 66 6f 72  base is well for
2b680 6d 65 64 20 69 6e 20 63 65 72 74 61 69 6e 20 72  med in certain r
2b690 65 73 70 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 4d  espects..**.** M
2b6a0 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79  ore specifically
2b6b0 2c 20 69 74 20 63 68 65 63 6b 73 20 74 68 61 74  , it checks that
2b6c0 20 74 68 65 20 61 72 72 61 79 20 70 4f 6e 65 20   the array pOne 
2b6d0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 65 71  contains the req
2b6e0 75 69 72 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65  uired .** pointe
2b6f0 72 73 20 74 6f 20 70 54 77 6f 2e 20 41 72 72 61  rs to pTwo. Arra
2b700 79 20 70 54 77 6f 20 6d 75 73 74 20 62 65 20 61  y pTwo must be a
2b710 20 6d 61 69 6e 20 61 72 72 61 79 2e 20 70 4f 6e   main array. pOn
2b720 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  e may be either 
2b730 61 20 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72 73  a .** separators
2b740 20 61 72 72 61 79 20 6f 72 20 61 6e 6f 74 68 65   array or anothe
2b750 72 20 6d 61 69 6e 20 61 72 72 61 79 2e 20 49 66  r main array. If
2b760 20 70 4f 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63   pOne does not c
2b770 6f 6e 74 61 69 6e 20 74 68 65 20 0a 2a 2a 20 63  ontain the .** c
2b780 6f 72 72 65 63 74 20 73 65 74 20 6f 66 20 70 6f  orrect set of po
2b790 69 6e 74 65 72 73 2c 20 61 6e 20 61 73 73 65 72  inters, an asser
2b7a0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 66 61  t() statement fa
2b7b0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2b7c0 6e 74 20 61 73 73 65 72 74 50 6f 69 6e 74 65 72  nt assertPointer
2b7d0 73 4f 6b 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70  sOk(.  lsm_db *p
2b7e0 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
2b7f0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
2b800 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53  se handle */.  S
2b810 65 67 6d 65 6e 74 20 2a 70 4f 6e 65 2c 20 20 20  egment *pOne,   
2b820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b830 2a 20 53 65 67 6d 65 6e 74 20 63 6f 6e 74 61 69  * Segment contai
2b840 6e 69 6e 67 20 70 6f 69 6e 74 65 72 73 20 2a 2f  ning pointers */
2b850 0a 20 20 53 65 67 6d 65 6e 74 20 2a 70 54 77 6f  .  Segment *pTwo
2b860 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b870 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 63 6f     /* Segment co
2b880 6e 74 61 69 6e 69 6e 67 20 70 6f 69 6e 74 65 72  ntaining pointer
2b890 20 74 61 72 67 65 74 73 20 2a 2f 0a 20 20 69 6e   targets */.  in
2b8a0 74 20 62 52 68 73 20 20 20 20 20 20 20 20 20 20  t bRhs          
2b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b8c0 20 54 72 75 65 20 69 66 20 70 54 77 6f 20 6d 61   True if pTwo ma
2b8d0 79 20 68 61 76 65 20 62 65 65 6e 20 47 6f 62 62  y have been Gobb
2b8e0 6c 65 28 29 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  le()d */.){.  in
2b8f0 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20  t rc = LSM_OK;  
2b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b910 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   Error code */. 
2b920 20 53 65 67 6d 65 6e 74 50 74 72 20 70 74 72 31   SegmentPtr ptr1
2b930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b940 20 2f 2a 20 49 74 65 72 61 74 65 73 20 74 68 72   /* Iterates thr
2b950 6f 75 67 68 20 70 4f 6e 65 20 2a 2f 0a 20 20 53  ough pOne */.  S
2b960 65 67 6d 65 6e 74 50 74 72 20 70 74 72 32 3b 20  egmentPtr ptr2; 
2b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b980 2a 20 49 74 65 72 61 74 65 73 20 74 68 72 6f 75  * Iterates throu
2b990 67 68 20 70 54 77 6f 20 2a 2f 0a 20 20 50 67 6e  gh pTwo */.  Pgn
2b9a0 6f 20 69 50 72 65 76 3b 0a 0a 20 20 61 73 73 65  o iPrev;..  asse
2b9b0 72 74 28 20 70 4f 6e 65 20 26 26 20 70 54 77 6f  rt( pOne && pTwo
2b9c0 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 70   );..  memset(&p
2b9d0 74 72 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  tr1, 0, sizeof(p
2b9e0 74 72 31 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  tr1));.  memset(
2b9f0 26 70 74 72 32 2c 20 30 2c 20 73 69 7a 65 6f 66  &ptr2, 0, sizeof
2ba00 28 70 74 72 31 29 29 3b 0a 20 20 70 74 72 31 2e  (ptr1));.  ptr1.
2ba10 70 53 65 67 20 3d 20 70 4f 6e 65 3b 0a 20 20 70  pSeg = pOne;.  p
2ba20 74 72 32 2e 70 53 65 67 20 3d 20 70 54 77 6f 3b  tr2.pSeg = pTwo;
2ba30 0a 20 20 73 65 67 6d 65 6e 74 50 74 72 45 6e 64  .  segmentPtrEnd
2ba40 50 61 67 65 28 70 44 62 2d 3e 70 46 53 2c 20 26  Page(pDb->pFS, &
2ba50 70 74 72 31 2c 20 30 2c 20 26 72 63 29 3b 0a 20  ptr1, 0, &rc);. 
2ba60 20 73 65 67 6d 65 6e 74 50 74 72 45 6e 64 50 61   segmentPtrEndPa
2ba70 67 65 28 70 44 62 2d 3e 70 46 53 2c 20 26 70 74  ge(pDb->pFS, &pt
2ba80 72 32 2c 20 30 2c 20 26 72 63 29 3b 0a 0a 20 20  r2, 0, &rc);..  
2ba90 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2baa0 65 20 66 6f 6f 74 65 72 20 70 6f 69 6e 74 65 72  e footer pointer
2bab0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
2bac0 67 65 20 6f 66 20 70 4f 6e 65 20 70 6f 69 6e 74  ge of pOne point
2bad0 73 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69  s to.  ** the fi
2bae0 72 73 74 20 70 61 67 65 20 6f 66 20 70 54 77 6f  rst page of pTwo
2baf0 2e 20 2a 2f 0a 20 20 69 50 72 65 76 20 3d 20 70  . */.  iPrev = p
2bb00 54 77 6f 2d 3e 69 46 69 72 73 74 3b 0a 20 20 69  Two->iFirst;.  i
2bb10 66 28 20 70 74 72 31 2e 69 50 74 72 21 3d 69 50  f( ptr1.iPtr!=iP
2bb20 72 65 76 20 26 26 20 21 62 52 68 73 20 29 7b 0a  rev && !bRhs ){.
2bb30 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
2bb40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
2bb50 4c 53 4d 5f 4f 4b 20 26 26 20 70 74 72 31 2e 6e  LSM_OK && ptr1.n
2bb60 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 72 63  Cell>0 ){.    rc
2bb70 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 4c 6f 61   = segmentPtrLoa
2bb80 64 43 65 6c 6c 28 26 70 74 72 31 2c 20 30 29 3b  dCell(&ptr1, 0);
2bb90 0a 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 77 68  .  }.      .  wh
2bba0 69 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20  ile( rc==LSM_OK 
2bbb0 26 26 20 70 74 72 32 2e 70 50 67 20 29 7b 0a 20  && ptr2.pPg ){. 
2bbc0 20 20 20 50 67 6e 6f 20 69 54 68 69 73 3b 0a 0a     Pgno iThis;..
2bbd0 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74      /* Advance t
2bbe0 6f 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  o the next page 
2bbf0 6f 66 20 73 65 67 6d 65 6e 74 20 70 54 77 6f 20  of segment pTwo 
2bc00 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 74  that contains at
2bc10 20 6c 65 61 73 74 0a 20 20 20 20 2a 2a 20 6f 6e   least.    ** on
2bc20 65 20 63 65 6c 6c 2e 20 42 72 65 61 6b 20 6f 75  e cell. Break ou
2bc30 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  t of the loop if
2bc40 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
2bc50 61 63 68 65 73 20 45 4f 46 2e 20 20 2a 2f 0a 20  aches EOF.  */. 
2bc60 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 72 63 20     do{.      rc 
2bc70 3d 20 73 65 67 6d 65 6e 74 50 74 72 4e 65 78 74  = segmentPtrNext
2bc80 50 61 67 65 28 26 70 74 72 32 2c 20 31 29 3b 0a  Page(&ptr2, 1);.
2bc90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2bca0 3d 3d 4c 53 4d 5f 4f 4b 20 29 3b 0a 20 20 20 20  ==LSM_OK );.    
2bcb0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f  }while( rc==LSM_
2bcc0 4f 4b 20 26 26 20 70 74 72 32 2e 70 50 67 20 26  OK && ptr2.pPg &
2bcd0 26 20 70 74 72 32 2e 6e 43 65 6c 6c 3d 3d 30 20  & ptr2.nCell==0 
2bce0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 4c  );.    if( rc!=L
2bcf0 53 4d 5f 4f 4b 20 7c 7c 20 70 74 72 32 2e 70 50  SM_OK || ptr2.pP
2bd00 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
2bd10 20 20 69 54 68 69 73 20 3d 20 6c 73 6d 46 73 50    iThis = lsmFsP
2bd20 61 67 65 4e 75 6d 62 65 72 28 70 74 72 32 2e 70  ageNumber(ptr2.p
2bd30 50 67 29 3b 0a 0a 20 20 20 20 69 66 28 20 28 70  Pg);..    if( (p
2bd40 74 72 32 2e 66 6c 61 67 73 20 26 20 28 50 47 46  tr2.flags & (PGF
2bd50 54 52 5f 53 4b 49 50 5f 54 48 49 53 5f 46 4c 41  TR_SKIP_THIS_FLA
2bd60 47 7c 53 45 47 4d 45 4e 54 5f 42 54 52 45 45 5f  G|SEGMENT_BTREE_
2bd70 46 4c 41 47 29 29 3d 3d 30 20 29 7b 0a 0a 20 20  FLAG))==0 ){..  
2bd80 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
2bd90 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 74 68  first cell in th
2bda0 65 20 61 72 72 61 79 20 70 54 77 6f 20 70 61 67  e array pTwo pag
2bdb0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  e. */.      rc =
2bdc0 20 73 65 67 6d 65 6e 74 50 74 72 4c 6f 61 64 43   segmentPtrLoadC
2bdd0 65 6c 6c 28 26 70 74 72 32 2c 20 30 29 3b 0a 0a  ell(&ptr2, 0);..
2bde0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65        /* Iterate
2bdf0 20 66 6f 72 77 61 72 64 73 20 74 68 72 6f 75 67   forwards throug
2be00 68 20 70 4f 6e 65 2c 20 73 65 61 72 63 68 69 6e  h pOne, searchin
2be10 67 20 66 6f 72 20 61 20 6b 65 79 20 74 68 61 74  g for a key that
2be20 20 6d 61 74 63 68 65 73 20 74 68 65 0a 20 20 20   matches the.   
2be30 20 20 20 2a 2a 20 6b 65 79 20 70 74 72 32 2e 70     ** key ptr2.p
2be40 4b 65 79 2f 6e 4b 65 79 2e 20 54 68 69 73 20 6b  Key/nKey. This k
2be50 65 79 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  ey should have a
2be60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2be70 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
2be80 2a 2a 20 70 74 72 32 20 63 75 72 72 65 6e 74 6c  ** ptr2 currentl
2be90 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 2a 2f 0a  y points to. */.
2bea0 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d        while( rc=
2beb0 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =LSM_OK ){.     
2bec0 20 20 20 69 6e 74 20 72 65 73 20 3d 20 72 74 54     int res = rtT
2bed0 6f 70 69 63 28 70 74 72 31 2e 65 54 79 70 65 29  opic(ptr1.eType)
2bee0 20 2d 20 72 74 54 6f 70 69 63 28 70 74 72 32 2e   - rtTopic(ptr2.
2bef0 65 54 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20  eType);.        
2bf00 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
2bf10 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 44          res = pD
2bf20 62 2d 3e 78 43 6d 70 28 70 74 72 31 2e 70 4b 65  b->xCmp(ptr1.pKe
2bf30 79 2c 20 70 74 72 31 2e 6e 4b 65 79 2c 20 70 74  y, ptr1.nKey, pt
2bf40 72 32 2e 70 4b 65 79 2c 20 70 74 72 32 2e 6e 4b  r2.pKey, ptr2.nK
2bf50 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ey);.        }..
2bf60 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c          if( res<
2bf70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
2bf80 73 73 65 72 74 28 20 62 52 68 73 20 7c 7c 20 70  ssert( bRhs || p
2bf90 74 72 31 2e 69 50 74 72 2b 70 74 72 31 2e 69 50  tr1.iPtr+ptr1.iP
2bfa0 67 50 74 72 3d 3d 69 50 72 65 76 20 29 3b 0a 20  gPtr==iPrev );. 
2bfb0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2bfc0 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
2bfd0 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
2bfe0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2bff0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2c000 28 20 70 74 72 31 2e 69 50 74 72 2b 70 74 72 31  ( ptr1.iPtr+ptr1
2c010 2e 69 50 67 50 74 72 3d 3d 69 54 68 69 73 20 29  .iPgPtr==iThis )
2c020 3b 0a 20 20 20 20 20 20 20 20 20 20 69 50 72 65  ;.          iPre
2c030 76 20 3d 20 69 54 68 69 73 3b 0a 20 20 20 20 20  v = iThis;.     
2c040 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2c050 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
2c060 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 41 64  c = segmentPtrAd
2c070 76 61 6e 63 65 28 30 2c 20 26 70 74 72 31 2c 20  vance(0, &ptr1, 
2c080 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2c090 70 74 72 31 2e 70 50 67 3d 3d 30 20 29 7b 0a 20  ptr1.pPg==0 ){. 
2c0a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2c0b0 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   0 );.        }.
2c0c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c0d0 7d 0a 0a 20 20 73 65 67 6d 65 6e 74 50 74 72 52  }..  segmentPtrR
2c0e0 65 73 65 74 28 26 70 74 72 31 29 3b 0a 20 20 73  eset(&ptr1);.  s
2c0f0 65 67 6d 65 6e 74 50 74 72 52 65 73 65 74 28 26  egmentPtrReset(&
2c100 70 74 72 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  ptr2);.  return 
2c110 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  LSM_OK;.}../*.**
2c120 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2c130 73 20 6f 6e 6c 79 20 69 6e 63 6c 75 64 65 64 20  s only included 
2c140 69 6e 20 74 68 65 20 62 75 69 6c 64 20 69 66 20  in the build if 
2c150 4c 53 4d 5f 44 45 42 55 47 5f 45 58 50 45 4e 53  LSM_DEBUG_EXPENS
2c160 49 56 45 20 69 73 20 0a 2a 2a 20 64 65 66 69 6e  IVE is .** defin
2c170 65 64 2e 20 49 74 73 20 6f 6e 6c 79 20 70 75 72  ed. Its only pur
2c180 70 6f 73 65 20 69 73 20 74 6f 20 65 76 61 6c 75  pose is to evalu
2c190 61 74 65 20 76 61 72 69 6f 75 73 20 61 73 73 65  ate various asse
2c1a0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
2c1b0 74 6f 20 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  to .** verify th
2c1c0 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
2c1d0 69 73 20 77 65 6c 6c 20 66 6f 72 6d 65 64 20 69  is well formed i
2c1e0 6e 20 63 65 72 74 61 69 6e 20 72 65 73 70 65 63  n certain respec
2c1f0 74 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  ts..**.** More s
2c200 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20  pecifically, it 
2c210 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
2c220 62 2d 74 72 65 65 20 65 6d 62 65 64 64 65 64 20  b-tree embedded 
2c230 69 6e 20 61 72 72 61 79 20 70 52 75 6e 0a 2a 2a  in array pRun.**
2c240 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f   contains the co
2c250 72 72 65 63 74 20 6b 65 79 73 2e 20 49 66 20 6e  rrect keys. If n
2c260 6f 74 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ot, an assert() 
2c270 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
2c280 20 69 6e 74 20 61 73 73 65 72 74 42 74 72 65 65   int assertBtree
2c290 4f 6b 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44  Ok(.  lsm_db *pD
2c2a0 62 2c 0a 20 20 53 65 67 6d 65 6e 74 20 2a 70 53  b,.  Segment *pS
2c2b0 65 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  eg.){.  int rc =
2c2c0 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20   LSM_OK;        
2c2d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2c2e0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20  n code */.  if( 
2c2f0 70 53 65 67 2d 3e 69 52 6f 6f 74 20 29 7b 0a 20  pSeg->iRoot ){. 
2c300 20 20 20 42 6c 6f 62 20 62 6c 6f 62 20 3d 20 7b     Blob blob = {
2c310 30 2c 20 30 2c 20 30 7d 3b 20 20 20 20 20 20 20  0, 0, 0};       
2c320 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20   /* Buffer used 
2c330 74 6f 20 63 61 63 68 65 20 6f 76 65 72 66 6c 6f  to cache overflo
2c340 77 20 6b 65 79 73 20 2a 2f 0a 20 20 20 20 46 69  w keys */.    Fi
2c350 6c 65 53 79 73 74 65 6d 20 2a 70 46 53 20 3d 20  leSystem *pFS = 
2c360 70 44 62 2d 3e 70 46 53 3b 20 20 20 2f 2a 20 46  pDb->pFS;   /* F
2c370 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 72 65  ile system to re
2c380 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 50  ad from */.    P
2c390 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 20 20 20  age *pPg = 0;   
2c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c3b0 4d 61 69 6e 20 72 75 6e 20 70 61 67 65 20 2a 2f  Main run page */
2c3c0 0a 20 20 20 20 42 74 72 65 65 43 75 72 73 6f 72  .    BtreeCursor
2c3d0 20 2a 70 43 73 72 20 3d 20 30 3b 20 20 20 20 20   *pCsr = 0;     
2c3e0 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
2c3f0 6f 72 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  or */..    rc = 
2c400 62 74 72 65 65 43 75 72 73 6f 72 4e 65 77 28 70  btreeCursorNew(p
2c410 44 62 2c 20 70 53 65 67 2c 20 26 70 43 73 72 29  Db, pSeg, &pCsr)
2c420 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53  ;.    if( rc==LS
2c430 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  M_OK ){.      rc
2c440 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 46 69   = btreeCursorFi
2c450 72 73 74 28 70 43 73 72 29 3b 0a 20 20 20 20 7d  rst(pCsr);.    }
2c460 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d  .    if( rc==LSM
2c470 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2c480 3d 20 6c 73 6d 46 73 44 62 50 61 67 65 47 65 74  = lsmFsDbPageGet
2c490 28 70 46 53 2c 20 70 53 65 67 2c 20 70 53 65 67  (pFS, pSeg, pSeg
2c4a0 2d 3e 69 46 69 72 73 74 2c 20 26 70 50 67 29 3b  ->iFirst, &pPg);
2c4b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c  .    }..    whil
2c4c0 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  e( rc==LSM_OK ){
2c4d0 0a 20 20 20 20 20 20 50 61 67 65 20 2a 70 4e 65  .      Page *pNe
2c4e0 78 74 3b 0a 20 20 20 20 20 20 75 38 20 2a 61 44  xt;.      u8 *aD
2c4f0 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ata;.      int n
2c500 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20  Data;.      int 
2c510 66 6c 61 67 73 3b 0a 0a 20 20 20 20 20 20 72 63  flags;..      rc
2c520 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65 4e 65   = lsmFsDbPageNe
2c530 78 74 28 70 53 65 67 2c 20 70 50 67 2c 20 31 2c  xt(pSeg, pPg, 1,
2c540 20 26 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &pNext);.      
2c550 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65  lsmFsPageRelease
2c560 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 67  (pPg);.      pPg
2c570 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20   = pNext;.      
2c580 69 66 28 20 70 50 67 3d 3d 30 20 29 20 62 72 65  if( pPg==0 ) bre
2c590 61 6b 3b 0a 20 20 20 20 20 20 61 44 61 74 61 20  ak;.      aData 
2c5a0 3d 20 66 73 50 61 67 65 44 61 74 61 28 70 50 67  = fsPageData(pPg
2c5b0 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20  , &nData);.     
2c5c0 20 66 6c 61 67 73 20 3d 20 70 61 67 65 47 65 74   flags = pageGet
2c5d0 46 6c 61 67 73 28 61 44 61 74 61 2c 20 6e 44 61  Flags(aData, nDa
2c5e0 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ta);.      if( r
2c5f0 63 3d 3d 4c 53 4d 5f 4f 4b 20 0a 20 20 20 20 20  c==LSM_OK .     
2c600 20 20 26 26 20 30 3d 3d 28 28 53 45 47 4d 45 4e    && 0==((SEGMEN
2c610 54 5f 42 54 52 45 45 5f 46 4c 41 47 7c 50 47 46  T_BTREE_FLAG|PGF
2c620 54 52 5f 53 4b 49 50 5f 54 48 49 53 5f 46 4c 41  TR_SKIP_THIS_FLA
2c630 47 29 20 26 20 66 6c 61 67 73 29 0a 20 20 20 20  G) & flags).    
2c640 20 20 20 26 26 20 30 21 3d 70 61 67 65 47 65 74     && 0!=pageGet
2c650 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44 61 74  NRec(aData, nDat
2c660 61 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  a).      ){.    
2c670 20 20 20 20 75 38 20 2a 70 4b 65 79 3b 0a 20 20      u8 *pKey;.  
2c680 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a        int nKey;.
2c690 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 6f 70          int iTop
2c6a0 69 63 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  ic;.        pKey
2c6b0 20 3d 20 70 61 67 65 47 65 74 4b 65 79 28 70 53   = pageGetKey(pS
2c6c0 65 67 2c 20 70 50 67 2c 20 30 2c 20 26 69 54 6f  eg, pPg, 0, &iTo
2c6d0 70 69 63 2c 20 26 6e 4b 65 79 2c 20 26 62 6c 6f  pic, &nKey, &blo
2c6e0 62 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  b);.        asse
2c6f0 72 74 28 20 6e 4b 65 79 3d 3d 70 43 73 72 2d 3e  rt( nKey==pCsr->
2c700 6e 4b 65 79 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  nKey && 0==memcm
2c710 70 28 70 4b 65 79 2c 20 70 43 73 72 2d 3e 70 4b  p(pKey, pCsr->pK
2c720 65 79 2c 20 6e 4b 65 79 29 20 29 3b 0a 20 20 20  ey, nKey) );.   
2c730 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 73 6d       assert( lsm
2c740 46 73 50 61 67 65 4e 75 6d 62 65 72 28 70 50 67  FsPageNumber(pPg
2c750 29 3d 3d 70 43 73 72 2d 3e 69 50 74 72 20 29 3b  )==pCsr->iPtr );
2c760 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
2c770 72 65 65 43 75 72 73 6f 72 4e 65 78 74 28 70 43  reeCursorNext(pC
2c780 73 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sr);.      }.   
2c790 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
2c7a0 63 21 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 70 43 73  c!=LSM_OK || pCs
2c7b0 72 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b 0a 0a 20  r->pKey==0 );.. 
2c7c0 20 20 20 69 66 28 20 70 50 67 20 29 20 6c 73 6d     if( pPg ) lsm
2c7d0 46 73 50 61 67 65 52 65 6c 65 61 73 65 28 70 50  FsPageRelease(pP
2c7e0 67 29 3b 0a 0a 20 20 20 20 62 74 72 65 65 43 75  g);..    btreeCu
2c7f0 72 73 6f 72 46 72 65 65 28 70 43 73 72 29 3b 0a  rsorFree(pCsr);.
2c800 20 20 20 20 73 6f 72 74 65 64 42 6c 6f 62 46 72      sortedBlobFr
2c810 65 65 28 26 62 6c 6f 62 29 3b 0a 20 20 7d 0a 0a  ee(&blob);.  }..
2c820 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
2c830 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 4c  endif /* ifdef L
2c840 53 4d 5f 44 45 42 55 47 5f 45 58 50 45 4e 53 49  SM_DEBUG_EXPENSI
2c850 56 45 20 2a 2f 0a                                VE */.