/ Hex Artifact Content
Login

Artifact ad426f7ed930ff4bd0405fbf77e06b48cdaabd11673cc39870b4cf7e5d92109e:


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 0a  mInt.h".#endif..
0ac0: 23 64 65 66 69 6e 65 20 4c 53 4d 5f 4c 4f 47 5f  #define LSM_LOG_
0ad0: 53 54 52 55 43 54 55 52 45 20 30 0a 23 64 65 66  STRUCTURE 0.#def
0ae0: 69 6e 65 20 4c 53 4d 5f 4c 4f 47 5f 44 41 54 41  ine LSM_LOG_DATA
0af0: 20 20 20 20 20 20 30 0a 0a 2f 2a 0a 2a 2a 20 4d        0../*.** M
0b00: 61 63 72 6f 73 20 74 6f 20 68 65 6c 70 20 64 65  acros to help de
0b10: 63 6f 64 65 20 72 65 63 6f 72 64 20 74 79 70 65  code record type
0b20: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 72 74  s..*/.#define rt
0b30: 54 6f 70 69 63 28 65 54 79 70 65 29 20 20 20 20  Topic(eType)    
0b40: 20 20 20 28 28 65 54 79 70 65 29 20 26 20 4c 53     ((eType) & LS
0b50: 4d 5f 53 59 53 54 45 4d 4b 45 59 29 0a 23 64 65  M_SYSTEMKEY).#de
0b60: 66 69 6e 65 20 72 74 49 73 44 65 6c 65 74 65 28  fine rtIsDelete(
0b70: 65 54 79 70 65 29 20 20 20 20 28 28 28 65 54 79  eType)    (((eTy
0b80: 70 65 29 20 26 20 30 78 30 46 29 3d 3d 4c 53 4d  pe) & 0x0F)==LSM
0b90: 5f 50 4f 49 4e 54 5f 44 45 4c 45 54 45 29 0a 0a  _POINT_DELETE)..
0ba0: 23 64 65 66 69 6e 65 20 72 74 49 73 53 65 70 61  #define rtIsSepa
0bb0: 72 61 74 6f 72 28 65 54 79 70 65 29 20 28 28 28  rator(eType) (((
0bc0: 65 54 79 70 65 29 20 26 20 4c 53 4d 5f 53 45 50  eType) & LSM_SEP
0bd0: 41 52 41 54 4f 52 29 21 3d 30 29 0a 23 64 65 66  ARATOR)!=0).#def
0be0: 69 6e 65 20 72 74 49 73 57 72 69 74 65 28 65 54  ine rtIsWrite(eT
0bf0: 79 70 65 29 20 20 20 20 20 28 28 28 65 54 79 70  ype)     (((eTyp
0c00: 65 29 20 26 20 4c 53 4d 5f 49 4e 53 45 52 54 29  e) & LSM_INSERT)
0c10: 21 3d 30 29 0a 23 64 65 66 69 6e 65 20 72 74 49  !=0).#define rtI
0c20: 73 53 79 73 74 65 6d 28 65 54 79 70 65 29 20 20  sSystem(eType)  
0c30: 20 20 28 28 28 65 54 79 70 65 29 20 26 20 4c 53    (((eType) & LS
0c40: 4d 5f 53 59 53 54 45 4d 4b 45 59 29 21 3d 30 29  M_SYSTEMKEY)!=0)
0c50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
0c60: 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20 61 72 65  owing macros are
0c70: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
0c80: 61 20 70 61 67 65 20 66 6f 6f 74 65 72 2e 0a 2a  a page footer..*
0c90: 2f 0a 23 64 65 66 69 6e 65 20 53 45 47 4d 45 4e  /.#define SEGMEN
0ca0: 54 5f 4e 52 45 43 4f 52 44 5f 4f 46 46 53 45 54  T_NRECORD_OFFSET
0cb0: 28 70 67 73 7a 29 20 20 20 20 20 20 20 20 28 28  (pgsz)        ((
0cc0: 70 67 73 7a 29 20 2d 20 32 29 0a 23 64 65 66 69  pgsz) - 2).#defi
0cd0: 6e 65 20 53 45 47 4d 45 4e 54 5f 46 4c 41 47 53  ne SEGMENT_FLAGS
0ce0: 5f 4f 46 46 53 45 54 28 70 67 73 7a 29 20 20 20  _OFFSET(pgsz)   
0cf0: 20 20 20 20 20 20 20 28 28 70 67 73 7a 29 20 2d         ((pgsz) -
0d00: 20 32 20 2d 20 32 29 0a 23 64 65 66 69 6e 65 20   2 - 2).#define 
0d10: 53 45 47 4d 45 4e 54 5f 50 4f 49 4e 54 45 52 5f  SEGMENT_POINTER_
0d20: 4f 46 46 53 45 54 28 70 67 73 7a 29 20 20 20 20  OFFSET(pgsz)    
0d30: 20 20 20 20 28 28 70 67 73 7a 29 20 2d 20 32 20      ((pgsz) - 2 
0d40: 2d 20 32 20 2d 20 38 29 0a 23 64 65 66 69 6e 65  - 2 - 8).#define
0d50: 20 53 45 47 4d 45 4e 54 5f 43 45 4c 4c 50 54 52   SEGMENT_CELLPTR
0d60: 5f 4f 46 46 53 45 54 28 70 67 73 7a 2c 20 69 43  _OFFSET(pgsz, iC
0d70: 65 6c 6c 29 20 28 28 70 67 73 7a 29 20 2d 20 32  ell) ((pgsz) - 2
0d80: 20 2d 20 32 20 2d 20 38 20 2d 20 32 20 2d 20 28   - 2 - 8 - 2 - (
0d90: 69 43 65 6c 6c 29 2a 32 29 0a 0a 23 64 65 66 69  iCell)*2)..#defi
0da0: 6e 65 20 53 45 47 4d 45 4e 54 5f 45 4f 46 28 70  ne SEGMENT_EOF(p
0db0: 67 73 7a 2c 20 6e 45 6e 74 72 79 29 20 53 45 47  gsz, nEntry) SEG
0dc0: 4d 45 4e 54 5f 43 45 4c 4c 50 54 52 5f 4f 46 46  MENT_CELLPTR_OFF
0dd0: 53 45 54 28 70 67 73 7a 2c 20 6e 45 6e 74 72 79  SET(pgsz, nEntry
0de0: 29 0a 0a 23 64 65 66 69 6e 65 20 53 45 47 4d 45  )..#define SEGME
0df0: 4e 54 5f 42 54 52 45 45 5f 46 4c 41 47 20 20 20  NT_BTREE_FLAG   
0e00: 20 20 30 78 30 30 30 31 0a 23 64 65 66 69 6e 65    0x0001.#define
0e10: 20 50 47 46 54 52 5f 53 4b 49 50 5f 4e 45 58 54   PGFTR_SKIP_NEXT
0e20: 5f 46 4c 41 47 20 20 20 30 78 30 30 30 32 0a 23  _FLAG   0x0002.#
0e30: 64 65 66 69 6e 65 20 50 47 46 54 52 5f 53 4b 49  define PGFTR_SKI
0e40: 50 5f 54 48 49 53 5f 46 4c 41 47 20 20 20 30 78  P_THIS_FLAG   0x
0e50: 30 30 30 34 0a 0a 0a 23 69 66 6e 64 65 66 20 4c  0004...#ifndef L
0e60: 53 4d 5f 53 45 47 4d 45 4e 54 50 54 52 5f 46 52  SM_SEGMENTPTR_FR
0e70: 45 45 5f 54 48 52 45 53 48 4f 4c 44 0a 23 20 64  EE_THRESHOLD.# d
0e80: 65 66 69 6e 65 20 4c 53 4d 5f 53 45 47 4d 45 4e  efine LSM_SEGMEN
0e90: 54 50 54 52 5f 46 52 45 45 5f 54 48 52 45 53 48  TPTR_FREE_THRESH
0ea0: 4f 4c 44 20 31 30 32 34 0a 23 65 6e 64 69 66 0a  OLD 1024.#endif.
0eb0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0ec0: 53 65 67 6d 65 6e 74 50 74 72 20 53 65 67 6d 65  SegmentPtr Segme
0ed0: 6e 74 50 74 72 3b 0a 74 79 70 65 64 65 66 20 73  ntPtr;.typedef s
0ee0: 74 72 75 63 74 20 42 6c 6f 62 20 42 6c 6f 62 3b  truct Blob Blob;
0ef0: 0a 0a 73 74 72 75 63 74 20 42 6c 6f 62 20 7b 0a  ..struct Blob {.
0f00: 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 3b    lsm_env *pEnv;
0f10: 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a  .  void *pData;.
0f20: 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 69    int nData;.  i
0f30: 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f  nt nAlloc;.};../
0f40: 2a 0a 2a 2a 20 41 20 53 65 67 6d 65 6e 74 50 74  *.** A SegmentPt
0f50: 72 20 6f 62 6a 65 63 74 20 6d 61 79 20 62 65 20  r object may be 
0f60: 75 73 65 64 20 66 6f 72 20 6f 6e 65 20 6f 66 20  used for one of 
0f70: 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a  two purposes:.**
0f80: 0a 2a 2a 20 20 20 2a 20 54 6f 20 69 74 65 72 61  .**   * To itera
0f90: 74 65 20 61 6e 64 2f 6f 72 20 73 65 65 6b 20 77  te and/or seek w
0fa0: 69 74 68 69 6e 20 61 20 73 69 6e 67 6c 65 20 53  ithin a single S
0fb0: 65 67 6d 65 6e 74 20 28 74 68 65 20 63 6f 6d 62  egment (the comb
0fc0: 69 6e 61 74 69 6f 6e 20 6f 66 20 61 20 0a 2a 2a  ination of a .**
0fd0: 20 20 20 20 20 6d 61 69 6e 20 72 75 6e 20 61 6e       main run an
0fe0: 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 73 6f  d an optional so
0ff0: 72 74 65 64 20 72 75 6e 29 2e 0a 2a 2a 0a 2a 2a  rted run)..**.**
1000: 20 20 20 2a 20 54 6f 20 69 74 65 72 61 74 65 20     * To iterate 
1010: 74 68 72 6f 75 67 68 20 74 68 65 20 73 65 70 61  through the sepa
1020: 72 61 74 6f 72 73 20 61 72 72 61 79 20 6f 66 20  rators array of 
1030: 61 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  a segment..*/.st
1040: 72 75 63 74 20 53 65 67 6d 65 6e 74 50 74 72 20  ruct SegmentPtr 
1050: 7b 0a 20 20 4c 65 76 65 6c 20 2a 70 4c 65 76 65  {.  Level *pLeve
1060: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1070: 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 62 6a 65 63    /* Level objec
1080: 74 20 73 65 67 6d 65 6e 74 20 69 73 20 70 61 72  t segment is par
1090: 74 20 6f 66 20 2a 2f 0a 20 20 53 65 67 6d 65 6e  t of */.  Segmen
10a0: 74 20 2a 70 53 65 67 3b 20 20 20 20 20 20 20 20  t *pSeg;        
10b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
10c0: 6e 74 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a  nt to access */.
10d0: 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 70 61  .  /* Current pa
10e0: 67 65 2e 20 53 65 65 20 73 65 67 6d 65 6e 74 50  ge. See segmentP
10f0: 74 72 4c 6f 61 64 50 61 67 65 28 29 2e 20 2a 2f  trLoadPage(). */
1100: 0a 20 20 50 61 67 65 20 2a 70 50 67 3b 20 20 20  .  Page *pPg;   
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1120: 20 2f 2a 20 43 75 72 72 65 6e 74 20 70 61 67 65   /* Current page
1130: 20 2a 2f 0a 20 20 75 31 36 20 66 6c 61 67 73 3b   */.  u16 flags;
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
1160: 61 67 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  age flags field 
1170: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1190: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11a0: 63 65 6c 6c 73 20 6f 6e 20 70 50 67 20 2a 2f 0a  cells on pPg */.
11b0: 20 20 50 67 6e 6f 20 69 50 74 72 3b 20 20 20 20    Pgno iPtr;    
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d0: 2f 2a 20 42 61 73 65 20 63 61 73 63 61 64 65 20  /* Base cascade 
11e0: 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a  pointer */..  /*
11f0: 20 43 75 72 72 65 6e 74 20 63 65 6c 6c 2e 20 53   Current cell. S
1200: 65 65 20 73 65 67 6d 65 6e 74 50 74 72 4c 6f 61  ee segmentPtrLoa
1210: 64 43 65 6c 6c 28 29 20 2a 2f 0a 20 20 69 6e 74  dCell() */.  int
1220: 20 69 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   iCell;         
1230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1240: 72 72 65 6e 74 20 72 65 63 6f 72 64 20 77 69 74  rrent record wit
1250: 68 69 6e 20 70 61 67 65 20 70 50 67 20 2a 2f 0a  hin page pPg */.
1260: 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20    int eType;    
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1280: 2f 2a 20 54 79 70 65 20 6f 66 20 63 75 72 72 65  /* Type of curre
1290: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 50  nt record */.  P
12a0: 67 6e 6f 20 69 50 67 50 74 72 3b 20 20 20 20 20  gno iPgPtr;     
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12c0: 43 61 73 63 61 64 65 20 70 6f 69 6e 74 65 72 20  Cascade pointer 
12d0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 76 6f 69 64  offset */.  void
12e0: 20 2a 70 4b 65 79 3b 20 69 6e 74 20 6e 4b 65 79   *pKey; int nKey
12f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79  ;         /* Key
1300: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1310: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20   current record 
1320: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 56 61 6c 3b  */.  void *pVal;
1330: 20 69 6e 74 20 6e 56 61 6c 3b 20 20 20 20 20 20   int nVal;      
1340: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 65     /* Current re
1350: 63 6f 72 64 20 76 61 6c 75 65 20 28 65 54 79 70  cord value (eTyp
1360: 65 3d 3d 57 52 49 54 45 20 6f 6e 6c 79 29 20 2a  e==WRITE only) *
1370: 2f 0a 0a 20 20 2f 2a 20 42 6c 6f 62 73 20 75 73  /..  /* Blobs us
1380: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 62  ed to allocate b
1390: 75 66 66 65 72 73 20 66 6f 72 20 70 4b 65 79 20  uffers for pKey 
13a0: 61 6e 64 20 70 56 61 6c 20 61 73 20 72 65 71 75  and pVal as requ
13b0: 69 72 65 64 20 2a 2f 0a 20 20 42 6c 6f 62 20 62  ired */.  Blob b
13c0: 6c 6f 62 31 3b 0a 20 20 42 6c 6f 62 20 62 6c 6f  lob1;.  Blob blo
13d0: 62 32 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73  b2;.};../*.** Us
13e0: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
13f0: 72 6f 75 67 68 20 74 68 65 20 6b 65 79 73 20 73  rough the keys s
1400: 74 6f 72 65 64 20 69 6e 20 61 20 62 2d 74 72 65  tored in a b-tre
1410: 65 20 68 69 65 72 61 72 63 68 79 20 66 72 6f 6d  e hierarchy from
1420: 20 73 74 61 72 74 0a 2a 2a 20 74 6f 20 66 69 6e   start.** to fin
1430: 69 73 68 2e 20 4f 6e 6c 79 20 46 69 72 73 74 28  ish. Only First(
1440: 29 20 61 6e 64 20 4e 65 78 74 28 29 20 6f 70 65  ) and Next() ope
1450: 72 61 74 69 6f 6e 73 20 61 72 65 20 72 65 71 75  rations are requ
1460: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 74  ired..**.**   bt
1470: 72 65 65 43 75 72 73 6f 72 4e 65 77 28 29 0a 2a  reeCursorNew().*
1480: 2a 20 20 20 62 74 72 65 65 43 75 72 73 6f 72 46  *   btreeCursorF
1490: 69 72 73 74 28 29 0a 2a 2a 20 20 20 62 74 72 65  irst().**   btre
14a0: 65 43 75 72 73 6f 72 4e 65 78 74 28 29 0a 2a 2a  eCursorNext().**
14b0: 20 20 20 62 74 72 65 65 43 75 72 73 6f 72 46 72     btreeCursorFr
14c0: 65 65 28 29 0a 2a 2a 20 20 20 62 74 72 65 65 43  ee().**   btreeC
14d0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a  ursorPosition().
14e0: 2a 2a 20 20 20 62 74 72 65 65 43 75 72 73 6f 72  **   btreeCursor
14f0: 52 65 73 74 6f 72 65 28 29 0a 2a 2f 0a 74 79 70  Restore().*/.typ
1500: 65 64 65 66 20 73 74 72 75 63 74 20 42 74 72 65  edef struct Btre
1510: 65 50 67 20 42 74 72 65 65 50 67 3b 0a 74 79 70  ePg BtreePg;.typ
1520: 65 64 65 66 20 73 74 72 75 63 74 20 42 74 72 65  edef struct Btre
1530: 65 43 75 72 73 6f 72 20 42 74 72 65 65 43 75 72  eCursor BtreeCur
1540: 73 6f 72 3b 0a 73 74 72 75 63 74 20 42 74 72 65  sor;.struct Btre
1550: 65 50 67 20 7b 0a 20 20 50 61 67 65 20 2a 70 50  ePg {.  Page *pP
1560: 61 67 65 3b 0a 20 20 69 6e 74 20 69 43 65 6c 6c  age;.  int iCell
1570: 3b 0a 7d 3b 0a 73 74 72 75 63 74 20 42 74 72 65  ;.};.struct Btre
1580: 65 43 75 72 73 6f 72 20 7b 0a 20 20 53 65 67 6d  eCursor {.  Segm
1590: 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 20  ent *pSeg;      
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15b0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
15c0: 68 69 73 20 73 65 67 6d 65 6e 74 73 20 62 74 72  his segments btr
15d0: 65 65 20 2a 2f 0a 20 20 46 69 6c 65 53 79 73 74  ee */.  FileSyst
15e0: 65 6d 20 2a 70 46 53 3b 20 20 20 20 20 20 20 20  em *pFS;        
15f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1600: 73 79 73 74 65 6d 20 74 6f 20 72 65 61 64 20 70  system to read p
1610: 61 67 65 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ages from */.  i
1620: 6e 74 20 6e 44 65 70 74 68 3b 20 20 20 20 20 20  nt nDepth;      
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1640: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
1650: 20 6f 66 20 61 50 67 5b 5d 20 2a 2f 0a 20 20 69   of aPg[] */.  i
1660: 6e 74 20 69 50 67 3b 20 20 20 20 20 20 20 20 20  nt iPg;         
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1680: 2a 20 43 75 72 72 65 6e 74 20 65 6e 74 72 79 20  * Current entry 
1690: 69 6e 20 61 50 67 5b 5d 2e 20 2d 31 20 2d 3e 20  in aPg[]. -1 -> 
16a0: 45 4f 46 2e 20 2a 2f 0a 20 20 42 74 72 65 65 50  EOF. */.  BtreeP
16b0: 67 20 2a 61 50 67 3b 20 20 20 20 20 20 20 20 20  g *aPg;         
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
16d0: 65 73 20 66 72 6f 6d 20 72 6f 6f 74 20 74 6f 20  es from root to 
16e0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
16f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 61 63 68 65 20   */..  /* Cache 
1700: 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
1710: 2e 20 70 4b 65 79 3d 3d 30 20 66 6f 72 20 45 4f  . pKey==0 for EO
1720: 46 2e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4b  F. */.  void *pK
1730: 65 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a  ey;.  int nKey;.
1740: 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 50    int eType;.  P
1750: 67 6e 6f 20 69 50 74 72 3b 0a 0a 20 20 2f 2a 20  gno iPtr;..  /* 
1760: 53 74 6f 72 61 67 65 20 66 6f 72 20 6b 65 79 2c  Storage for key,
1770: 20 69 66 20 6e 6f 74 20 6c 6f 63 61 6c 20 2a 2f   if not local */
1780: 0a 20 20 42 6c 6f 62 20 62 6c 6f 62 3b 0a 7d 3b  .  Blob blob;.};
1790: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 75 72 73 6f  .../*.** A curso
17a0: 72 20 75 73 65 64 20 66 6f 72 20 6d 65 72 67 65  r used for merge
17b0: 64 20 73 65 61 72 63 68 65 73 20 6f 72 20 69 74  d searches or it
17c0: 65 72 61 74 69 6f 6e 73 20 74 68 72 6f 75 67 68  erations through
17d0: 20 75 70 20 74 6f 20 6f 6e 65 0a 2a 2a 20 54 72   up to one.** Tr
17e0: 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
17f0: 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 73   any number of s
1800: 6f 72 74 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a  orted files..**.
1810: 2a 2a 20 20 20 6c 73 6d 4d 43 75 72 73 6f 72 4e  **   lsmMCursorN
1820: 65 77 28 29 0a 2a 2a 20 20 20 6c 73 6d 4d 43 75  ew().**   lsmMCu
1830: 72 73 6f 72 53 65 65 6b 28 29 0a 2a 2a 20 20 20  rsorSeek().**   
1840: 6c 73 6d 4d 43 75 72 73 6f 72 4e 65 78 74 28 29  lsmMCursorNext()
1850: 0a 2a 2a 20 20 20 6c 73 6d 4d 43 75 72 73 6f 72  .**   lsmMCursor
1860: 50 72 65 76 28 29 0a 2a 2a 20 20 20 6c 73 6d 4d  Prev().**   lsmM
1870: 43 75 72 73 6f 72 46 69 72 73 74 28 29 0a 2a 2a  CursorFirst().**
1880: 20 20 20 6c 73 6d 4d 43 75 72 73 6f 72 4c 61 73     lsmMCursorLas
1890: 74 28 29 0a 2a 2a 20 20 20 6c 73 6d 4d 43 75 72  t().**   lsmMCur
18a0: 73 6f 72 4b 65 79 28 29 0a 2a 2a 20 20 20 6c 73  sorKey().**   ls
18b0: 6d 4d 43 75 72 73 6f 72 56 61 6c 75 65 28 29 0a  mMCursorValue().
18c0: 2a 2a 20 20 20 6c 73 6d 4d 43 75 72 73 6f 72 56  **   lsmMCursorV
18d0: 61 6c 69 64 28 29 0a 2a 2a 0a 2a 2a 20 69 46 72  alid().**.** iFr
18e0: 65 65 3a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61  ee:.**   This va
18f0: 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79 20 75  riable is only u
1900: 73 65 64 20 62 79 20 63 75 72 73 6f 72 73 20 70  sed by cursors p
1910: 72 6f 76 69 64 69 6e 67 20 69 6e 70 75 74 20 64  roviding input d
1920: 61 74 61 20 66 6f 72 20 61 0a 2a 2a 20 20 20 6e  ata for a.**   n
1930: 65 77 20 74 6f 70 2d 6c 65 76 65 6c 20 73 65 67  ew top-level seg
1940: 6d 65 6e 74 2e 20 53 75 63 68 20 63 75 72 73 6f  ment. Such curso
1950: 72 73 20 6f 6e 6c 79 20 65 76 65 72 20 69 74 65  rs only ever ite
1960: 72 61 74 65 20 66 6f 72 77 61 72 64 73 2c 20 6e  rate forwards, n
1970: 6f 74 0a 2a 2a 20 20 20 62 61 63 6b 77 61 72 64  ot.**   backward
1980: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4d 75 6c  s..*/.struct Mul
1990: 74 69 43 75 72 73 6f 72 20 7b 0a 20 20 6c 73 6d  tiCursor {.  lsm
19a0: 5f 64 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20  _db *pDb;       
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19c0: 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  Connection that 
19d0: 6f 77 6e 73 20 74 68 69 73 20 63 75 72 73 6f 72  owns this cursor
19e0: 20 2a 2f 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f   */.  MultiCurso
19f0: 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  r *pNext;       
1a00: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 75        /* Next cu
1a10: 72 73 6f 72 20 6f 77 6e 65 64 20 62 79 20 63 6f  rsor owned by co
1a20: 6e 6e 65 63 74 69 6f 6e 20 70 44 62 20 2a 2f 0a  nnection pDb */.
1a30: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 43 55 52    /* Mask of CUR
1a60: 53 4f 52 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  SOR_XXX flags */
1a70: 0a 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 20 20  ..  int eType;  
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 6f 66 20      /* Cache of 
1aa0: 63 75 72 72 65 6e 74 20 6b 65 79 20 74 79 70 65  current key type
1ab0: 20 2a 2f 0a 20 20 42 6c 6f 62 20 6b 65 79 3b 20   */.  Blob key; 
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 6f        /* Cache o
1ae0: 66 20 63 75 72 72 65 6e 74 20 6b 65 79 20 28 6f  f current key (o
1af0: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 42 6c 6f  r NULL) */.  Blo
1b00: 62 20 76 61 6c 3b 20 20 20 20 20 20 20 20 20 20  b val;          
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b20: 43 61 63 68 65 20 6f 66 20 63 75 72 72 65 6e 74  Cache of current
1b30: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20   value */..  /* 
1b40: 41 6c 6c 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e  All the componen
1b50: 74 20 63 75 72 73 6f 72 73 3a 20 2a 2f 0a 20 20  t cursors: */.  
1b60: 54 72 65 65 43 75 72 73 6f 72 20 2a 61 70 54 72  TreeCursor *apTr
1b70: 65 65 43 73 72 5b 32 5d 3b 20 20 20 20 20 20 20  eeCsr[2];       
1b80: 2f 2a 20 55 70 20 74 6f 20 74 77 6f 20 74 72 65  /* Up to two tre
1b90: 65 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 69  e cursors */.  i
1ba0: 6e 74 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  nt iFree;       
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bc0: 2a 20 4e 65 78 74 20 65 6c 65 6d 65 6e 74 20 6f  * Next element o
1bd0: 66 20 66 72 65 65 2d 6c 69 73 74 20 28 2d 76 65  f free-list (-ve
1be0: 20 66 6f 72 20 65 6f 66 29 20 2a 2f 0a 20 20 53   for eof) */.  S
1bf0: 65 67 6d 65 6e 74 50 74 72 20 2a 61 50 74 72 3b  egmentPtr *aPtr;
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c10: 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d 65  * Array of segme
1c20: 6e 74 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0a 20  nt pointers */. 
1c30: 20 69 6e 74 20 6e 50 74 72 3b 20 20 20 20 20 20   int nPtr;      
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61   /* Size of arra
1c60: 79 20 61 50 74 72 5b 5d 20 2a 2f 0a 20 20 42 74  y aPtr[] */.  Bt
1c70: 72 65 65 43 75 72 73 6f 72 20 2a 70 42 74 43 73  reeCursor *pBtCs
1c80: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
1c90: 20 62 2d 74 72 65 65 20 63 75 72 73 6f 72 20 28   b-tree cursor (
1ca0: 64 62 20 77 72 69 74 65 73 20 6f 6e 6c 79 29 20  db writes only) 
1cb0: 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 61 72 69  */..  /* Compari
1cc0: 73 6f 6e 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  son results */. 
1cd0: 20 69 6e 74 20 6e 54 72 65 65 3b 20 20 20 20 20   int nTree;     
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 54 72 65   /* Size of aTre
1d00: 65 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  e[] array */.  i
1d10: 6e 74 20 2a 61 54 72 65 65 3b 20 20 20 20 20 20  nt *aTree;      
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d30: 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6d 70 61  * Array of compa
1d40: 72 69 73 6f 6e 20 72 65 73 75 6c 74 73 20 2a 2f  rison results */
1d50: 0a 0a 20 20 2f 2a 20 55 73 65 64 20 62 79 20 63  ..  /* Used by c
1d60: 75 72 73 6f 72 73 20 66 6c 75 73 68 69 6e 67 20  ursors flushing 
1d70: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72  the in-memory tr
1d80: 65 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 76 6f 69  ee only */.  voi
1d90: 64 20 2a 70 53 79 73 74 65 6d 56 61 6c 3b 20 20  d *pSystemVal;  
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db0: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
1dc0: 72 20 74 6f 20 66 72 65 65 20 2a 2f 0a 0a 20 20  r to free */..  
1dd0: 2f 2a 20 55 73 65 64 20 62 79 20 77 6f 72 6b 65  /* Used by worke
1de0: 72 20 63 75 72 73 6f 72 73 20 6f 6e 6c 79 20 2a  r cursors only *
1df0: 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 72 65 76 4d  /.  Pgno *pPrevM
1e00: 65 72 67 65 50 74 72 3b 0a 7d 3b 0a 0a 2f 2a 0a  ergePtr;.};../*.
1e10: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1e20: 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 75   constants are u
1e30: 73 65 64 20 74 6f 20 61 73 73 69 67 6e 20 69 6e  sed to assign in
1e40: 74 65 67 65 72 73 20 74 6f 20 65 61 63 68 20 63  tegers to each c
1e50: 6f 6d 70 6f 6e 65 6e 74 0a 2a 2a 20 63 75 72 73  omponent.** curs
1e60: 6f 72 20 6f 66 20 61 20 6d 75 6c 74 69 2d 63 75  or of a multi-cu
1e70: 72 73 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rsor..*/.#define
1e80: 20 43 55 52 53 4f 52 5f 44 41 54 41 5f 54 52 45   CURSOR_DATA_TRE
1e90: 45 30 20 20 20 20 20 30 20 20 20 2f 2a 20 43 75  E0     0   /* Cu
1ea0: 72 72 65 6e 74 20 74 72 65 65 20 63 75 72 73 6f  rrent tree curso
1eb0: 72 20 28 61 70 54 72 65 65 43 73 72 5b 30 5d 29  r (apTreeCsr[0])
1ec0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 55 52 53   */.#define CURS
1ed0: 4f 52 5f 44 41 54 41 5f 54 52 45 45 31 20 20 20  OR_DATA_TREE1   
1ee0: 20 20 31 20 20 20 2f 2a 20 54 68 65 20 22 6f 6c    1   /* The "ol
1ef0: 64 22 20 74 72 65 65 2c 20 69 66 20 61 6e 79 20  d" tree, if any 
1f00: 28 61 70 54 72 65 65 43 73 72 5b 31 5d 29 20 2a  (apTreeCsr[1]) *
1f10: 2f 0a 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52  /.#define CURSOR
1f20: 5f 44 41 54 41 5f 53 59 53 54 45 4d 20 20 20 20  _DATA_SYSTEM    
1f30: 32 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74  2   /* Free-list
1f40: 20 65 6e 74 72 69 65 73 20 28 6e 65 77 2d 74 6f   entries (new-to
1f50: 70 6c 65 76 65 6c 20 6f 6e 6c 79 29 20 2a 2f 0a  plevel only) */.
1f60: 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52 5f 44  #define CURSOR_D
1f70: 41 54 41 5f 53 45 47 4d 45 4e 54 20 20 20 33 20  ATA_SEGMENT   3 
1f80: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 67 6d 65    /* First segme
1f90: 6e 74 20 70 6f 69 6e 74 65 72 20 28 61 50 74 72  nt pointer (aPtr
1fa0: 5b 30 5d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  [0]) */../*.** C
1fb0: 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 44 45 4c  URSOR_IGNORE_DEL
1fc0: 45 54 45 0a 2a 2a 20 20 20 49 66 20 73 65 74 2c  ETE.**   If set,
1fd0: 20 74 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c   this cursor wil
1fe0: 6c 20 6e 6f 74 20 76 69 73 69 74 20 53 4f 52 54  l not visit SORT
1ff0: 45 44 5f 44 45 4c 45 54 45 20 6b 65 79 73 2e 0a  ED_DELETE keys..
2000: 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 46 4c 55  **.** CURSOR_FLU
2010: 53 48 5f 46 52 45 45 4c 49 53 54 0a 2a 2a 20 20  SH_FREELIST.**  
2020: 20 54 68 69 73 20 63 75 72 73 6f 72 20 69 73 20   This cursor is 
2030: 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 63 72  being used to cr
2040: 65 61 74 65 20 61 20 6e 65 77 20 74 6f 70 6c 65  eate a new tople
2050: 76 65 6c 2e 20 49 74 20 73 68 6f 75 6c 64 20 61  vel. It should a
2060: 6c 73 6f 20 0a 2a 2a 20 20 20 69 74 65 72 61 74  lso .**   iterat
2070: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  e through the co
2080: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e  ntents of the in
2090: 2d 6d 65 6d 6f 72 79 20 66 72 65 65 20 62 6c 6f  -memory free blo
20a0: 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 43  ck list..**.** C
20b0: 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 53 59 53  URSOR_IGNORE_SYS
20c0: 54 45 4d 0a 2a 2a 20 20 20 49 66 20 73 65 74 2c  TEM.**   If set,
20d0: 20 74 68 69 73 20 63 75 72 73 6f 72 20 69 67 6e   this cursor ign
20e0: 6f 72 65 73 20 73 79 73 74 65 6d 20 6b 65 79 73  ores system keys
20f0: 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52 5f 4e  ..**.** CURSOR_N
2100: 45 58 54 5f 4f 4b 0a 2a 2a 20 20 20 53 65 74 20  EXT_OK.**   Set 
2110: 69 66 20 69 74 20 69 73 20 4f 6b 20 74 6f 20 63  if it is Ok to c
2120: 61 6c 6c 20 6c 73 6d 5f 63 73 72 5f 6e 65 78 74  all lsm_csr_next
2130: 28 29 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53 4f 52  ()..**.** CURSOR
2140: 5f 50 52 45 56 5f 4f 4b 0a 2a 2a 20 20 20 53 65  _PREV_OK.**   Se
2150: 74 20 69 66 20 69 74 20 69 73 20 4f 6b 20 74 6f  t if it is Ok to
2160: 20 63 61 6c 6c 20 6c 73 6d 5f 63 73 72 5f 70 72   call lsm_csr_pr
2170: 65 76 28 29 2e 0a 2a 2a 0a 2a 2a 20 43 55 52 53  ev()..**.** CURS
2180: 4f 52 5f 52 45 41 44 5f 53 45 50 41 52 41 54 4f  OR_READ_SEPARATO
2190: 52 53 0a 2a 2a 20 20 20 53 65 74 20 69 66 20 74  RS.**   Set if t
21a0: 68 69 73 20 63 75 72 73 6f 72 20 73 68 6f 75 6c  his cursor shoul
21b0: 64 20 76 69 73 69 74 20 74 68 65 20 73 65 70 61  d visit the sepa
21c0: 72 61 74 6f 72 20 6b 65 79 73 20 69 6e 20 73 65  rator keys in se
21d0: 67 6d 65 6e 74 20 0a 2a 2a 20 20 20 61 50 74 72  gment .**   aPtr
21e0: 5b 6e 50 74 72 2d 31 5d 2e 0a 2a 2a 0a 2a 2a 20  [nPtr-1]..**.** 
21f0: 43 55 52 53 4f 52 5f 53 45 45 4b 5f 45 51 0a 2a  CURSOR_SEEK_EQ.*
2200: 2a 20 20 20 43 75 72 73 6f 72 20 68 61 73 20 75  *   Cursor has u
2210: 6e 64 65 72 67 6f 6e 65 20 61 20 73 75 63 63 65  ndergone a succe
2220: 73 73 66 75 6c 20 6c 73 6d 5f 63 73 72 5f 73 65  ssful lsm_csr_se
2230: 65 6b 28 4c 53 4d 5f 53 45 45 4b 5f 45 51 29 20  ek(LSM_SEEK_EQ) 
2240: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 20 20  operation..**   
2250: 54 68 65 20 6b 65 79 20 61 6e 64 20 76 61 6c 75  The key and valu
2260: 65 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  e are stored in 
2270: 4d 75 6c 74 69 43 75 72 73 6f 72 2e 6b 65 79 20  MultiCursor.key 
2280: 61 6e 64 20 4d 75 6c 74 69 43 75 72 73 6f 72 2e  and MultiCursor.
2290: 76 61 6c 0a 2a 2a 20 20 20 72 65 73 70 65 63 74  val.**   respect
22a0: 69 76 65 6c 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ively..*/.#defin
22b0: 65 20 43 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f  e CURSOR_IGNORE_
22c0: 44 45 4c 45 54 45 20 20 20 20 30 78 30 30 30 30  DELETE    0x0000
22d0: 30 30 30 31 0a 23 64 65 66 69 6e 65 20 43 55 52  0001.#define CUR
22e0: 53 4f 52 5f 46 4c 55 53 48 5f 46 52 45 45 4c 49  SOR_FLUSH_FREELI
22f0: 53 54 20 20 20 30 78 30 30 30 30 30 30 30 32 0a  ST   0x00000002.
2300: 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52 5f 49  #define CURSOR_I
2310: 47 4e 4f 52 45 5f 53 59 53 54 45 4d 20 20 20 20  GNORE_SYSTEM    
2320: 30 78 30 30 30 30 30 30 31 30 0a 23 64 65 66 69  0x00000010.#defi
2330: 6e 65 20 43 55 52 53 4f 52 5f 4e 45 58 54 5f 4f  ne CURSOR_NEXT_O
2340: 4b 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30  K          0x000
2350: 30 30 30 32 30 0a 23 64 65 66 69 6e 65 20 43 55  00020.#define CU
2360: 52 53 4f 52 5f 50 52 45 56 5f 4f 4b 20 20 20 20  RSOR_PREV_OK    
2370: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 34 30        0x00000040
2380: 0a 23 64 65 66 69 6e 65 20 43 55 52 53 4f 52 5f  .#define CURSOR_
2390: 52 45 41 44 5f 53 45 50 41 52 41 54 4f 52 53 20  READ_SEPARATORS 
23a0: 20 30 78 30 30 30 30 30 30 38 30 0a 23 64 65 66   0x00000080.#def
23b0: 69 6e 65 20 43 55 52 53 4f 52 5f 53 45 45 4b 5f  ine CURSOR_SEEK_
23c0: 45 51 20 20 20 20 20 20 20 20 20 20 30 78 30 30  EQ          0x00
23d0: 30 30 30 31 30 30 0a 0a 74 79 70 65 64 65 66 20  000100..typedef 
23e0: 73 74 72 75 63 74 20 4d 65 72 67 65 57 6f 72 6b  struct MergeWork
23f0: 65 72 20 4d 65 72 67 65 57 6f 72 6b 65 72 3b 0a  er MergeWorker;.
2400: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 48  typedef struct H
2410: 69 65 72 61 72 63 68 79 20 48 69 65 72 61 72 63  ierarchy Hierarc
2420: 68 79 3b 0a 0a 73 74 72 75 63 74 20 48 69 65 72  hy;..struct Hier
2430: 61 72 63 68 79 20 7b 0a 20 20 50 61 67 65 20 2a  archy {.  Page *
2440: 2a 61 70 48 69 65 72 3b 0a 20 20 69 6e 74 20 6e  *apHier;.  int n
2450: 48 69 65 72 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  Hier;.};../*.** 
2460: 61 53 61 76 65 3a 0a 2a 2a 20 20 20 57 68 65 6e  aSave:.**   When
2470: 20 6d 65 72 67 65 57 6f 72 6b 65 72 4e 65 78 74   mergeWorkerNext
2480: 50 61 67 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Page() is called
2490: 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 74   to advance to t
24a0: 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 0a  he next page in.
24b0: 2a 2a 20 20 20 74 68 65 20 6f 75 74 70 75 74 20  **   the output 
24c0: 73 65 67 6d 65 6e 74 2c 20 69 66 20 74 68 65 20  segment, if the 
24d0: 62 53 74 6f 72 65 20 66 6c 61 67 20 66 6f 72 20  bStore flag for 
24e0: 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 53  an element of aS
24f0: 61 76 65 5b 5d 20 69 73 0a 2a 2a 20 20 20 74 72  ave[] is.**   tr
2500: 75 65 2c 20 69 74 20 69 73 20 63 6c 65 61 72 65  ue, it is cleare
2510: 64 20 61 6e 64 20 74 68 65 20 63 6f 72 72 65 73  d and the corres
2520: 70 6f 6e 64 69 6e 67 20 69 50 67 6e 6f 20 76 61  ponding iPgno va
2530: 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  lue is set to th
2540: 65 20 0a 2a 2a 20 20 20 70 61 67 65 20 6e 75 6d  e .**   page num
2550: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
2560: 6a 75 73 74 20 63 6f 6d 70 6c 65 74 65 64 2e 0a  just completed..
2570: 2a 2a 0a 2a 2a 20 20 20 61 53 61 76 65 5b 30 5d  **.**   aSave[0]
2580: 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f   is used to reco
2590: 72 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 76  rd the pointer v
25a0: 61 6c 75 65 20 74 6f 20 62 65 20 70 75 73 68 65  alue to be pushe
25b0: 64 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20  d into the.**   
25c0: 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79  b-tree hierarchy
25d0: 2e 20 61 53 61 76 65 5b 31 5d 20 69 73 20 75 73  . aSave[1] is us
25e0: 65 64 20 74 6f 20 73 61 76 65 20 74 68 65 20 70  ed to save the p
25f0: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2600: 65 0a 2a 2a 20 20 20 70 61 67 65 20 63 6f 6e 74  e.**   page cont
2610: 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 69 72  aining the indir
2620: 65 63 74 20 6b 65 79 20 6d 6f 73 74 20 72 65 63  ect key most rec
2630: 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 74 6f  ently written to
2640: 20 74 68 65 20 62 2d 74 72 65 65 2e 0a 2a 2a 20   the b-tree..** 
2650: 20 20 73 65 65 20 6d 65 72 67 65 57 6f 72 6b 65    see mergeWorke
2660: 72 50 75 73 68 48 69 65 72 61 72 63 68 79 28 29  rPushHierarchy()
2670: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
2680: 0a 73 74 72 75 63 74 20 4d 65 72 67 65 57 6f 72  .struct MergeWor
2690: 6b 65 72 20 7b 0a 20 20 6c 73 6d 5f 64 62 20 2a  ker {.  lsm_db *
26a0: 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
26b0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
26c0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
26d0: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 2f 2a 20 57 6f 72 6b 65 72 20 73 6e 61 70 73 68  /* Worker snapsh
2700: 6f 74 20 4c 65 76 65 6c 20 62 65 69 6e 67 20 6d  ot Level being m
2710: 65 72 67 65 64 20 2a 2f 0a 20 20 4d 75 6c 74 69  erged */.  Multi
2720: 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 20 20 20  Cursor *pCsr;   
2730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2740: 72 73 6f 72 20 74 6f 20 72 65 61 64 20 6e 65 77  rsor to read new
2750: 20 73 65 67 6d 65 6e 74 20 63 6f 6e 74 65 6e 74   segment content
2760: 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  s from */.  int 
2770: 62 46 6c 75 73 68 3b 20 20 20 20 20 20 20 20 20  bFlush;         
2780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2790: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
27a0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65  n in-memory tree
27b0: 20 66 6c 75 73 68 20 2a 2f 0a 20 20 48 69 65 72   flush */.  Hier
27c0: 61 72 63 68 79 20 68 69 65 72 3b 20 20 20 20 20  archy hier;     
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
27e0: 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
27f0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
2800: 6f 6e 20 2a 2f 0a 20 20 50 61 67 65 20 2a 70 50  on */.  Page *pP
2810: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2820: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
2830: 6e 74 20 6f 75 74 70 75 74 20 70 61 67 65 20 2a  nt output page *
2840: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20  /.  int nWork;  
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2860: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2870: 20 63 61 6c 6c 73 20 74 6f 20 6d 65 72 67 65 57   calls to mergeW
2880: 6f 72 6b 65 72 4e 65 78 74 50 61 67 65 28 29 20  orkerNextPage() 
2890: 2a 2f 0a 20 20 50 67 6e 6f 20 2a 61 47 6f 62 62  */.  Pgno *aGobb
28a0: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
28b0: 20 20 20 20 20 2f 2a 20 47 6f 62 62 6c 65 20 70       /* Gobble p
28c0: 6f 69 6e 74 20 66 6f 72 20 65 61 63 68 20 69 6e  oint for each in
28d0: 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a  put segment */..
28e0: 20 20 50 67 6e 6f 20 69 49 6e 64 69 72 65 63 74    Pgno iIndirect
28f0: 3b 0a 20 20 73 74 72 75 63 74 20 53 61 76 65 64  ;.  struct Saved
2900: 50 67 6e 6f 20 7b 0a 20 20 20 20 50 67 6e 6f 20  Pgno {.    Pgno 
2910: 69 50 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 62  iPgno;.    int b
2920: 53 74 6f 72 65 3b 0a 20 20 7d 20 61 53 61 76 65  Store;.  } aSave
2930: 5b 32 5d 3b 0a 7d 3b 0a 0a 23 69 66 64 65 66 20  [2];.};..#ifdef 
2940: 4c 53 4d 5f 44 45 42 55 47 5f 45 58 50 45 4e 53  LSM_DEBUG_EXPENS
2950: 49 56 45 0a 73 74 61 74 69 63 20 69 6e 74 20 61  IVE.static int a
2960: 73 73 65 72 74 50 6f 69 6e 74 65 72 73 4f 6b 28  ssertPointersOk(
2970: 6c 73 6d 5f 64 62 20 2a 2c 20 53 65 67 6d 65 6e  lsm_db *, Segmen
2980: 74 20 2a 2c 20 53 65 67 6d 65 6e 74 20 2a 2c 20  t *, Segment *, 
2990: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
29a0: 20 61 73 73 65 72 74 42 74 72 65 65 4f 6b 28 6c   assertBtreeOk(l
29b0: 73 6d 5f 64 62 20 2a 2c 20 53 65 67 6d 65 6e 74  sm_db *, Segment
29c0: 20 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64   *);.static void
29d0: 20 61 73 73 65 72 74 52 75 6e 49 6e 4f 72 64 65   assertRunInOrde
29e0: 72 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 53  r(lsm_db *pDb, S
29f0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 29 3b 0a 23  egment *pSeg);.#
2a00: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 61 73 73  else.#define ass
2a10: 65 72 74 52 75 6e 49 6e 4f 72 64 65 72 28 78 2c  ertRunInOrder(x,
2a20: 79 29 0a 23 64 65 66 69 6e 65 20 61 73 73 65 72  y).#define asser
2a30: 74 42 74 72 65 65 4f 6b 28 78 2c 79 29 0a 23 65  tBtreeOk(x,y).#e
2a40: 6e 64 69 66 0a 0a 0a 73 74 72 75 63 74 20 46 69  ndif...struct Fi
2a50: 6c 65 50 61 67 65 20 7b 20 75 38 20 2a 61 44 61  lePage { u8 *aDa
2a60: 74 61 3b 20 69 6e 74 20 6e 44 61 74 61 3b 20 7d  ta; int nData; }
2a70: 3b 0a 73 74 61 74 69 63 20 75 38 20 2a 66 73 50  ;.static u8 *fsP
2a80: 61 67 65 44 61 74 61 28 50 61 67 65 20 2a 70 50  ageData(Page *pP
2a90: 67 2c 20 69 6e 74 20 2a 70 6e 44 61 74 61 29 7b  g, int *pnData){
2aa0: 0a 20 20 2a 70 6e 44 61 74 61 20 3d 20 28 28 73  .  *pnData = ((s
2ab0: 74 72 75 63 74 20 46 69 6c 65 50 61 67 65 20 2a  truct FilePage *
2ac0: 29 28 70 50 67 29 29 2d 3e 6e 44 61 74 61 3b 0a  )(pPg))->nData;.
2ad0: 20 20 72 65 74 75 72 6e 20 28 28 73 74 72 75 63    return ((struc
2ae0: 74 20 46 69 6c 65 50 61 67 65 20 2a 29 28 70 50  t FilePage *)(pP
2af0: 67 29 29 2d 3e 61 44 61 74 61 3b 0a 7d 0a 2f 2a  g))->aData;.}./*
2b00: 55 4e 55 53 45 44 20 73 74 61 74 69 63 20 75 38  UNUSED static u8
2b10: 20 2a 66 73 50 61 67 65 44 61 74 61 50 74 72 28   *fsPageDataPtr(
2b20: 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
2b30: 74 75 72 6e 20 28 28 73 74 72 75 63 74 20 46 69  turn ((struct Fi
2b40: 6c 65 50 61 67 65 20 2a 29 28 70 50 67 29 29 2d  lePage *)(pPg))-
2b50: 3e 61 44 61 74 61 3b 0a 7d 2a 2f 0a 0a 2f 2a 0a  >aData;.}*/../*.
2b60: 2a 2a 20 57 72 69 74 65 20 6e 56 61 6c 20 61 73  ** Write nVal as
2b70: 20 61 20 31 36 2d 62 69 74 20 75 6e 73 69 67 6e   a 16-bit unsign
2b80: 65 64 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  ed big-endian in
2b90: 74 65 67 65 72 20 69 6e 74 6f 20 62 75 66 66 65  teger into buffe
2ba0: 72 20 61 4f 75 74 2e 0a 2a 2f 0a 76 6f 69 64 20  r aOut..*/.void 
2bb0: 6c 73 6d 50 75 74 55 31 36 28 75 38 20 2a 61 4f  lsmPutU16(u8 *aO
2bc0: 75 74 2c 20 75 31 36 20 6e 56 61 6c 29 7b 0a 20  ut, u16 nVal){. 
2bd0: 20 61 4f 75 74 5b 30 5d 20 3d 20 28 75 38 29 28   aOut[0] = (u8)(
2be0: 28 6e 56 61 6c 3e 3e 38 29 20 26 20 30 78 46 46  (nVal>>8) & 0xFF
2bf0: 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d 20 28  );.  aOut[1] = (
2c00: 75 38 29 28 6e 56 61 6c 20 26 20 30 78 46 46 29  u8)(nVal & 0xFF)
2c10: 3b 0a 7d 0a 0a 76 6f 69 64 20 6c 73 6d 50 75 74  ;.}..void lsmPut
2c20: 55 33 32 28 75 38 20 2a 61 4f 75 74 2c 20 75 33  U32(u8 *aOut, u3
2c30: 32 20 6e 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b  2 nVal){.  aOut[
2c40: 30 5d 20 3d 20 28 75 38 29 28 28 6e 56 61 6c 3e  0] = (u8)((nVal>
2c50: 3e 32 34 29 20 26 20 30 78 46 46 29 3b 0a 20 20  >24) & 0xFF);.  
2c60: 61 4f 75 74 5b 31 5d 20 3d 20 28 75 38 29 28 28  aOut[1] = (u8)((
2c70: 6e 56 61 6c 3e 3e 31 36 29 20 26 20 30 78 46 46  nVal>>16) & 0xFF
2c80: 29 3b 0a 20 20 61 4f 75 74 5b 32 5d 20 3d 20 28  );.  aOut[2] = (
2c90: 75 38 29 28 28 6e 56 61 6c 3e 3e 20 38 29 20 26  u8)((nVal>> 8) &
2ca0: 20 30 78 46 46 29 3b 0a 20 20 61 4f 75 74 5b 33   0xFF);.  aOut[3
2cb0: 5d 20 3d 20 28 75 38 29 28 28 6e 56 61 6c 20 20  ] = (u8)((nVal  
2cc0: 20 20 29 20 26 20 30 78 46 46 29 3b 0a 7d 0a 0a    ) & 0xFF);.}..
2cd0: 69 6e 74 20 6c 73 6d 47 65 74 55 31 36 28 75 38  int lsmGetU16(u8
2ce0: 20 2a 61 4f 75 74 29 7b 0a 20 20 72 65 74 75 72   *aOut){.  retur
2cf0: 6e 20 28 61 4f 75 74 5b 30 5d 20 3c 3c 20 38 29  n (aOut[0] << 8)
2d00: 20 2b 20 61 4f 75 74 5b 31 5d 3b 0a 7d 0a 0a 75   + aOut[1];.}..u
2d10: 33 32 20 6c 73 6d 47 65 74 55 33 32 28 75 38 20  32 lsmGetU32(u8 
2d20: 2a 61 4f 75 74 29 7b 0a 20 20 72 65 74 75 72 6e  *aOut){.  return
2d30: 20 28 28 75 33 32 29 61 4f 75 74 5b 30 5d 20 3c   ((u32)aOut[0] <
2d40: 3c 20 32 34 29 20 0a 20 20 20 20 20 20 20 2b 20  < 24) .       + 
2d50: 28 28 75 33 32 29 61 4f 75 74 5b 31 5d 20 3c 3c  ((u32)aOut[1] <<
2d60: 20 31 36 29 20 0a 20 20 20 20 20 20 20 2b 20 28   16) .       + (
2d70: 28 75 33 32 29 61 4f 75 74 5b 32 5d 20 3c 3c 20  (u32)aOut[2] << 
2d80: 38 29 20 0a 20 20 20 20 20 20 20 2b 20 28 28 75  8) .       + ((u
2d90: 33 32 29 61 4f 75 74 5b 33 5d 29 3b 0a 7d 0a 0a  32)aOut[3]);.}..
2da0: 75 36 34 20 6c 73 6d 47 65 74 55 36 34 28 75 38  u64 lsmGetU64(u8
2db0: 20 2a 61 4f 75 74 29 7b 0a 20 20 72 65 74 75 72   *aOut){.  retur
2dc0: 6e 20 28 28 75 36 34 29 61 4f 75 74 5b 30 5d 20  n ((u64)aOut[0] 
2dd0: 3c 3c 20 35 36 29 20 0a 20 20 20 20 20 20 20 2b  << 56) .       +
2de0: 20 28 28 75 36 34 29 61 4f 75 74 5b 31 5d 20 3c   ((u64)aOut[1] <
2df0: 3c 20 34 38 29 20 0a 20 20 20 20 20 20 20 2b 20  < 48) .       + 
2e00: 28 28 75 36 34 29 61 4f 75 74 5b 32 5d 20 3c 3c  ((u64)aOut[2] <<
2e10: 20 34 30 29 20 0a 20 20 20 20 20 20 20 2b 20 28   40) .       + (
2e20: 28 75 36 34 29 61 4f 75 74 5b 33 5d 20 3c 3c 20  (u64)aOut[3] << 
2e30: 33 32 29 20 0a 20 20 20 20 20 20 20 2b 20 28 28  32) .       + ((
2e40: 75 36 34 29 61 4f 75 74 5b 34 5d 20 3c 3c 20 32  u64)aOut[4] << 2
2e50: 34 29 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33  4).       + ((u3
2e60: 32 29 61 4f 75 74 5b 35 5d 20 3c 3c 20 31 36 29  2)aOut[5] << 16)
2e70: 20 0a 20 20 20 20 20 20 20 2b 20 28 28 75 33 32   .       + ((u32
2e80: 29 61 4f 75 74 5b 36 5d 20 3c 3c 20 38 29 20 0a  )aOut[6] << 8) .
2e90: 20 20 20 20 20 20 20 2b 20 28 28 75 33 32 29 61         + ((u32)a
2ea0: 4f 75 74 5b 37 5d 29 3b 0a 7d 0a 0a 76 6f 69 64  Out[7]);.}..void
2eb0: 20 6c 73 6d 50 75 74 55 36 34 28 75 38 20 2a 61   lsmPutU64(u8 *a
2ec0: 4f 75 74 2c 20 75 36 34 20 6e 56 61 6c 29 7b 0a  Out, u64 nVal){.
2ed0: 20 20 61 4f 75 74 5b 30 5d 20 3d 20 28 75 38 29    aOut[0] = (u8)
2ee0: 28 28 6e 56 61 6c 3e 3e 35 36 29 20 26 20 30 78  ((nVal>>56) & 0x
2ef0: 46 46 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d  FF);.  aOut[1] =
2f00: 20 28 75 38 29 28 28 6e 56 61 6c 3e 3e 34 38 29   (u8)((nVal>>48)
2f10: 20 26 20 30 78 46 46 29 3b 0a 20 20 61 4f 75 74   & 0xFF);.  aOut
2f20: 5b 32 5d 20 3d 20 28 75 38 29 28 28 6e 56 61 6c  [2] = (u8)((nVal
2f30: 3e 3e 34 30 29 20 26 20 30 78 46 46 29 3b 0a 20  >>40) & 0xFF);. 
2f40: 20 61 4f 75 74 5b 33 5d 20 3d 20 28 75 38 29 28   aOut[3] = (u8)(
2f50: 28 6e 56 61 6c 3e 3e 33 32 29 20 26 20 30 78 46  (nVal>>32) & 0xF
2f60: 46 29 3b 0a 20 20 61 4f 75 74 5b 34 5d 20 3d 20  F);.  aOut[4] = 
2f70: 28 75 38 29 28 28 6e 56 61 6c 3e 3e 32 34 29 20  (u8)((nVal>>24) 
2f80: 26 20 30 78 46 46 29 3b 0a 20 20 61 4f 75 74 5b  & 0xFF);.  aOut[
2f90: 35 5d 20 3d 20 28 75 38 29 28 28 6e 56 61 6c 3e  5] = (u8)((nVal>
2fa0: 3e 31 36 29 20 26 20 30 78 46 46 29 3b 0a 20 20  >16) & 0xFF);.  
2fb0: 61 4f 75 74 5b 36 5d 20 3d 20 28 75 38 29 28 28  aOut[6] = (u8)((
2fc0: 6e 56 61 6c 3e 3e 20 38 29 20 26 20 30 78 46 46  nVal>> 8) & 0xFF
2fd0: 29 3b 0a 20 20 61 4f 75 74 5b 37 5d 20 3d 20 28  );.  aOut[7] = (
2fe0: 75 38 29 28 28 6e 56 61 6c 20 20 20 20 29 20 26  u8)((nVal    ) &
2ff0: 20 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69   0xFF);.}..stati
3000: 63 20 69 6e 74 20 73 6f 72 74 65 64 42 6c 6f 62  c int sortedBlob
3010: 47 72 6f 77 28 6c 73 6d 5f 65 6e 76 20 2a 70 45  Grow(lsm_env *pE
3020: 6e 76 2c 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c  nv, Blob *pBlob,
3030: 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61   int nData){.  a
3040: 73 73 65 72 74 28 20 70 42 6c 6f 62 2d 3e 70 45  ssert( pBlob->pE
3050: 6e 76 3d 3d 70 45 6e 76 20 7c 7c 20 28 70 42 6c  nv==pEnv || (pBl
3060: 6f 62 2d 3e 70 45 6e 76 3d 3d 30 20 26 26 20 70  ob->pEnv==0 && p
3070: 42 6c 6f 62 2d 3e 70 44 61 74 61 3d 3d 30 29 20  Blob->pData==0) 
3080: 29 3b 0a 20 20 69 66 28 20 70 42 6c 6f 62 2d 3e  );.  if( pBlob->
3090: 6e 41 6c 6c 6f 63 3c 6e 44 61 74 61 20 29 7b 0a  nAlloc<nData ){.
30a0: 20 20 20 20 70 42 6c 6f 62 2d 3e 70 44 61 74 61      pBlob->pData
30b0: 20 3d 20 6c 73 6d 52 65 61 6c 6c 6f 63 4f 72 46   = lsmReallocOrF
30c0: 72 65 65 28 70 45 6e 76 2c 20 70 42 6c 6f 62 2d  ree(pEnv, pBlob-
30d0: 3e 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a  >pData, nData);.
30e0: 20 20 20 20 69 66 28 20 21 70 42 6c 6f 62 2d 3e      if( !pBlob->
30f0: 70 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 4c  pData ) return L
3100: 53 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  SM_NOMEM_BKPT;. 
3110: 20 20 20 70 42 6c 6f 62 2d 3e 6e 41 6c 6c 6f 63     pBlob->nAlloc
3120: 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 42   = nData;.    pB
3130: 6c 6f 62 2d 3e 70 45 6e 76 20 3d 20 70 45 6e 76  lob->pEnv = pEnv
3140: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 4c  ;.  }.  return L
3150: 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  SM_OK;.}..static
3160: 20 69 6e 74 20 73 6f 72 74 65 64 42 6c 6f 62 53   int sortedBlobS
3170: 65 74 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76  et(lsm_env *pEnv
3180: 2c 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 2c 20 76  , Blob *pBlob, v
3190: 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
31a0: 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20 73 6f  nData){.  if( so
31b0: 72 74 65 64 42 6c 6f 62 47 72 6f 77 28 70 45 6e  rtedBlobGrow(pEn
31c0: 76 2c 20 70 42 6c 6f 62 2c 20 6e 44 61 74 61 29  v, pBlob, nData)
31d0: 20 29 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4e 4f   ) return LSM_NO
31e0: 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 42  MEM;.  memcpy(pB
31f0: 6c 6f 62 2d 3e 70 44 61 74 61 2c 20 70 44 61 74  lob->pData, pDat
3200: 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 70 42 6c  a, nData);.  pBl
3210: 6f 62 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61 74  ob->nData = nDat
3220: 61 3b 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f  a;.  return LSM_
3230: 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61  OK;.}..#if 0.sta
3240: 74 69 63 20 69 6e 74 20 73 6f 72 74 65 64 42 6c  tic int sortedBl
3250: 6f 62 43 6f 70 79 28 42 6c 6f 62 20 2a 70 44 65  obCopy(Blob *pDe
3260: 73 74 2c 20 42 6c 6f 62 20 2a 70 53 72 63 29 7b  st, Blob *pSrc){
3270: 0a 20 20 72 65 74 75 72 6e 20 73 6f 72 74 65 64  .  return sorted
3280: 42 6c 6f 62 53 65 74 28 70 44 65 73 74 2c 20 70  BlobSet(pDest, p
3290: 53 72 63 2d 3e 70 44 61 74 61 2c 20 70 53 72 63  Src->pData, pSrc
32a0: 2d 3e 6e 44 61 74 61 29 3b 0a 7d 0a 23 65 6e 64  ->nData);.}.#end
32b0: 69 66 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  if..static void 
32c0: 73 6f 72 74 65 64 42 6c 6f 62 46 72 65 65 28 42  sortedBlobFree(B
32d0: 6c 6f 62 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 61  lob *pBlob){.  a
32e0: 73 73 65 72 74 28 20 70 42 6c 6f 62 2d 3e 70 45  ssert( pBlob->pE
32f0: 6e 76 20 7c 7c 20 70 42 6c 6f 62 2d 3e 70 44 61  nv || pBlob->pDa
3300: 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ta==0 );.  if( p
3310: 42 6c 6f 62 2d 3e 70 44 61 74 61 20 29 20 6c 73  Blob->pData ) ls
3320: 6d 46 72 65 65 28 70 42 6c 6f 62 2d 3e 70 45 6e  mFree(pBlob->pEn
3330: 76 2c 20 70 42 6c 6f 62 2d 3e 70 44 61 74 61 29  v, pBlob->pData)
3340: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 42 6c 6f 62  ;.  memset(pBlob
3350: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 42 6c 6f 62  , 0, sizeof(Blob
3360: 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ));.}..static in
3370: 74 20 73 6f 72 74 65 64 52 65 61 64 44 61 74 61  t sortedReadData
3380: 28 0a 20 20 53 65 67 6d 65 6e 74 20 2a 70 53 65  (.  Segment *pSe
3390: 67 2c 0a 20 20 50 61 67 65 20 2a 70 50 67 2c 0a  g,.  Page *pPg,.
33a0: 20 20 69 6e 74 20 69 4f 66 66 2c 0a 20 20 69 6e    int iOff,.  in
33b0: 74 20 6e 42 79 74 65 2c 0a 20 20 76 6f 69 64 20  t nByte,.  void 
33c0: 2a 2a 70 70 44 61 74 61 2c 0a 20 20 42 6c 6f 62  **ppData,.  Blob
33d0: 20 2a 70 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74   *pBlob.){.  int
33e0: 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20   rc = LSM_OK;.  
33f0: 69 6e 74 20 69 45 6e 64 3b 0a 20 20 69 6e 74 20  int iEnd;.  int 
3400: 6e 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 43 65  nData;.  int nCe
3410: 6c 6c 3b 0a 20 20 75 38 20 2a 61 44 61 74 61 3b  ll;.  u8 *aData;
3420: 0a 0a 20 20 61 44 61 74 61 20 3d 20 66 73 50 61  ..  aData = fsPa
3430: 67 65 44 61 74 61 28 70 50 67 2c 20 26 6e 44 61  geData(pPg, &nDa
3440: 74 61 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 6c  ta);.  nCell = l
3450: 73 6d 47 65 74 55 31 36 28 26 61 44 61 74 61 5b  smGetU16(&aData[
3460: 53 45 47 4d 45 4e 54 5f 4e 52 45 43 4f 52 44 5f  SEGMENT_NRECORD_
3470: 4f 46 46 53 45 54 28 6e 44 61 74 61 29 5d 29 3b  OFFSET(nData)]);
3480: 0a 20 20 69 45 6e 64 20 3d 20 53 45 47 4d 45 4e  .  iEnd = SEGMEN
3490: 54 5f 45 4f 46 28 6e 44 61 74 61 2c 20 6e 43 65  T_EOF(nData, nCe
34a0: 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ll);.  assert( i
34b0: 45 6e 64 3e 30 20 26 26 20 69 45 6e 64 3c 6e 44  End>0 && iEnd<nD
34c0: 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f  ata );..  if( iO
34d0: 66 66 2b 6e 42 79 74 65 3c 3d 69 45 6e 64 20 29  ff+nByte<=iEnd )
34e0: 7b 0a 20 20 20 20 2a 70 70 44 61 74 61 20 3d 20  {.    *ppData = 
34f0: 28 76 6f 69 64 20 2a 29 26 61 44 61 74 61 5b 69  (void *)&aData[i
3500: 4f 66 66 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Off];.  }else{. 
3510: 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 42     int nRem = nB
3520: 79 74 65 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d  yte;.    int i =
3530: 20 69 4f 66 66 3b 0a 20 20 20 20 75 38 20 2a 61   iOff;.    u8 *a
3540: 44 65 73 74 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61  Dest;..    /* Ma
3550: 6b 65 20 73 75 72 65 20 74 68 65 20 62 6c 6f 62  ke sure the blob
3560: 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74   is big enough t
3570: 6f 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  o store the valu
3580: 65 20 62 65 69 6e 67 20 6c 6f 61 64 65 64 2e 20  e being loaded. 
3590: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 6f 72 74  */.    rc = sort
35a0: 65 64 42 6c 6f 62 47 72 6f 77 28 6c 73 6d 50 61  edBlobGrow(lsmPa
35b0: 67 65 45 6e 76 28 70 50 67 29 2c 20 70 42 6c 6f  geEnv(pPg), pBlo
35c0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  b, nByte);.    i
35d0: 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20  f( rc!=LSM_OK ) 
35e0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
35f0: 42 6c 6f 62 2d 3e 6e 44 61 74 61 20 3d 20 6e 42  Blob->nData = nB
3600: 79 74 65 3b 0a 20 20 20 20 61 44 65 73 74 20 3d  yte;.    aDest =
3610: 20 28 75 38 20 2a 29 70 42 6c 6f 62 2d 3e 70 44   (u8 *)pBlob->pD
3620: 61 74 61 3b 0a 20 20 20 20 2a 70 70 44 61 74 61  ata;.    *ppData
3630: 20 3d 20 70 42 6c 6f 62 2d 3e 70 44 61 74 61 3b   = pBlob->pData;
3640: 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
3650: 6e 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  nt the pointer p
3660: 61 67 65 73 20 72 65 66 2d 63 6f 75 6e 74 2e 20  ages ref-count. 
3670: 2a 2f 0a 20 20 20 20 6c 73 6d 46 73 50 61 67 65  */.    lsmFsPage
3680: 52 65 66 28 70 50 67 29 3b 0a 0a 20 20 20 20 77  Ref(pPg);..    w
3690: 68 69 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  hile( rc==LSM_OK
36a0: 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 20 2a   ){.      Page *
36b0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 6e 74  pNext;.      int
36c0: 20 66 6c 61 67 73 3b 0a 0a 20 20 20 20 20 20 2f   flags;..      /
36d0: 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
36e0: 20 70 50 67 20 69 6e 74 6f 20 74 68 65 20 6f 75   pPg into the ou
36f0: 74 70 75 74 20 62 75 66 66 65 72 2e 20 2a 2f 0a  tput buffer. */.
3700: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
3710: 3d 20 4c 53 4d 5f 4d 49 4e 28 6e 52 65 6d 2c 20  = LSM_MIN(nRem, 
3720: 69 45 6e 64 2d 69 29 3b 0a 20 20 20 20 20 20 69  iEnd-i);.      i
3730: 66 28 20 6e 43 6f 70 79 3e 30 20 29 7b 0a 20 20  f( nCopy>0 ){.  
3740: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
3750: 65 73 74 5b 6e 42 79 74 65 2d 6e 52 65 6d 5d 2c  est[nByte-nRem],
3760: 20 26 61 44 61 74 61 5b 69 5d 2c 20 6e 43 6f 70   &aData[i], nCop
3770: 79 29 3b 0a 20 20 20 20 20 20 20 20 6e 52 65 6d  y);.        nRem
3780: 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
3790: 20 20 20 69 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20     i += nCopy;. 
37a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
37b0: 52 65 6d 3d 3d 30 20 7c 7c 20 69 3d 3d 69 45 6e  Rem==0 || i==iEn
37c0: 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d );.      }.   
37d0: 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 6d 3e     assert( nRem>
37e0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
37f0: 6e 52 65 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  nRem==0 ) break;
3800: 0a 20 20 20 20 20 20 69 20 2d 3d 20 69 45 6e 64  .      i -= iEnd
3810: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62  ;..      /* Grab
3820: 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
3830: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a 2f  n the segment */
3840: 0a 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  ..      do {.   
3850: 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 46 73 44       rc = lsmFsD
3860: 62 50 61 67 65 4e 65 78 74 28 70 53 65 67 2c 20  bPageNext(pSeg, 
3870: 70 50 67 2c 20 31 2c 20 26 70 4e 65 78 74 29 3b  pPg, 1, &pNext);
3880: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
3890: 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 4e 65 78 74  =LSM_OK && pNext
38a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
38b0: 20 72 63 20 3d 20 4c 53 4d 5f 43 4f 52 52 55 50   rc = LSM_CORRUP
38c0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
38d0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
38e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
38f0: 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61    lsmFsPageRelea
3900: 73 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  se(pPg);.       
3910: 20 70 50 67 20 3d 20 70 4e 65 78 74 3b 0a 20 20   pPg = pNext;.  
3920: 20 20 20 20 20 20 61 44 61 74 61 20 3d 20 66 73        aData = fs
3930: 50 61 67 65 44 61 74 61 28 70 50 67 2c 20 26 6e  PageData(pPg, &n
3940: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 66  Data);.        f
3950: 6c 61 67 73 20 3d 20 6c 73 6d 47 65 74 55 31 36  lags = lsmGetU16
3960: 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54 5f  (&aData[SEGMENT_
3970: 46 4c 41 47 53 5f 4f 46 46 53 45 54 28 6e 44 61  FLAGS_OFFSET(nDa
3980: 74 61 29 5d 29 3b 0a 20 20 20 20 20 20 7d 77 68  ta)]);.      }wh
3990: 69 6c 65 28 20 66 6c 61 67 73 26 53 45 47 4d 45  ile( flags&SEGME
39a0: 4e 54 5f 42 54 52 45 45 5f 46 4c 41 47 20 29 3b  NT_BTREE_FLAG );
39b0: 0a 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 53  ..      iEnd = S
39c0: 45 47 4d 45 4e 54 5f 45 4f 46 28 6e 44 61 74 61  EGMENT_EOF(nData
39d0: 2c 20 6c 73 6d 47 65 74 55 31 36 28 26 61 44 61  , lsmGetU16(&aDa
39e0: 74 61 5b 6e 44 61 74 61 2d 32 5d 29 29 3b 0a 20  ta[nData-2]));. 
39f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 45 6e       assert( iEn
3a00: 64 3e 30 20 26 26 20 69 45 6e 64 3c 6e 44 61 74  d>0 && iEnd<nDat
3a10: 61 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  a );.    }..    
3a20: 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65  lsmFsPageRelease
3a30: 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
3a40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
3a50: 69 63 20 69 6e 74 20 70 61 67 65 47 65 74 4e 52  ic int pageGetNR
3a60: 65 63 28 75 38 20 2a 61 44 61 74 61 2c 20 69 6e  ec(u8 *aData, in
3a70: 74 20 6e 44 61 74 61 29 7b 0a 20 20 72 65 74 75  t nData){.  retu
3a80: 72 6e 20 28 69 6e 74 29 6c 73 6d 47 65 74 55 31  rn (int)lsmGetU1
3a90: 36 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54  6(&aData[SEGMENT
3aa0: 5f 4e 52 45 43 4f 52 44 5f 4f 46 46 53 45 54 28  _NRECORD_OFFSET(
3ab0: 6e 44 61 74 61 29 5d 29 3b 0a 7d 0a 0a 73 74 61  nData)]);.}..sta
3ac0: 74 69 63 20 50 67 6e 6f 20 70 61 67 65 47 65 74  tic Pgno pageGet
3ad0: 50 74 72 28 75 38 20 2a 61 44 61 74 61 2c 20 69  Ptr(u8 *aData, i
3ae0: 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 72 65 74  nt nData){.  ret
3af0: 75 72 6e 20 28 50 67 6e 6f 29 6c 73 6d 47 65 74  urn (Pgno)lsmGet
3b00: 55 36 34 28 26 61 44 61 74 61 5b 53 45 47 4d 45  U64(&aData[SEGME
3b10: 4e 54 5f 50 4f 49 4e 54 45 52 5f 4f 46 46 53 45  NT_POINTER_OFFSE
3b20: 54 28 6e 44 61 74 61 29 5d 29 3b 0a 7d 0a 0a 73  T(nData)]);.}..s
3b30: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 47 65  tatic int pageGe
3b40: 74 46 6c 61 67 73 28 75 38 20 2a 61 44 61 74 61  tFlags(u8 *aData
3b50: 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20  , int nData){.  
3b60: 72 65 74 75 72 6e 20 28 69 6e 74 29 6c 73 6d 47  return (int)lsmG
3b70: 65 74 55 31 36 28 26 61 44 61 74 61 5b 53 45 47  etU16(&aData[SEG
3b80: 4d 45 4e 54 5f 46 4c 41 47 53 5f 4f 46 46 53 45  MENT_FLAGS_OFFSE
3b90: 54 28 6e 44 61 74 61 29 5d 29 3b 0a 7d 0a 0a 73  T(nData)]);.}..s
3ba0: 74 61 74 69 63 20 75 38 20 2a 70 61 67 65 47 65  tatic u8 *pageGe
3bb0: 74 43 65 6c 6c 28 75 38 20 2a 61 44 61 74 61 2c  tCell(u8 *aData,
3bc0: 20 69 6e 74 20 6e 44 61 74 61 2c 20 69 6e 74 20   int nData, int 
3bd0: 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e  iCell){.  return
3be0: 20 26 61 44 61 74 61 5b 6c 73 6d 47 65 74 55 31   &aData[lsmGetU1
3bf0: 36 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54  6(&aData[SEGMENT
3c00: 5f 43 45 4c 4c 50 54 52 5f 4f 46 46 53 45 54 28  _CELLPTR_OFFSET(
3c10: 6e 44 61 74 61 2c 20 69 43 65 6c 6c 29 5d 29 5d  nData, iCell)])]
3c20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3c30: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3c40: 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 70 50  cells on page pP
3c50: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
3c60: 20 70 61 67 65 4f 62 6a 47 65 74 4e 52 65 63 28   pageObjGetNRec(
3c70: 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 6e  Page *pPg){.  in
3c80: 74 20 6e 44 61 74 61 3b 0a 20 20 75 38 20 2a 61  t nData;.  u8 *a
3c90: 44 61 74 61 20 3d 20 6c 73 6d 46 73 50 61 67 65  Data = lsmFsPage
3ca0: 44 61 74 61 28 70 50 67 2c 20 26 6e 44 61 74 61  Data(pPg, &nData
3cb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  );.  return page
3cc0: 47 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e  GetNRec(aData, n
3cd0: 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
3ce0: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6f 64  Return the decod
3cf0: 65 64 20 28 70 6f 73 73 69 62 6c 79 20 72 65 6c  ed (possibly rel
3d00: 61 74 69 76 65 29 20 70 6f 69 6e 74 65 72 20 76  ative) pointer v
3d10: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 63  alue stored in c
3d20: 65 6c 6c 20 0a 2a 2a 20 69 43 65 6c 6c 20 66 72  ell .** iCell fr
3d30: 6f 6d 20 70 61 67 65 20 61 44 61 74 61 2f 6e 44  om page aData/nD
3d40: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ata..*/.static P
3d50: 67 6e 6f 20 70 61 67 65 47 65 74 52 65 63 6f 72  gno pageGetRecor
3d60: 64 50 74 72 28 75 38 20 2a 61 44 61 74 61 2c 20  dPtr(u8 *aData, 
3d70: 69 6e 74 20 6e 44 61 74 61 2c 20 69 6e 74 20 69  int nData, int i
3d80: 43 65 6c 6c 29 7b 0a 20 20 50 67 6e 6f 20 69 52  Cell){.  Pgno iR
3d90: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
3da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
3db0: 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75 38  rn value */.  u8
3dc0: 20 2a 61 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *aCell;        
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3de0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c   Pointer to cell
3df0: 20 69 43 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73   iCell */..  ass
3e00: 65 72 74 28 20 69 43 65 6c 6c 3c 70 61 67 65 47  ert( iCell<pageG
3e10: 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44  etNRec(aData, nD
3e20: 61 74 61 29 20 26 26 20 69 43 65 6c 6c 3e 3d 30  ata) && iCell>=0
3e30: 20 29 3b 0a 20 20 61 43 65 6c 6c 20 3d 20 70 61   );.  aCell = pa
3e40: 67 65 47 65 74 43 65 6c 6c 28 61 44 61 74 61 2c  geGetCell(aData,
3e50: 20 6e 44 61 74 61 2c 20 69 43 65 6c 6c 29 3b 0a   nData, iCell);.
3e60: 20 20 6c 73 6d 56 61 72 69 6e 74 47 65 74 36 34    lsmVarintGet64
3e70: 28 26 61 43 65 6c 6c 5b 31 5d 2c 20 26 69 52 65  (&aCell[1], &iRe
3e80: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 65  t);.  return iRe
3e90: 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 38 20  t;.}..static u8 
3ea0: 2a 70 61 67 65 47 65 74 4b 65 79 28 0a 20 20 53  *pageGetKey(.  S
3eb0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20  egment *pSeg,   
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3ed0: 2a 20 53 65 67 6d 65 6e 74 20 70 50 67 20 62 65  * Segment pPg be
3ee0: 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 50 61  longs to */.  Pa
3ef0: 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20  ge *pPg,        
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f10: 20 50 61 67 65 20 74 6f 20 72 65 61 64 20 66 72   Page to read fr
3f20: 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  om */.  int iCel
3f30: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
3f40: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
3f50: 20 6f 66 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65   of cell on page
3f60: 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
3f70: 74 20 2a 70 69 54 6f 70 69 63 2c 20 20 20 20 20  t *piTopic,     
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f90: 20 4f 55 54 3a 20 54 6f 70 69 63 20 61 73 73 6f   OUT: Topic asso
3fa0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
3fb0: 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   key */.  int *p
3fc0: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
3fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
3fe0: 3a 20 53 69 7a 65 20 6f 66 20 6b 65 79 20 69 6e  : Size of key in
3ff0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 42 6c 6f 62   bytes */.  Blob
4000: 20 2a 70 42 6c 6f 62 20 20 20 20 20 20 20 20 20   *pBlob         
4010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
4020: 66 20 72 65 71 75 69 72 65 64 2c 20 75 73 65 20  f required, use 
4030: 74 68 69 73 20 66 6f 72 20 64 79 6e 61 6d 69 63  this for dynamic
4040: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
4050: 75 38 20 2a 70 4b 65 79 3b 0a 20 20 69 6e 74 20  u8 *pKey;.  int 
4060: 6e 44 75 6d 6d 79 3b 0a 20 20 69 6e 74 20 65 54  nDummy;.  int eT
4070: 79 70 65 3b 0a 20 20 75 38 20 2a 61 44 61 74 61  ype;.  u8 *aData
4080: 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 0a  ;.  int nData;..
4090: 20 20 61 44 61 74 61 20 3d 20 66 73 50 61 67 65    aData = fsPage
40a0: 44 61 74 61 28 70 50 67 2c 20 26 6e 44 61 74 61  Data(pPg, &nData
40b0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 28  );..  assert( !(
40c0: 70 61 67 65 47 65 74 46 6c 61 67 73 28 61 44 61  pageGetFlags(aDa
40d0: 74 61 2c 20 6e 44 61 74 61 29 20 26 20 53 45 47  ta, nData) & SEG
40e0: 4d 45 4e 54 5f 42 54 52 45 45 5f 46 4c 41 47 29  MENT_BTREE_FLAG)
40f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43   );.  assert( iC
4100: 65 6c 6c 3c 70 61 67 65 47 65 74 4e 52 65 63 28  ell<pageGetNRec(
4110: 61 44 61 74 61 2c 20 6e 44 61 74 61 29 20 29 3b  aData, nData) );
4120: 0a 0a 20 20 70 4b 65 79 20 3d 20 70 61 67 65 47  ..  pKey = pageG
4130: 65 74 43 65 6c 6c 28 61 44 61 74 61 2c 20 6e 44  etCell(aData, nD
4140: 61 74 61 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 65  ata, iCell);.  e
4150: 54 79 70 65 20 3d 20 2a 70 4b 65 79 2b 2b 3b 0a  Type = *pKey++;.
4160: 20 20 70 4b 65 79 20 2b 3d 20 6c 73 6d 56 61 72    pKey += lsmVar
4170: 69 6e 74 47 65 74 33 32 28 70 4b 65 79 2c 20 26  intGet32(pKey, &
4180: 6e 44 75 6d 6d 79 29 3b 0a 20 20 70 4b 65 79 20  nDummy);.  pKey 
4190: 2b 3d 20 6c 73 6d 56 61 72 69 6e 74 47 65 74 33  += lsmVarintGet3
41a0: 32 28 70 4b 65 79 2c 20 70 6e 4b 65 79 29 3b 0a  2(pKey, pnKey);.
41b0: 20 20 69 66 28 20 72 74 49 73 57 72 69 74 65 28    if( rtIsWrite(
41c0: 65 54 79 70 65 29 20 29 7b 0a 20 20 20 20 70 4b  eType) ){.    pK
41d0: 65 79 20 2b 3d 20 6c 73 6d 56 61 72 69 6e 74 47  ey += lsmVarintG
41e0: 65 74 33 32 28 70 4b 65 79 2c 20 26 6e 44 75 6d  et32(pKey, &nDum
41f0: 6d 79 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 54 6f  my);.  }.  *piTo
4200: 70 69 63 20 3d 20 72 74 54 6f 70 69 63 28 65 54  pic = rtTopic(eT
4210: 79 70 65 29 3b 0a 0a 20 20 73 6f 72 74 65 64 52  ype);..  sortedR
4220: 65 61 64 44 61 74 61 28 70 53 65 67 2c 20 70 50  eadData(pSeg, pP
4230: 67 2c 20 70 4b 65 79 2d 61 44 61 74 61 2c 20 2a  g, pKey-aData, *
4240: 70 6e 4b 65 79 2c 20 28 76 6f 69 64 20 2a 2a 29  pnKey, (void **)
4250: 26 70 4b 65 79 2c 20 70 42 6c 6f 62 29 3b 0a 20  &pKey, pBlob);. 
4260: 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a   return pKey;.}.
4270: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
4280: 47 65 74 4b 65 79 43 6f 70 79 28 0a 20 20 6c 73  GetKeyCopy(.  ls
4290: 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 20 20 20  m_env *pEnv,    
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42b0: 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 68 61 6e   Environment han
42c0: 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74  dle */.  Segment
42d0: 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20 20   *pSeg,         
42e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
42f0: 65 6e 74 20 70 50 67 20 62 65 6c 6f 6e 67 73 20  ent pPg belongs 
4300: 74 6f 20 2a 2f 0a 20 20 50 61 67 65 20 2a 70 50  to */.  Page *pP
4310: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
4320: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
4330: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
4340: 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20    int iCell,    
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65    /* Index of ce
4370: 6c 6c 20 6f 6e 20 70 61 67 65 20 74 6f 20 72 65  ll on page to re
4380: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54  ad */.  int *piT
4390: 6f 70 69 63 2c 20 20 20 20 20 20 20 20 20 20 20  opic,           
43a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
43b0: 54 6f 70 69 63 20 61 73 73 6f 63 69 61 74 65 64  Topic associated
43c0: 20 77 69 74 68 20 74 68 69 73 20 6b 65 79 20 2a   with this key *
43d0: 2f 0a 20 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 20  /.  Blob *pBlob 
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
4400: 65 64 2c 20 75 73 65 20 74 68 69 73 20 66 6f 72  ed, use this for
4410: 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
4420: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
4430: 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e   LSM_OK;.  int n
4440: 4b 65 79 3b 0a 20 20 75 38 20 2a 61 4b 65 79 3b  Key;.  u8 *aKey;
4450: 0a 0a 20 20 61 4b 65 79 20 3d 20 70 61 67 65 47  ..  aKey = pageG
4460: 65 74 4b 65 79 28 70 53 65 67 2c 20 70 50 67 2c  etKey(pSeg, pPg,
4470: 20 69 43 65 6c 6c 2c 20 70 69 54 6f 70 69 63 2c   iCell, piTopic,
4480: 20 26 6e 4b 65 79 2c 20 70 42 6c 6f 62 29 3b 0a   &nKey, pBlob);.
4490: 20 20 61 73 73 65 72 74 28 20 28 76 6f 69 64 20    assert( (void 
44a0: 2a 29 61 4b 65 79 21 3d 70 42 6c 6f 62 2d 3e 70  *)aKey!=pBlob->p
44b0: 44 61 74 61 20 7c 7c 20 6e 4b 65 79 3d 3d 70 42  Data || nKey==pB
44c0: 6c 6f 62 2d 3e 6e 44 61 74 61 20 29 3b 0a 20 20  lob->nData );.  
44d0: 69 66 28 20 28 76 6f 69 64 20 2a 29 61 4b 65 79  if( (void *)aKey
44e0: 21 3d 70 42 6c 6f 62 2d 3e 70 44 61 74 61 20 29  !=pBlob->pData )
44f0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 6f 72 74 65  {.    rc = sorte
4500: 64 42 6c 6f 62 53 65 74 28 70 45 6e 76 2c 20 70  dBlobSet(pEnv, p
4510: 42 6c 6f 62 2c 20 61 4b 65 79 2c 20 6e 4b 65 79  Blob, aKey, nKey
4520: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
4530: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 50   rc;.}..static P
4540: 67 6e 6f 20 70 61 67 65 47 65 74 42 74 72 65 65  gno pageGetBtree
4550: 52 65 66 28 50 61 67 65 20 2a 70 50 67 2c 20 69  Ref(Page *pPg, i
4560: 6e 74 20 69 4b 65 79 29 7b 0a 20 20 50 67 6e 6f  nt iKey){.  Pgno
4570: 20 69 52 65 66 3b 0a 20 20 75 38 20 2a 61 44 61   iRef;.  u8 *aDa
4580: 74 61 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b  ta;.  int nData;
4590: 0a 20 20 75 38 20 2a 61 43 65 6c 6c 3b 0a 0a 20  .  u8 *aCell;.. 
45a0: 20 61 44 61 74 61 20 3d 20 66 73 50 61 67 65 44   aData = fsPageD
45b0: 61 74 61 28 70 50 67 2c 20 26 6e 44 61 74 61 29  ata(pPg, &nData)
45c0: 3b 0a 20 20 61 43 65 6c 6c 20 3d 20 70 61 67 65  ;.  aCell = page
45d0: 47 65 74 43 65 6c 6c 28 61 44 61 74 61 2c 20 6e  GetCell(aData, n
45e0: 44 61 74 61 2c 20 69 4b 65 79 29 3b 0a 20 20 61  Data, iKey);.  a
45f0: 73 73 65 72 74 28 20 61 43 65 6c 6c 5b 30 5d 3d  ssert( aCell[0]=
4600: 3d 30 20 29 3b 0a 20 20 61 43 65 6c 6c 2b 2b 3b  =0 );.  aCell++;
4610: 0a 20 20 61 43 65 6c 6c 20 2b 3d 20 6c 73 6d 56  .  aCell += lsmV
4620: 61 72 69 6e 74 47 65 74 36 34 28 61 43 65 6c 6c  arintGet64(aCell
4630: 2c 20 26 69 52 65 66 29 3b 0a 20 20 6c 73 6d 56  , &iRef);.  lsmV
4640: 61 72 69 6e 74 47 65 74 36 34 28 61 43 65 6c 6c  arintGet64(aCell
4650: 2c 20 26 69 52 65 66 29 3b 0a 20 20 61 73 73 65  , &iRef);.  asse
4660: 72 74 28 20 69 52 65 66 3e 30 20 29 3b 0a 20 20  rt( iRef>0 );.  
4670: 72 65 74 75 72 6e 20 69 52 65 66 3b 0a 7d 0a 0a  return iRef;.}..
4680: 23 64 65 66 69 6e 65 20 47 45 54 56 41 52 49 4e  #define GETVARIN
4690: 54 36 34 28 61 2c 20 69 29 20 28 28 28 69 29 3d  T64(a, i) (((i)=
46a0: 28 28 75 38 2a 29 28 61 29 29 5b 30 5d 29 3c 3d  ((u8*)(a))[0])<=
46b0: 32 34 30 3f 31 3a 6c 73 6d 56 61 72 69 6e 74 47  240?1:lsmVarintG
46c0: 65 74 36 34 28 28 61 29 2c 20 26 28 69 29 29 29  et64((a), &(i)))
46d0: 0a 23 64 65 66 69 6e 65 20 47 45 54 56 41 52 49  .#define GETVARI
46e0: 4e 54 33 32 28 61 2c 20 69 29 20 28 28 28 69 29  NT32(a, i) (((i)
46f0: 3d 28 28 75 38 2a 29 28 61 29 29 5b 30 5d 29 3c  =((u8*)(a))[0])<
4700: 3d 32 34 30 3f 31 3a 6c 73 6d 56 61 72 69 6e 74  =240?1:lsmVarint
4710: 47 65 74 33 32 28 28 61 29 2c 20 26 28 69 29 29  Get32((a), &(i))
4720: 29 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  )..static int pa
4730: 67 65 47 65 74 42 74 72 65 65 4b 65 79 28 0a 20  geGetBtreeKey(. 
4740: 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20   Segment *pSeg, 
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4760: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 70 61 67 65   /* Segment page
4770: 20 70 50 67 20 62 65 6c 6f 6e 67 73 20 74 6f 20   pPg belongs to 
4780: 2a 2f 0a 20 20 50 61 67 65 20 2a 70 50 67 2c 0a  */.  Page *pPg,.
4790: 20 20 69 6e 74 20 69 4b 65 79 2c 20 0a 20 20 50    int iKey, .  P
47a0: 67 6e 6f 20 2a 70 69 50 74 72 2c 20 0a 20 20 69  gno *piPtr, .  i
47b0: 6e 74 20 2a 70 69 54 6f 70 69 63 2c 20 0a 20 20  nt *piTopic, .  
47c0: 76 6f 69 64 20 2a 2a 70 70 4b 65 79 2c 0a 20 20  void **ppKey,.  
47d0: 69 6e 74 20 2a 70 6e 4b 65 79 2c 0a 20 20 42 6c  int *pnKey,.  Bl
47e0: 6f 62 20 2a 70 42 6c 6f 62 0a 29 7b 0a 20 20 75  ob *pBlob.){.  u
47f0: 38 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e 74 20  8 *aData;.  int 
4800: 6e 44 61 74 61 3b 0a 20 20 75 38 20 2a 61 43 65  nData;.  u8 *aCe
4810: 6c 6c 3b 0a 20 20 69 6e 74 20 65 54 79 70 65 3b  ll;.  int eType;
4820: 0a 0a 20 20 61 44 61 74 61 20 3d 20 66 73 50 61  ..  aData = fsPa
4830: 67 65 44 61 74 61 28 70 50 67 2c 20 26 6e 44 61  geData(pPg, &nDa
4840: 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  ta);.  assert( S
4850: 45 47 4d 45 4e 54 5f 42 54 52 45 45 5f 46 4c 41  EGMENT_BTREE_FLA
4860: 47 20 26 20 70 61 67 65 47 65 74 46 6c 61 67 73  G & pageGetFlags
4870: 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 20 29  (aData, nData) )
4880: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4b 65 79  ;.  assert( iKey
4890: 3e 3d 30 20 26 26 20 69 4b 65 79 3c 70 61 67 65  >=0 && iKey<page
48a0: 47 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e  GetNRec(aData, n
48b0: 44 61 74 61 29 20 29 3b 0a 0a 20 20 61 43 65 6c  Data) );..  aCel
48c0: 6c 20 3d 20 70 61 67 65 47 65 74 43 65 6c 6c 28  l = pageGetCell(
48d0: 61 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 69 4b  aData, nData, iK
48e0: 65 79 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 2a  ey);.  eType = *
48f0: 61 43 65 6c 6c 2b 2b 3b 0a 20 20 61 43 65 6c 6c  aCell++;.  aCell
4900: 20 2b 3d 20 47 45 54 56 41 52 49 4e 54 36 34 28   += GETVARINT64(
4910: 61 43 65 6c 6c 2c 20 2a 70 69 50 74 72 29 3b 0a  aCell, *piPtr);.
4920: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
4930: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
4940: 20 20 20 50 67 6e 6f 20 69 52 65 66 3b 20 20 20     Pgno iRef;   
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4960: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
4970: 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
4980: 20 2a 2f 0a 20 20 20 20 50 61 67 65 20 2a 70 52   */.    Page *pR
4990: 65 66 3b 0a 20 20 20 20 61 43 65 6c 6c 20 2b 3d  ef;.    aCell +=
49a0: 20 47 45 54 56 41 52 49 4e 54 36 34 28 61 43 65   GETVARINT64(aCe
49b0: 6c 6c 2c 20 69 52 65 66 29 3b 0a 20 20 20 20 72  ll, iRef);.    r
49c0: 63 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65 47  c = lsmFsDbPageG
49d0: 65 74 28 6c 73 6d 50 61 67 65 46 53 28 70 50 67  et(lsmPageFS(pPg
49e0: 29 2c 20 70 53 65 67 2c 20 69 52 65 66 2c 20 26  ), pSeg, iRef, &
49f0: 70 52 65 66 29 3b 0a 20 20 20 20 69 66 28 20 72  pRef);.    if( r
4a00: 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72 65 74 75  c!=LSM_OK ) retu
4a10: 72 6e 20 72 63 3b 0a 20 20 20 20 70 61 67 65 47  rn rc;.    pageG
4a20: 65 74 4b 65 79 43 6f 70 79 28 6c 73 6d 50 61 67  etKeyCopy(lsmPag
4a30: 65 45 6e 76 28 70 50 67 29 2c 20 70 53 65 67 2c  eEnv(pPg), pSeg,
4a40: 20 70 52 65 66 2c 20 30 2c 20 26 65 54 79 70 65   pRef, 0, &eType
4a50: 2c 20 70 42 6c 6f 62 29 3b 0a 20 20 20 20 6c 73  , pBlob);.    ls
4a60: 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65 28 70  mFsPageRelease(p
4a70: 52 65 66 29 3b 0a 20 20 20 20 2a 70 70 4b 65 79  Ref);.    *ppKey
4a80: 20 3d 20 70 42 6c 6f 62 2d 3e 70 44 61 74 61 3b   = pBlob->pData;
4a90: 0a 20 20 20 20 2a 70 6e 4b 65 79 20 3d 20 70 42  .    *pnKey = pB
4aa0: 6c 6f 62 2d 3e 6e 44 61 74 61 3b 0a 20 20 7d 65  lob->nData;.  }e
4ab0: 6c 73 65 7b 0a 20 20 20 20 61 43 65 6c 6c 20 2b  lse{.    aCell +
4ac0: 3d 20 47 45 54 56 41 52 49 4e 54 33 32 28 61 43  = GETVARINT32(aC
4ad0: 65 6c 6c 2c 20 2a 70 6e 4b 65 79 29 3b 0a 20 20  ell, *pnKey);.  
4ae0: 20 20 2a 70 70 4b 65 79 20 3d 20 61 43 65 6c 6c    *ppKey = aCell
4af0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 69 54 6f  ;.  }.  if( piTo
4b00: 70 69 63 20 29 20 2a 70 69 54 6f 70 69 63 20 3d  pic ) *piTopic =
4b10: 20 72 74 54 6f 70 69 63 28 65 54 79 70 65 29 3b   rtTopic(eType);
4b20: 0a 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f  ..  return LSM_O
4b30: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
4b40: 20 62 74 72 65 65 43 75 72 73 6f 72 4c 6f 61 64   btreeCursorLoad
4b50: 4b 65 79 28 42 74 72 65 65 43 75 72 73 6f 72 20  Key(BtreeCursor 
4b60: 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCsr){.  int rc
4b70: 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 66 28   = LSM_OK;.  if(
4b80: 20 70 43 73 72 2d 3e 69 50 67 3c 30 20 29 7b 0a   pCsr->iPg<0 ){.
4b90: 20 20 20 20 70 43 73 72 2d 3e 70 4b 65 79 20 3d      pCsr->pKey =
4ba0: 20 30 3b 0a 20 20 20 20 70 43 73 72 2d 3e 6e 4b   0;.    pCsr->nK
4bb0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72  ey = 0;.    pCsr
4bc0: 2d 3e 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 7d  ->eType = 0;.  }
4bd0: 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 64  else{.    Pgno d
4be0: 75 6d 6d 79 3b 0a 20 20 20 20 69 6e 74 20 69 50  ummy;.    int iP
4bf0: 67 20 3d 20 70 43 73 72 2d 3e 69 50 67 3b 0a 20  g = pCsr->iPg;. 
4c00: 20 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20 70     int iCell = p
4c10: 43 73 72 2d 3e 61 50 67 5b 69 50 67 5d 2e 69 43  Csr->aPg[iPg].iC
4c20: 65 6c 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ell;.    while( 
4c30: 69 43 65 6c 6c 3c 30 20 26 26 20 28 2d 2d 69 50  iCell<0 && (--iP
4c40: 67 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  g)>=0 ){.      i
4c50: 43 65 6c 6c 20 3d 20 70 43 73 72 2d 3e 61 50 67  Cell = pCsr->aPg
4c60: 5b 69 50 67 5d 2e 69 43 65 6c 6c 2d 31 3b 0a 20  [iPg].iCell-1;. 
4c70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 50 67     }.    if( iPg
4c80: 3c 30 20 7c 7c 20 69 43 65 6c 6c 3c 30 20 29 20  <0 || iCell<0 ) 
4c90: 72 65 74 75 72 6e 20 4c 53 4d 5f 43 4f 52 52 55  return LSM_CORRU
4ca0: 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 72 63  PT_BKPT;..    rc
4cb0: 20 3d 20 70 61 67 65 47 65 74 42 74 72 65 65 4b   = pageGetBtreeK
4cc0: 65 79 28 0a 20 20 20 20 20 20 20 20 70 43 73 72  ey(.        pCsr
4cd0: 2d 3e 70 53 65 67 2c 0a 20 20 20 20 20 20 20 20  ->pSeg,.        
4ce0: 70 43 73 72 2d 3e 61 50 67 5b 69 50 67 5d 2e 70  pCsr->aPg[iPg].p
4cf0: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 0a 20 20 20  Page, iCell,.   
4d00: 20 20 20 20 20 26 64 75 6d 6d 79 2c 20 26 70 43       &dummy, &pC
4d10: 73 72 2d 3e 65 54 79 70 65 2c 20 26 70 43 73 72  sr->eType, &pCsr
4d20: 2d 3e 70 4b 65 79 2c 20 26 70 43 73 72 2d 3e 6e  ->pKey, &pCsr->n
4d30: 4b 65 79 2c 20 26 70 43 73 72 2d 3e 62 6c 6f 62  Key, &pCsr->blob
4d40: 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 43 73 72  .    );.    pCsr
4d50: 2d 3e 65 54 79 70 65 20 7c 3d 20 4c 53 4d 5f 53  ->eType |= LSM_S
4d60: 45 50 41 52 41 54 4f 52 3b 0a 20 20 7d 0a 0a 20  EPARATOR;.  }.. 
4d70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
4d80: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
4d90: 75 72 73 6f 72 50 74 72 28 75 38 20 2a 61 44 61  ursorPtr(u8 *aDa
4da0: 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 69  ta, int nData, i
4db0: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74  nt iCell){.  int
4dc0: 20 6e 43 65 6c 6c 3b 0a 0a 20 20 6e 43 65 6c 6c   nCell;..  nCell
4dd0: 20 3d 20 70 61 67 65 47 65 74 4e 52 65 63 28 61   = pageGetNRec(a
4de0: 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
4df0: 69 66 28 20 69 43 65 6c 6c 3e 3d 6e 43 65 6c 6c  if( iCell>=nCell
4e00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
4e10: 69 6e 74 29 70 61 67 65 47 65 74 50 74 72 28 61  int)pageGetPtr(a
4e20: 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
4e30: 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
4e40: 70 61 67 65 47 65 74 52 65 63 6f 72 64 50 74 72  pageGetRecordPtr
4e50: 28 61 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 69  (aData, nData, i
4e60: 43 65 6c 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Cell);.}..static
4e70: 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
4e80: 4e 65 78 74 28 42 74 72 65 65 43 75 72 73 6f 72  Next(BtreeCursor
4e90: 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 72   *pCsr){.  int r
4ea0: 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20 20 42  c = LSM_OK;..  B
4eb0: 74 72 65 65 50 67 20 2a 70 50 67 20 3d 20 26 70  treePg *pPg = &p
4ec0: 43 73 72 2d 3e 61 50 67 5b 70 43 73 72 2d 3e 69  Csr->aPg[pCsr->i
4ed0: 50 67 5d 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  Pg];.  int nCell
4ee0: 3b 20 0a 20 20 75 38 20 2a 61 44 61 74 61 3b 0a  ; .  u8 *aData;.
4ef0: 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 0a 20 20    int nData;..  
4f00: 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 69 50  assert( pCsr->iP
4f10: 67 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  g>=0 );.  assert
4f20: 28 20 70 43 73 72 2d 3e 69 50 67 3d 3d 70 43 73  ( pCsr->iPg==pCs
4f30: 72 2d 3e 6e 44 65 70 74 68 2d 31 20 29 3b 0a 0a  r->nDepth-1 );..
4f40: 20 20 61 44 61 74 61 20 3d 20 66 73 50 61 67 65    aData = fsPage
4f50: 44 61 74 61 28 70 50 67 2d 3e 70 50 61 67 65 2c  Data(pPg->pPage,
4f60: 20 26 6e 44 61 74 61 29 3b 0a 20 20 6e 43 65 6c   &nData);.  nCel
4f70: 6c 20 3d 20 70 61 67 65 47 65 74 4e 52 65 63 28  l = pageGetNRec(
4f80: 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  aData, nData);. 
4f90: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 43   assert( pPg->iC
4fa0: 65 6c 6c 3c 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  ell<=nCell );.  
4fb0: 70 50 67 2d 3e 69 43 65 6c 6c 2b 2b 3b 0a 20 20  pPg->iCell++;.  
4fc0: 69 66 28 20 70 50 67 2d 3e 69 43 65 6c 6c 3d 3d  if( pPg->iCell==
4fd0: 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 50 67 6e  nCell ){.    Pgn
4fe0: 6f 20 69 4c 6f 61 64 3b 0a 0a 20 20 20 20 2f 2a  o iLoad;..    /*
4ff0: 20 55 70 20 74 6f 20 70 61 72 65 6e 74 2e 20 2a   Up to parent. *
5000: 2f 0a 20 20 20 20 6c 73 6d 46 73 50 61 67 65 52  /.    lsmFsPageR
5010: 65 6c 65 61 73 65 28 70 50 67 2d 3e 70 50 61 67  elease(pPg->pPag
5020: 65 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  e);.    pPg->pPa
5030: 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 73 72  ge = 0;.    pCsr
5040: 2d 3e 69 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69  ->iPg--;.    whi
5050: 6c 65 28 20 70 43 73 72 2d 3e 69 50 67 3e 3d 30  le( pCsr->iPg>=0
5060: 20 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20   ){.      pPg = 
5070: 26 70 43 73 72 2d 3e 61 50 67 5b 70 43 73 72 2d  &pCsr->aPg[pCsr-
5080: 3e 69 50 67 5d 3b 0a 20 20 20 20 20 20 61 44 61  >iPg];.      aDa
5090: 74 61 20 3d 20 66 73 50 61 67 65 44 61 74 61 28  ta = fsPageData(
50a0: 70 50 67 2d 3e 70 50 61 67 65 2c 20 26 6e 44 61  pPg->pPage, &nDa
50b0: 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ta);.      if( p
50c0: 50 67 2d 3e 69 43 65 6c 6c 3c 70 61 67 65 47 65  Pg->iCell<pageGe
50d0: 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44 61  tNRec(aData, nDa
50e0: 74 61 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ta) ) break;.   
50f0: 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65     lsmFsPageRele
5100: 61 73 65 28 70 50 67 2d 3e 70 50 61 67 65 29 3b  ase(pPg->pPage);
5110: 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 69 50 67  .      pCsr->iPg
5120: 2d 2d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  --;.    }..    /
5130: 2a 20 52 65 61 64 20 74 68 65 20 6b 65 79 20 2a  * Read the key *
5140: 2f 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  /.    rc = btree
5150: 43 75 72 73 6f 72 4c 6f 61 64 4b 65 79 28 70 43  CursorLoadKey(pC
5160: 73 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c  sr);..    /* Unl
5170: 65 73 73 20 74 68 65 20 63 75 72 73 6f 72 20 69  ess the cursor i
5180: 73 20 61 74 20 45 4f 46 2c 20 64 65 73 63 65 6e  s at EOF, descen
5190: 64 20 74 6f 20 63 65 6c 6c 20 2d 31 20 28 79 65  d to cell -1 (ye
51a0: 73 2c 20 6e 65 67 61 74 69 76 65 20 6f 6e 65 29  s, negative one)
51b0: 20 6f 66 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   of .    ** the 
51c0: 6c 65 66 74 2d 6d 6f 73 74 20 6d 6f 73 74 20 64  left-most most d
51d0: 65 73 63 65 6e 64 65 6e 74 2e 20 2a 2f 0a 20 20  escendent. */.  
51e0: 20 20 69 66 28 20 70 43 73 72 2d 3e 69 50 67 3e    if( pCsr->iPg>
51f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 73 72  =0 ){.      pCsr
5200: 2d 3e 61 50 67 5b 70 43 73 72 2d 3e 69 50 67 5d  ->aPg[pCsr->iPg]
5210: 2e 69 43 65 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 20  .iCell++;..     
5220: 20 69 4c 6f 61 64 20 3d 20 62 74 72 65 65 43 75   iLoad = btreeCu
5230: 72 73 6f 72 50 74 72 28 61 44 61 74 61 2c 20 6e  rsorPtr(aData, n
5240: 44 61 74 61 2c 20 70 50 67 2d 3e 69 43 65 6c 6c  Data, pPg->iCell
5250: 29 3b 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20  );.      do {.  
5260: 20 20 20 20 20 20 50 61 67 65 20 2a 70 4c 6f 61        Page *pLoa
5270: 64 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d  d;.        pCsr-
5280: 3e 69 50 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20  >iPg++;.        
5290: 72 63 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65  rc = lsmFsDbPage
52a0: 47 65 74 28 70 43 73 72 2d 3e 70 46 53 2c 20 70  Get(pCsr->pFS, p
52b0: 43 73 72 2d 3e 70 53 65 67 2c 20 69 4c 6f 61 64  Csr->pSeg, iLoad
52c0: 2c 20 26 70 4c 6f 61 64 29 3b 0a 20 20 20 20 20  , &pLoad);.     
52d0: 20 20 20 70 43 73 72 2d 3e 61 50 67 5b 70 43 73     pCsr->aPg[pCs
52e0: 72 2d 3e 69 50 67 5d 2e 70 50 61 67 65 20 3d 20  r->iPg].pPage = 
52f0: 70 4c 6f 61 64 3b 0a 20 20 20 20 20 20 20 20 70  pLoad;.        p
5300: 43 73 72 2d 3e 61 50 67 5b 70 43 73 72 2d 3e 69  Csr->aPg[pCsr->i
5310: 50 67 5d 2e 69 43 65 6c 6c 20 3d 20 30 3b 0a 20  Pg].iCell = 0;. 
5320: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c         if( rc==L
5330: 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  SM_OK ){.       
5340: 20 20 20 69 66 28 20 70 43 73 72 2d 3e 69 50 67     if( pCsr->iPg
5350: 3d 3d 28 70 43 73 72 2d 3e 6e 44 65 70 74 68 2d  ==(pCsr->nDepth-
5360: 31 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  1) ) break;.    
5370: 20 20 20 20 20 20 61 44 61 74 61 20 3d 20 66 73        aData = fs
5380: 50 61 67 65 44 61 74 61 28 70 4c 6f 61 64 2c 20  PageData(pLoad, 
5390: 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  &nData);.       
53a0: 20 20 20 69 4c 6f 61 64 20 3d 20 62 74 72 65 65     iLoad = btree
53b0: 43 75 72 73 6f 72 50 74 72 28 61 44 61 74 61 2c  CursorPtr(aData,
53c0: 20 6e 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20   nData, 0);.    
53d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 77 68 69      }.      }whi
53e0: 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26  le( rc==LSM_OK &
53f0: 26 20 70 43 73 72 2d 3e 69 50 67 3c 28 70 43 73  & pCsr->iPg<(pCs
5400: 72 2d 3e 6e 44 65 70 74 68 2d 31 29 20 29 3b 0a  r->nDepth-1) );.
5410: 20 20 20 20 20 20 70 43 73 72 2d 3e 61 50 67 5b        pCsr->aPg[
5420: 70 43 73 72 2d 3e 69 50 67 5d 2e 69 43 65 6c 6c  pCsr->iPg].iCell
5430: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20   = -1;.    }..  
5440: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
5450: 62 74 72 65 65 43 75 72 73 6f 72 4c 6f 61 64 4b  btreeCursorLoadK
5460: 65 79 28 70 43 73 72 29 3b 0a 20 20 7d 0a 0a 20  ey(pCsr);.  }.. 
5470: 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
5480: 26 26 20 70 43 73 72 2d 3e 69 50 67 3e 3d 30 20  && pCsr->iPg>=0 
5490: 29 7b 0a 20 20 20 20 61 44 61 74 61 20 3d 20 66  ){.    aData = f
54a0: 73 50 61 67 65 44 61 74 61 28 70 43 73 72 2d 3e  sPageData(pCsr->
54b0: 61 50 67 5b 70 43 73 72 2d 3e 69 50 67 5d 2e 70  aPg[pCsr->iPg].p
54c0: 50 61 67 65 2c 20 26 6e 44 61 74 61 29 3b 0a 20  Page, &nData);. 
54d0: 20 20 20 70 43 73 72 2d 3e 69 50 74 72 20 3d 20     pCsr->iPtr = 
54e0: 62 74 72 65 65 43 75 72 73 6f 72 50 74 72 28 61  btreeCursorPtr(a
54f0: 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 70 43 73  Data, nData, pCs
5500: 72 2d 3e 61 50 67 5b 70 43 73 72 2d 3e 69 50 67  r->aPg[pCsr->iPg
5510: 5d 2e 69 43 65 6c 6c 2b 31 29 3b 0a 20 20 7d 0a  ].iCell+1);.  }.
5520: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5530: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
5540: 65 65 43 75 72 73 6f 72 46 72 65 65 28 42 74 72  eeCursorFree(Btr
5550: 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b  eeCursor *pCsr){
5560: 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20  .  if( pCsr ){. 
5570: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 6c 73     int i;.    ls
5580: 6d 5f 65 6e 76 20 2a 70 45 6e 76 20 3d 20 6c 73  m_env *pEnv = ls
5590: 6d 46 73 45 6e 76 28 70 43 73 72 2d 3e 70 46 53  mFsEnv(pCsr->pFS
55a0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
55b0: 69 3c 3d 70 43 73 72 2d 3e 69 50 67 3b 20 69 2b  i<=pCsr->iPg; i+
55c0: 2b 29 7b 0a 20 20 20 20 20 20 6c 73 6d 46 73 50  +){.      lsmFsP
55d0: 61 67 65 52 65 6c 65 61 73 65 28 70 43 73 72 2d  ageRelease(pCsr-
55e0: 3e 61 50 67 5b 69 5d 2e 70 50 61 67 65 29 3b 0a  >aPg[i].pPage);.
55f0: 20 20 20 20 7d 0a 20 20 20 20 73 6f 72 74 65 64      }.    sorted
5600: 42 6c 6f 62 46 72 65 65 28 26 70 43 73 72 2d 3e  BlobFree(&pCsr->
5610: 62 6c 6f 62 29 3b 0a 20 20 20 20 6c 73 6d 46 72  blob);.    lsmFr
5620: 65 65 28 70 45 6e 76 2c 20 70 43 73 72 2d 3e 61  ee(pEnv, pCsr->a
5630: 50 67 29 3b 0a 20 20 20 20 6c 73 6d 46 72 65 65  Pg);.    lsmFree
5640: 28 70 45 6e 76 2c 20 70 43 73 72 29 3b 0a 20 20  (pEnv, pCsr);.  
5650: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  }.}..static int 
5660: 62 74 72 65 65 43 75 72 73 6f 72 46 69 72 73 74  btreeCursorFirst
5670: 28 42 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43  (BtreeCursor *pC
5680: 73 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  sr){.  int rc;..
5690: 20 20 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b    Page *pPg = 0;
56a0: 0a 20 20 46 69 6c 65 53 79 73 74 65 6d 20 2a 70  .  FileSystem *p
56b0: 46 53 20 3d 20 70 43 73 72 2d 3e 70 46 53 3b 0a  FS = pCsr->pFS;.
56c0: 20 20 69 6e 74 20 69 50 67 20 3d 20 28 69 6e 74    int iPg = (int
56d0: 29 70 43 73 72 2d 3e 70 53 65 67 2d 3e 69 52 6f  )pCsr->pSeg->iRo
56e0: 6f 74 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20  ot;..  do {.    
56f0: 72 63 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65  rc = lsmFsDbPage
5700: 47 65 74 28 70 46 53 2c 20 70 43 73 72 2d 3e 70  Get(pFS, pCsr->p
5710: 53 65 67 2c 20 69 50 67 2c 20 26 70 50 67 29 3b  Seg, iPg, &pPg);
5720: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
5730: 3d 3d 4c 53 4d 5f 4f 4b 29 3d 3d 28 70 50 67 21  ==LSM_OK)==(pPg!
5740: 3d 30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  =0) );.    if( r
5750: 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20  c==LSM_OK ){.   
5760: 20 20 20 75 38 20 2a 61 44 61 74 61 3b 0a 20 20     u8 *aData;.  
5770: 20 20 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20      int nData;. 
5780: 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a       int flags;.
5790: 0a 20 20 20 20 20 20 61 44 61 74 61 20 3d 20 66  .      aData = f
57a0: 73 50 61 67 65 44 61 74 61 28 70 50 67 2c 20 26  sPageData(pPg, &
57b0: 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 66 6c  nData);.      fl
57c0: 61 67 73 20 3d 20 70 61 67 65 47 65 74 46 6c 61  ags = pageGetFla
57d0: 67 73 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29  gs(aData, nData)
57e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c 61  ;.      if( (fla
57f0: 67 73 20 26 20 53 45 47 4d 45 4e 54 5f 42 54 52  gs & SEGMENT_BTR
5800: 45 45 5f 46 4c 41 47 29 3d 3d 30 20 29 20 62 72  EE_FLAG)==0 ) br
5810: 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  eak;..      if( 
5820: 28 70 43 73 72 2d 3e 6e 44 65 70 74 68 20 25 20  (pCsr->nDepth % 
5830: 38 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  8)==0 ){.       
5840: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 43 73 72   int nNew = pCsr
5850: 2d 3e 6e 44 65 70 74 68 20 2b 20 38 3b 0a 20 20  ->nDepth + 8;.  
5860: 20 20 20 20 20 20 70 43 73 72 2d 3e 61 50 67 20        pCsr->aPg 
5870: 3d 20 28 42 74 72 65 65 50 67 20 2a 29 6c 73 6d  = (BtreePg *)lsm
5880: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 52 63 28  ReallocOrFreeRc(
5890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 73 6d  .            lsm
58a0: 46 73 45 6e 76 28 70 46 53 29 2c 20 70 43 73 72  FsEnv(pFS), pCsr
58b0: 2d 3e 61 50 67 2c 20 73 69 7a 65 6f 66 28 42 74  ->aPg, sizeof(Bt
58c0: 72 65 65 50 67 29 20 2a 20 6e 4e 65 77 2c 20 26  reePg) * nNew, &
58d0: 72 63 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  rc.        );.  
58e0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53        if( rc==LS
58f0: 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  M_OK ){.        
5900: 20 20 6d 65 6d 73 65 74 28 26 70 43 73 72 2d 3e    memset(&pCsr->
5910: 61 50 67 5b 70 43 73 72 2d 3e 6e 44 65 70 74 68  aPg[pCsr->nDepth
5920: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 42 74 72  ], 0, sizeof(Btr
5930: 65 65 50 67 29 20 2a 20 38 29 3b 0a 20 20 20 20  eePg) * 8);.    
5940: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
5950: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d       if( rc==LSM
5960: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
5970: 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61 50 67  ssert( pCsr->aPg
5980: 5b 70 43 73 72 2d 3e 6e 44 65 70 74 68 5d 2e 69  [pCsr->nDepth].i
5990: 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
59a0: 20 20 20 70 43 73 72 2d 3e 61 50 67 5b 70 43 73     pCsr->aPg[pCs
59b0: 72 2d 3e 6e 44 65 70 74 68 5d 2e 70 50 61 67 65  r->nDepth].pPage
59c0: 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20   = pPg;.        
59d0: 70 43 73 72 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a  pCsr->nDepth++;.
59e0: 20 20 20 20 20 20 20 20 69 50 67 20 3d 20 28 69          iPg = (i
59f0: 6e 74 29 70 61 67 65 47 65 74 52 65 63 6f 72 64  nt)pageGetRecord
5a00: 50 74 72 28 61 44 61 74 61 2c 20 6e 44 61 74 61  Ptr(aData, nData
5a10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
5a20: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63    }.  }while( rc
5a30: 3d 3d 4c 53 4d 5f 4f 4b 20 29 3b 0a 20 20 6c 73  ==LSM_OK );.  ls
5a40: 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65 28 70  mFsPageRelease(p
5a50: 50 67 29 3b 0a 20 20 70 43 73 72 2d 3e 69 50 67  Pg);.  pCsr->iPg
5a60: 20 3d 20 70 43 73 72 2d 3e 6e 44 65 70 74 68 2d   = pCsr->nDepth-
5a70: 31 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53  1;..  if( rc==LS
5a80: 4d 5f 4f 4b 20 26 26 20 70 43 73 72 2d 3e 6e 44  M_OK && pCsr->nD
5a90: 65 70 74 68 20 29 7b 0a 20 20 20 20 70 43 73 72  epth ){.    pCsr
5aa0: 2d 3e 61 50 67 5b 70 43 73 72 2d 3e 69 50 67 5d  ->aPg[pCsr->iPg]
5ab0: 2e 69 43 65 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20  .iCell = -1;.   
5ac0: 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f   rc = btreeCurso
5ad0: 72 4e 65 78 74 28 70 43 73 72 29 3b 0a 20 20 7d  rNext(pCsr);.  }
5ae0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
5af0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  ..static void bt
5b00: 72 65 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  reeCursorPositio
5b10: 6e 28 42 74 72 65 65 43 75 72 73 6f 72 20 2a 70  n(BtreeCursor *p
5b20: 43 73 72 2c 20 4d 65 72 67 65 49 6e 70 75 74 20  Csr, MergeInput 
5b30: 2a 70 29 7b 0a 20 20 69 66 28 20 70 43 73 72 2d  *p){.  if( pCsr-
5b40: 3e 69 50 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70  >iPg>=0 ){.    p
5b50: 2d 3e 69 50 67 20 3d 20 6c 73 6d 46 73 50 61 67  ->iPg = lsmFsPag
5b60: 65 4e 75 6d 62 65 72 28 70 43 73 72 2d 3e 61 50  eNumber(pCsr->aP
5b70: 67 5b 70 43 73 72 2d 3e 69 50 67 5d 2e 70 50 61  g[pCsr->iPg].pPa
5b80: 67 65 29 3b 0a 20 20 20 20 70 2d 3e 69 43 65 6c  ge);.    p->iCel
5b90: 6c 20 3d 20 28 28 70 43 73 72 2d 3e 61 50 67 5b  l = ((pCsr->aPg[
5ba0: 70 43 73 72 2d 3e 69 50 67 5d 2e 69 43 65 6c 6c  pCsr->iPg].iCell
5bb0: 20 2b 20 31 29 20 3c 3c 20 38 29 20 2b 20 70 43   + 1) << 8) + pC
5bc0: 73 72 2d 3e 6e 44 65 70 74 68 3b 0a 20 20 7d 65  sr->nDepth;.  }e
5bd0: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 69 50 67 20  lse{.    p->iPg 
5be0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 69 43 65 6c  = 0;.    p->iCel
5bf0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  l = 0;.  }.}..st
5c00: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 43  atic void btreeC
5c10: 75 72 73 6f 72 53 70 6c 69 74 6b 65 79 28 42 74  ursorSplitkey(Bt
5c20: 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  reeCursor *pCsr,
5c30: 20 4d 65 72 67 65 49 6e 70 75 74 20 2a 70 29 7b   MergeInput *p){
5c40: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20 70  .  int iCell = p
5c50: 43 73 72 2d 3e 61 50 67 5b 70 43 73 72 2d 3e 69  Csr->aPg[pCsr->i
5c60: 50 67 5d 2e 69 43 65 6c 6c 3b 0a 20 20 69 66 28  Pg].iCell;.  if(
5c70: 20 69 43 65 6c 6c 3e 3d 30 20 29 7b 0a 20 20 20   iCell>=0 ){.   
5c80: 20 70 2d 3e 69 43 65 6c 6c 20 3d 20 69 43 65 6c   p->iCell = iCel
5c90: 6c 3b 0a 20 20 20 20 70 2d 3e 69 50 67 20 3d 20  l;.    p->iPg = 
5ca0: 6c 73 6d 46 73 50 61 67 65 4e 75 6d 62 65 72 28  lsmFsPageNumber(
5cb0: 70 43 73 72 2d 3e 61 50 67 5b 70 43 73 72 2d 3e  pCsr->aPg[pCsr->
5cc0: 69 50 67 5d 2e 70 50 61 67 65 29 3b 0a 20 20 7d  iPg].pPage);.  }
5cd0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
5ce0: 0a 20 20 20 20 66 6f 72 28 69 3d 70 43 73 72 2d  .    for(i=pCsr-
5cf0: 3e 69 50 67 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  >iPg-1; i>=0; i-
5d00: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  -){.      if( pC
5d10: 73 72 2d 3e 61 50 67 5b 69 5d 2e 69 43 65 6c 6c  sr->aPg[i].iCell
5d20: 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  >0 ) break;.    
5d30: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e  }.    assert( i>
5d40: 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 43 65  =0 );.    p->iCe
5d50: 6c 6c 20 3d 20 70 43 73 72 2d 3e 61 50 67 5b 69  ll = pCsr->aPg[i
5d60: 5d 2e 69 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70  ].iCell-1;.    p
5d70: 2d 3e 69 50 67 20 3d 20 6c 73 6d 46 73 50 61 67  ->iPg = lsmFsPag
5d80: 65 4e 75 6d 62 65 72 28 70 43 73 72 2d 3e 61 50  eNumber(pCsr->aP
5d90: 67 5b 69 5d 2e 70 50 61 67 65 29 3b 0a 20 20 7d  g[i].pPage);.  }
5da0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .}..static int s
5db0: 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65 28  ortedKeyCompare(
5dc0: 0a 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 76  .  int (*xCmp)(v
5dd0: 6f 69 64 20 2a 2c 20 69 6e 74 2c 20 76 6f 69 64  oid *, int, void
5de0: 20 2a 2c 20 69 6e 74 29 2c 0a 20 20 69 6e 74 20   *, int),.  int 
5df0: 69 4c 68 73 54 6f 70 69 63 2c 20 76 6f 69 64 20  iLhsTopic, void 
5e00: 2a 70 4c 68 73 4b 65 79 2c 20 69 6e 74 20 6e 4c  *pLhsKey, int nL
5e10: 68 73 4b 65 79 2c 0a 20 20 69 6e 74 20 69 52 68  hsKey,.  int iRh
5e20: 73 54 6f 70 69 63 2c 20 76 6f 69 64 20 2a 70 52  sTopic, void *pR
5e30: 68 73 4b 65 79 2c 20 69 6e 74 20 6e 52 68 73 4b  hsKey, int nRhsK
5e40: 65 79 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 20  ey.){.  int res 
5e50: 3d 20 69 4c 68 73 54 6f 70 69 63 20 2d 20 69 52  = iLhsTopic - iR
5e60: 68 73 54 6f 70 69 63 3b 0a 20 20 69 66 28 20 72  hsTopic;.  if( r
5e70: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 73  es==0 ){.    res
5e80: 20 3d 20 78 43 6d 70 28 70 4c 68 73 4b 65 79 2c   = xCmp(pLhsKey,
5e90: 20 6e 4c 68 73 4b 65 79 2c 20 70 52 68 73 4b 65   nLhsKey, pRhsKe
5ea0: 79 2c 20 6e 52 68 73 4b 65 79 29 3b 0a 20 20 7d  y, nRhsKey);.  }
5eb0: 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
5ec0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  ..static int btr
5ed0: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
5ee0: 0a 20 20 42 74 72 65 65 43 75 72 73 6f 72 20 2a  .  BtreeCursor *
5ef0: 70 43 73 72 2c 20 0a 20 20 69 6e 74 20 28 2a 78  pCsr, .  int (*x
5f00: 43 6d 70 29 28 76 6f 69 64 20 2a 2c 20 69 6e 74  Cmp)(void *, int
5f10: 2c 20 76 6f 69 64 20 2a 2c 20 69 6e 74 29 2c 0a  , void *, int),.
5f20: 20 20 4d 65 72 67 65 49 6e 70 75 74 20 2a 70 0a    MergeInput *p.
5f30: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  ){.  int rc = LS
5f40: 4d 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  M_OK;..  if( p->
5f50: 69 50 67 20 29 7b 0a 20 20 20 20 6c 73 6d 5f 65  iPg ){.    lsm_e
5f60: 6e 76 20 2a 70 45 6e 76 20 3d 20 6c 73 6d 46 73  nv *pEnv = lsmFs
5f70: 45 6e 76 28 70 43 73 72 2d 3e 70 46 53 29 3b 0a  Env(pCsr->pFS);.
5f80: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 3b 20 20      int iCell;  
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 63 65 6c    /* Current cel
5fb0: 6c 20 6e 75 6d 62 65 72 20 6f 6e 20 6c 65 61 66  l number on leaf
5fc0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
5fd0: 6f 20 69 4c 65 61 66 3b 20 20 20 20 20 20 20 20  o iLeaf;        
5fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
5ff0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  ge number of cur
6000: 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 2a  rent leaf page *
6010: 2f 0a 20 20 20 20 69 6e 74 20 6e 44 65 70 74 68  /.    int nDepth
6020: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6030: 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66 20      /* Depth of 
6040: 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
6050: 20 2a 2f 0a 20 20 20 20 53 65 67 6d 65 6e 74 20   */.    Segment 
6060: 2a 70 53 65 67 20 3d 20 70 43 73 72 2d 3e 70 53  *pSeg = pCsr->pS
6070: 65 67 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f  eg;..    /* Deco
6080: 64 65 20 74 68 65 20 4d 65 72 67 65 49 6e 70 75  de the MergeInpu
6090: 74 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  t structure */. 
60a0: 20 20 20 69 4c 65 61 66 20 3d 20 70 2d 3e 69 50     iLeaf = p->iP
60b0: 67 3b 0a 20 20 20 20 6e 44 65 70 74 68 20 3d 20  g;.    nDepth = 
60c0: 28 70 2d 3e 69 43 65 6c 6c 20 26 20 30 78 30 30  (p->iCell & 0x00
60d0: 46 46 29 3b 0a 20 20 20 20 69 43 65 6c 6c 20 3d  FF);.    iCell =
60e0: 20 28 70 2d 3e 69 43 65 6c 6c 20 3e 3e 20 38 29   (p->iCell >> 8)
60f0: 20 2d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c   - 1;..    /* Al
6100: 6c 6f 63 61 74 65 20 74 68 65 20 42 74 72 65 65  locate the Btree
6110: 43 75 72 73 6f 72 2e 61 50 67 5b 5d 20 61 72 72  Cursor.aPg[] arr
6120: 61 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ay */.    assert
6130: 28 20 70 43 73 72 2d 3e 61 50 67 3d 3d 30 20 29  ( pCsr->aPg==0 )
6140: 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 50 67 20  ;.    pCsr->aPg 
6150: 3d 20 28 42 74 72 65 65 50 67 20 2a 29 6c 73 6d  = (BtreePg *)lsm
6160: 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63 28 70 45 6e  MallocZeroRc(pEn
6170: 76 2c 20 73 69 7a 65 6f 66 28 42 74 72 65 65 50  v, sizeof(BtreeP
6180: 67 29 20 2a 20 6e 44 65 70 74 68 2c 20 26 72 63  g) * nDepth, &rc
6190: 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c  );..    /* Popul
61a0: 61 74 65 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ate the last ent
61b0: 72 79 20 6f 66 20 74 68 65 20 61 50 67 5b 5d 20  ry of the aPg[] 
61c0: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 66 28  array */.    if(
61d0: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
61e0: 20 20 20 20 20 50 61 67 65 20 2a 2a 70 70 20 3d       Page **pp =
61f0: 20 26 70 43 73 72 2d 3e 61 50 67 5b 6e 44 65 70   &pCsr->aPg[nDep
6200: 74 68 2d 31 5d 2e 70 50 61 67 65 3b 0a 20 20 20  th-1].pPage;.   
6210: 20 20 20 70 43 73 72 2d 3e 69 50 67 20 3d 20 6e     pCsr->iPg = n
6220: 44 65 70 74 68 2d 31 3b 0a 20 20 20 20 20 20 70  Depth-1;.      p
6230: 43 73 72 2d 3e 6e 44 65 70 74 68 20 3d 20 6e 44  Csr->nDepth = nD
6240: 65 70 74 68 3b 0a 20 20 20 20 20 20 70 43 73 72  epth;.      pCsr
6250: 2d 3e 61 50 67 5b 70 43 73 72 2d 3e 69 50 67 5d  ->aPg[pCsr->iPg]
6260: 2e 69 43 65 6c 6c 20 3d 20 69 43 65 6c 6c 3b 0a  .iCell = iCell;.
6270: 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 46 73        rc = lsmFs
6280: 44 62 50 61 67 65 47 65 74 28 70 43 73 72 2d 3e  DbPageGet(pCsr->
6290: 70 46 53 2c 20 70 53 65 67 2c 20 69 4c 65 61 66  pFS, pSeg, iLeaf
62a0: 2c 20 70 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  , pp);.    }..  
62b0: 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 61 6e    /* Populate an
62c0: 79 20 6f 74 68 65 72 20 61 50 67 5b 5d 20 61 72  y other aPg[] ar
62d0: 72 61 79 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20  ray entries */. 
62e0: 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
62f0: 4b 20 26 26 20 6e 44 65 70 74 68 3e 31 20 29 7b  K && nDepth>1 ){
6300: 0a 20 20 20 20 20 20 42 6c 6f 62 20 62 6c 6f 62  .      Blob blob
6310: 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 20 20 20 20   = {0,0,0};.    
6320: 20 20 76 6f 69 64 20 2a 70 53 65 65 6b 3b 0a 20    void *pSeek;. 
6330: 20 20 20 20 20 69 6e 74 20 6e 53 65 65 6b 3b 0a       int nSeek;.
6340: 20 20 20 20 20 20 69 6e 74 20 69 54 6f 70 69 63        int iTopic
6350: 53 65 65 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20  Seek;.      int 
6360: 69 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  iPg = 0;.      i
6370: 6e 74 20 69 4c 6f 61 64 20 3d 20 28 69 6e 74 29  nt iLoad = (int)
6380: 70 53 65 67 2d 3e 69 52 6f 6f 74 3b 0a 20 20 20  pSeg->iRoot;.   
6390: 20 20 20 50 61 67 65 20 2a 70 50 67 20 3d 20 70     Page *pPg = p
63a0: 43 73 72 2d 3e 61 50 67 5b 6e 44 65 70 74 68 2d  Csr->aPg[nDepth-
63b0: 31 5d 2e 70 50 61 67 65 3b 0a 20 0a 20 20 20 20  1].pPage;. .    
63c0: 20 20 69 66 28 20 70 61 67 65 4f 62 6a 47 65 74    if( pageObjGet
63d0: 4e 52 65 63 28 70 50 67 29 3d 3d 30 20 29 7b 0a  NRec(pPg)==0 ){.
63e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
63f0: 63 61 6e 20 68 61 70 70 65 6e 20 77 68 65 6e 20  can happen when 
6400: 70 50 67 20 69 73 20 74 68 65 20 72 69 67 68 74  pPg is the right
6410: 2d 6d 6f 73 74 20 6c 65 61 66 20 69 6e 20 74 68  -most leaf in th
6420: 65 20 62 2d 74 72 65 65 2e 0a 20 20 20 20 20 20  e b-tree..      
6430: 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
6440: 65 2c 20 73 65 74 20 74 68 65 20 69 54 6f 70 69  e, set the iTopi
6450: 63 53 65 65 6b 2f 70 53 65 65 6b 2f 6e 53 65 65  cSeek/pSeek/nSee
6460: 6b 20 6b 65 79 20 74 6f 20 61 20 76 61 6c 75 65  k key to a value
6470: 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 72 65 61  .        ** grea
6480: 74 65 72 20 74 68 61 6e 20 61 6e 79 20 72 65 61  ter than any rea
6490: 6c 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20 20  l key.  */.     
64a0: 20 20 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c     assert( iCell
64b0: 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==-1 );.        
64c0: 69 54 6f 70 69 63 53 65 65 6b 20 3d 20 31 30 30  iTopicSeek = 100
64d0: 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 65 6b  0;.        pSeek
64e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 53   = 0;.        nS
64f0: 65 65 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  eek = 0;.      }
6500: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50 67  else{.        Pg
6510: 6e 6f 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  no dummy;.      
6520: 20 20 72 63 20 3d 20 70 61 67 65 47 65 74 42 74    rc = pageGetBt
6530: 72 65 65 4b 65 79 28 70 53 65 67 2c 20 70 50 67  reeKey(pSeg, pPg
6540: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  ,.            0,
6550: 20 26 64 75 6d 6d 79 2c 20 26 69 54 6f 70 69 63   &dummy, &iTopic
6560: 53 65 65 6b 2c 20 26 70 53 65 65 6b 2c 20 26 6e  Seek, &pSeek, &n
6570: 53 65 65 6b 2c 20 26 70 43 73 72 2d 3e 62 6c 6f  Seek, &pCsr->blo
6580: 62 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  b.        );.   
6590: 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 6f 20 7b     }..      do {
65a0: 0a 20 20 20 20 20 20 20 20 50 61 67 65 20 2a 70  .        Page *p
65b0: 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
65c0: 20 6c 73 6d 46 73 44 62 50 61 67 65 47 65 74 28   lsmFsDbPageGet(
65d0: 70 43 73 72 2d 3e 70 46 53 2c 20 70 53 65 67 2c  pCsr->pFS, pSeg,
65e0: 20 69 4c 6f 61 64 2c 20 26 70 50 67 29 3b 0a 20   iLoad, &pPg);. 
65f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
6600: 63 3d 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 70 50 67  c==LSM_OK || pPg
6610: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
6620: 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc==LSM_OK ){
6630: 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61  .          u8 *a
6640: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
6650: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
6660: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 61 67 65   containing page
6670: 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 20   data */.       
6680: 20 20 20 69 6e 74 20 6e 44 61 74 61 3b 20 20 20     int nData;   
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
66a0: 2a 20 53 69 7a 65 20 6f 66 20 61 44 61 74 61 5b  * Size of aData[
66b0: 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
66c0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4d 69 6e          int iMin
66d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
66e0: 69 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20  iMax;.          
66f0: 69 6e 74 20 69 43 65 6c 6c 3b 0a 0a 20 20 20 20  int iCell;..    
6700: 20 20 20 20 20 20 61 44 61 74 61 20 3d 20 66 73        aData = fs
6710: 50 61 67 65 44 61 74 61 28 70 50 67 2c 20 26 6e  PageData(pPg, &n
6720: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  Data);.         
6730: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 47 65   assert( (pageGe
6740: 74 46 6c 61 67 73 28 61 44 61 74 61 2c 20 6e 44  tFlags(aData, nD
6750: 61 74 61 29 20 26 20 53 45 47 4d 45 4e 54 5f 42  ata) & SEGMENT_B
6760: 54 52 45 45 5f 46 4c 41 47 29 20 29 3b 0a 0a 20  TREE_FLAG) );.. 
6770: 20 20 20 20 20 20 20 20 20 69 4c 6f 61 64 20 3d           iLoad =
6780: 20 28 69 6e 74 29 70 61 67 65 47 65 74 50 74 72   (int)pageGetPtr
6790: 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a  (aData, nData);.
67a0: 20 20 20 20 20 20 20 20 20 20 69 43 65 6c 6c 20            iCell 
67b0: 3d 20 70 61 67 65 47 65 74 4e 52 65 63 28 61 44  = pageGetNRec(aD
67c0: 61 74 61 2c 20 6e 44 61 74 61 29 3b 20 0a 20 20  ata, nData); .  
67d0: 20 20 20 20 20 20 20 20 69 4d 61 78 20 3d 20 69          iMax = i
67e0: 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 20 20 20 20  Cell-1;.        
67f0: 20 20 69 4d 69 6e 20 3d 20 30 3b 0a 0a 20 20 20    iMin = 0;..   
6800: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4d         while( iM
6810: 61 78 3e 3d 69 4d 69 6e 20 29 7b 0a 20 20 20 20  ax>=iMin ){.    
6820: 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 72 79          int iTry
6830: 20 3d 20 28 69 4d 69 6e 2b 69 4d 61 78 29 2f 32   = (iMin+iMax)/2
6840: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 6f  ;.            vo
6850: 69 64 20 2a 70 4b 65 79 3b 20 69 6e 74 20 6e 4b  id *pKey; int nK
6860: 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4b  ey;         /* K
6870: 65 79 20 66 6f 72 20 63 65 6c 6c 20 69 54 72 79  ey for cell iTry
6880: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
6890: 69 6e 74 20 69 54 6f 70 69 63 3b 20 20 20 20 20  int iTopic;     
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
68b0: 20 54 6f 70 69 63 20 66 6f 72 20 6b 65 79 20 70   Topic for key p
68c0: 4b 65 79 54 2f 6e 4b 65 79 54 20 2a 2f 0a 20 20  KeyT/nKeyT */.  
68d0: 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
68e0: 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ptr;            
68f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
6900: 65 72 20 66 6f 72 20 63 65 6c 6c 20 69 54 72 79  er for cell iTry
6910: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
6920: 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6940: 20 28 70 53 65 65 6b 20 2d 20 70 4b 65 79 54 29   (pSeek - pKeyT)
6950: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
6960: 20 72 63 20 3d 20 70 61 67 65 47 65 74 42 74 72   rc = pageGetBtr
6970: 65 65 4b 65 79 28 0a 20 20 20 20 20 20 20 20 20  eeKey(.         
6980: 20 20 20 20 20 20 20 70 53 65 67 2c 20 70 50 67         pSeg, pPg
6990: 2c 20 69 54 72 79 2c 20 26 69 50 74 72 2c 20 26  , iTry, &iPtr, &
69a0: 69 54 6f 70 69 63 2c 20 26 70 4b 65 79 2c 20 26  iTopic, &pKey, &
69b0: 6e 4b 65 79 2c 20 26 62 6c 6f 62 0a 20 20 20 20  nKey, &blob.    
69c0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
69d0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 4c         if( rc!=L
69e0: 53 4d 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a  SM_OK ) break;..
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 20              res 
6a00: 3d 20 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61  = sortedKeyCompa
6a10: 72 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  re(.            
6a20: 20 20 20 20 78 43 6d 70 2c 20 69 54 6f 70 69 63      xCmp, iTopic
6a30: 53 65 65 6b 2c 20 70 53 65 65 6b 2c 20 6e 53 65  Seek, pSeek, nSe
6a40: 65 6b 2c 20 69 54 6f 70 69 63 2c 20 70 4b 65 79  ek, iTopic, pKey
6a50: 2c 20 6e 4b 65 79 0a 20 20 20 20 20 20 20 20 20  , nKey.         
6a60: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
6a70: 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d 30    assert( res!=0
6a80: 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20   );..           
6a90: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 69 4c 6f 61              iLoa
6ab0: 64 20 3d 20 28 69 6e 74 29 69 50 74 72 3b 0a 20  d = (int)iPtr;. 
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 65               iCe
6ad0: 6c 6c 20 3d 20 69 54 72 79 3b 0a 20 20 20 20 20  ll = iTry;.     
6ae0: 20 20 20 20 20 20 20 20 20 69 4d 61 78 20 3d 20           iMax = 
6af0: 69 54 72 79 2d 31 3b 0a 20 20 20 20 20 20 20 20  iTry-1;.        
6b00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6b10: 20 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20           iMin = 
6b20: 69 54 72 79 2b 31 3b 0a 20 20 20 20 20 20 20 20  iTry+1;.        
6b30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6b40: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 43 73  }..          pCs
6b50: 72 2d 3e 61 50 67 5b 69 50 67 5d 2e 70 50 61 67  r->aPg[iPg].pPag
6b60: 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20  e = pPg;.       
6b70: 20 20 20 70 43 73 72 2d 3e 61 50 67 5b 69 50 67     pCsr->aPg[iPg
6b80: 5d 2e 69 43 65 6c 6c 20 3d 20 69 43 65 6c 6c 3b  ].iCell = iCell;
6b90: 0a 20 20 20 20 20 20 20 20 20 20 69 50 67 2b 2b  .          iPg++
6ba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
6bb0: 72 74 28 20 69 50 67 21 3d 6e 44 65 70 74 68 2d  rt( iPg!=nDepth-
6bc0: 31 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1 .             
6bd0: 20 20 7c 7c 20 6c 73 6d 46 73 52 65 64 69 72 65    || lsmFsRedire
6be0: 63 74 50 61 67 65 28 70 43 73 72 2d 3e 70 46 53  ctPage(pCsr->pFS
6bf0: 2c 20 70 53 65 67 2d 3e 70 52 65 64 69 72 65 63  , pSeg->pRedirec
6c00: 74 2c 20 69 4c 6f 61 64 29 3d 3d 69 4c 65 61 66  t, iLoad)==iLeaf
6c10: 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
6c20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 77        }.      }w
6c30: 68 69 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  hile( rc==LSM_OK
6c40: 20 26 26 20 69 50 67 3c 28 6e 44 65 70 74 68 2d   && iPg<(nDepth-
6c50: 31 29 20 29 3b 0a 20 20 20 20 20 20 73 6f 72 74  1) );.      sort
6c60: 65 64 42 6c 6f 62 46 72 65 65 28 26 62 6c 6f 62  edBlobFree(&blob
6c70: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
6c80: 20 4c 6f 61 64 20 74 68 65 20 63 75 72 72 65 6e   Load the curren
6c90: 74 20 6b 65 79 20 61 6e 64 20 70 6f 69 6e 74 65  t key and pointe
6ca0: 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  r */.    if( rc=
6cb0: 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =LSM_OK ){.     
6cc0: 20 42 74 72 65 65 50 67 20 2a 70 42 74 72 65 65   BtreePg *pBtree
6cd0: 50 67 3b 0a 20 20 20 20 20 20 75 38 20 2a 61 44  Pg;.      u8 *aD
6ce0: 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ata;.      int n
6cf0: 44 61 74 61 3b 0a 0a 20 20 20 20 20 20 70 42 74  Data;..      pBt
6d00: 72 65 65 50 67 20 3d 20 26 70 43 73 72 2d 3e 61  reePg = &pCsr->a
6d10: 50 67 5b 70 43 73 72 2d 3e 69 50 67 5d 3b 0a 20  Pg[pCsr->iPg];. 
6d20: 20 20 20 20 20 61 44 61 74 61 20 3d 20 66 73 50       aData = fsP
6d30: 61 67 65 44 61 74 61 28 70 42 74 72 65 65 50 67  ageData(pBtreePg
6d40: 2d 3e 70 50 61 67 65 2c 20 26 6e 44 61 74 61 29  ->pPage, &nData)
6d50: 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 69 50  ;.      pCsr->iP
6d60: 74 72 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  tr = btreeCursor
6d70: 50 74 72 28 61 44 61 74 61 2c 20 6e 44 61 74 61  Ptr(aData, nData
6d80: 2c 20 70 42 74 72 65 65 50 67 2d 3e 69 43 65 6c  , pBtreePg->iCel
6d90: 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l+1);.      if( 
6da0: 70 42 74 72 65 65 50 67 2d 3e 69 43 65 6c 6c 3c  pBtreePg->iCell<
6db0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  0 ){.        Pgn
6dc0: 6f 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  o dummy;.       
6dd0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
6de0: 66 6f 72 28 69 3d 70 43 73 72 2d 3e 69 50 67 2d  for(i=pCsr->iPg-
6df0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
6e00: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 73           if( pCs
6e10: 72 2d 3e 61 50 67 5b 69 5d 2e 69 43 65 6c 6c 3e  r->aPg[i].iCell>
6e20: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
6e30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
6e40: 65 72 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20  ert( i>=0 );.   
6e50: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 47 65       rc = pageGe
6e60: 74 42 74 72 65 65 4b 65 79 28 70 53 65 67 2c 0a  tBtreeKey(pSeg,.
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72              pCsr
6e80: 2d 3e 61 50 67 5b 69 5d 2e 70 50 61 67 65 2c 20  ->aPg[i].pPage, 
6e90: 70 43 73 72 2d 3e 61 50 67 5b 69 5d 2e 69 43 65  pCsr->aPg[i].iCe
6ea0: 6c 6c 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  ll-1,.          
6eb0: 20 20 26 64 75 6d 6d 79 2c 20 26 70 43 73 72 2d    &dummy, &pCsr-
6ec0: 3e 65 54 79 70 65 2c 20 26 70 43 73 72 2d 3e 70  >eType, &pCsr->p
6ed0: 4b 65 79 2c 20 26 70 43 73 72 2d 3e 6e 4b 65 79  Key, &pCsr->nKey
6ee0: 2c 20 26 70 43 73 72 2d 3e 62 6c 6f 62 0a 20 20  , &pCsr->blob.  
6ef0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
6f00: 20 70 43 73 72 2d 3e 65 54 79 70 65 20 7c 3d 20   pCsr->eType |= 
6f10: 4c 53 4d 5f 53 45 50 41 52 41 54 4f 52 3b 0a 0a  LSM_SEPARATOR;..
6f20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6f30: 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43       rc = btreeC
6f40: 75 72 73 6f 72 4c 6f 61 64 4b 65 79 28 70 43 73  ursorLoadKey(pCs
6f50: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
6f60: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6f70: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
6f80: 20 62 74 72 65 65 43 75 72 73 6f 72 4e 65 77 28   btreeCursorNew(
6f90: 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 0a  .  lsm_db *pDb,.
6fa0: 20 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c    Segment *pSeg,
6fb0: 0a 20 20 42 74 72 65 65 43 75 72 73 6f 72 20 2a  .  BtreeCursor *
6fc0: 2a 70 70 43 73 72 0a 29 7b 0a 20 20 69 6e 74 20  *ppCsr.){.  int 
6fd0: 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 42  rc = LSM_OK;.  B
6fe0: 74 72 65 65 43 75 72 73 6f 72 20 2a 70 43 73 72  treeCursor *pCsr
6ff0: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
7000: 53 65 67 2d 3e 69 52 6f 6f 74 20 29 3b 0a 20 20  Seg->iRoot );.  
7010: 70 43 73 72 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63  pCsr = lsmMalloc
7020: 5a 65 72 6f 52 63 28 70 44 62 2d 3e 70 45 6e 76  ZeroRc(pDb->pEnv
7030: 2c 20 73 69 7a 65 6f 66 28 42 74 72 65 65 43 75  , sizeof(BtreeCu
7040: 72 73 6f 72 29 2c 20 26 72 63 29 3b 0a 20 20 69  rsor), &rc);.  i
7050: 66 28 20 70 43 73 72 20 29 7b 0a 20 20 20 20 70  f( pCsr ){.    p
7060: 43 73 72 2d 3e 70 46 53 20 3d 20 70 44 62 2d 3e  Csr->pFS = pDb->
7070: 70 46 53 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70  pFS;.    pCsr->p
7080: 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 20 20  Seg = pSeg;.    
7090: 70 43 73 72 2d 3e 69 50 67 20 3d 20 2d 31 3b 0a  pCsr->iPg = -1;.
70a0: 20 20 7d 0a 0a 20 20 2a 70 70 43 73 72 20 3d 20    }..  *ppCsr = 
70b0: 70 43 73 72 3b 0a 20 20 72 65 74 75 72 6e 20 72  pCsr;.  return r
70c0: 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  c;.}..static voi
70d0: 64 20 73 65 67 6d 65 6e 74 50 74 72 53 65 74 50  d segmentPtrSetP
70e0: 61 67 65 28 53 65 67 6d 65 6e 74 50 74 72 20 2a  age(SegmentPtr *
70f0: 70 50 74 72 2c 20 50 61 67 65 20 2a 70 4e 65 78  pPtr, Page *pNex
7100: 74 29 7b 0a 20 20 6c 73 6d 46 73 50 61 67 65 52  t){.  lsmFsPageR
7110: 65 6c 65 61 73 65 28 70 50 74 72 2d 3e 70 50 67  elease(pPtr->pPg
7120: 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 20 29  );.  if( pNext )
7130: 7b 0a 20 20 20 20 69 6e 74 20 6e 44 61 74 61 3b  {.    int nData;
7140: 0a 20 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d  .    u8 *aData =
7150: 20 66 73 50 61 67 65 44 61 74 61 28 70 4e 65 78   fsPageData(pNex
7160: 74 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20  t, &nData);.    
7170: 70 50 74 72 2d 3e 6e 43 65 6c 6c 20 3d 20 70 61  pPtr->nCell = pa
7180: 67 65 47 65 74 4e 52 65 63 28 61 44 61 74 61 2c  geGetNRec(aData,
7190: 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 70 50 74   nData);.    pPt
71a0: 72 2d 3e 66 6c 61 67 73 20 3d 20 28 75 31 36 29  r->flags = (u16)
71b0: 70 61 67 65 47 65 74 46 6c 61 67 73 28 61 44 61  pageGetFlags(aDa
71c0: 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20  ta, nData);.    
71d0: 70 50 74 72 2d 3e 69 50 74 72 20 3d 20 70 61 67  pPtr->iPtr = pag
71e0: 65 47 65 74 50 74 72 28 61 44 61 74 61 2c 20 6e  eGetPtr(aData, n
71f0: 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 70 50 74  Data);.  }.  pPt
7200: 72 2d 3e 70 50 67 20 3d 20 70 4e 65 78 74 3b 0a  r->pPg = pNext;.
7210: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 61 20  }../*.** Load a 
7220: 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
7230: 65 20 53 65 67 6d 65 6e 74 50 74 72 20 6f 62 6a  e SegmentPtr obj
7240: 65 63 74 20 70 50 74 72 2e 0a 2a 2f 0a 73 74 61  ect pPtr..*/.sta
7250: 74 69 63 20 69 6e 74 20 73 65 67 6d 65 6e 74 50  tic int segmentP
7260: 74 72 4c 6f 61 64 50 61 67 65 28 0a 20 20 46 69  trLoadPage(.  Fi
7270: 6c 65 53 79 73 74 65 6d 20 2a 70 46 53 2c 0a 20  leSystem *pFS,. 
7280: 20 53 65 67 6d 65 6e 74 50 74 72 20 2a 70 50 74   SegmentPtr *pPt
7290: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
72a0: 2f 2a 20 4c 6f 61 64 20 70 61 67 65 20 69 6e 74  /* Load page int
72b0: 6f 20 74 68 69 73 20 53 65 67 6d 65 6e 74 50 74  o this SegmentPt
72c0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
72d0: 74 20 69 4e 65 77 20 20 20 20 20 20 20 20 20 20  t iNew          
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
72f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e  Page number of n
7300: 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ew page */.){.  
7310: 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 20 20  Page *pPg = 0;  
7320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7330: 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 2a  * The new page *
7340: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
7370: 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 6c 73 6d  e */..  rc = lsm
7380: 46 73 44 62 50 61 67 65 47 65 74 28 70 46 53 2c  FsDbPageGet(pFS,
7390: 20 70 50 74 72 2d 3e 70 53 65 67 2c 20 69 4e 65   pPtr->pSeg, iNe
73a0: 77 2c 20 26 70 50 67 29 3b 0a 20 20 61 73 73 65  w, &pPg);.  asse
73b0: 72 74 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 7c  rt( rc==LSM_OK |
73c0: 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 73 65  | pPg==0 );.  se
73d0: 67 6d 65 6e 74 50 74 72 53 65 74 50 61 67 65 28  gmentPtrSetPage(
73e0: 70 50 74 72 2c 20 70 50 67 29 3b 0a 0a 20 20 72  pPtr, pPg);..  r
73f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
7400: 74 69 63 20 69 6e 74 20 73 65 67 6d 65 6e 74 50  tic int segmentP
7410: 74 72 52 65 61 64 44 61 74 61 28 0a 20 20 53 65  trReadData(.  Se
7420: 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 2c 0a  gmentPtr *pPtr,.
7430: 20 20 69 6e 74 20 69 4f 66 66 2c 0a 20 20 69 6e    int iOff,.  in
7440: 74 20 6e 42 79 74 65 2c 0a 20 20 76 6f 69 64 20  t nByte,.  void 
7450: 2a 2a 70 70 44 61 74 61 2c 0a 20 20 42 6c 6f 62  **ppData,.  Blob
7460: 20 2a 70 42 6c 6f 62 0a 29 7b 0a 20 20 72 65 74   *pBlob.){.  ret
7470: 75 72 6e 20 73 6f 72 74 65 64 52 65 61 64 44 61  urn sortedReadDa
7480: 74 61 28 70 50 74 72 2d 3e 70 53 65 67 2c 20 70  ta(pPtr->pSeg, p
7490: 50 74 72 2d 3e 70 50 67 2c 20 69 4f 66 66 2c 20  Ptr->pPg, iOff, 
74a0: 6e 42 79 74 65 2c 20 70 70 44 61 74 61 2c 20 70  nByte, ppData, p
74b0: 42 6c 6f 62 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Blob);.}..static
74c0: 20 69 6e 74 20 73 65 67 6d 65 6e 74 50 74 72 4e   int segmentPtrN
74d0: 65 78 74 50 61 67 65 28 0a 20 20 53 65 67 6d 65  extPage(.  Segme
74e0: 6e 74 50 74 72 20 2a 70 50 74 72 2c 20 20 20 20  ntPtr *pPtr,    
74f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61            /* Loa
7500: 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68 69 73  d page into this
7510: 20 53 65 67 6d 65 6e 74 50 74 72 20 6f 62 6a 65   SegmentPtr obje
7520: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 69 72  ct */.  int eDir
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7540: 20 20 20 20 20 20 20 2f 2a 20 2b 31 20 66 6f 72         /* +1 for
7550: 20 6e 65 78 74 28 29 2c 20 2d 31 20 66 6f 72 20   next(), -1 for 
7560: 70 72 65 76 28 29 20 2a 2f 0a 29 7b 0a 20 20 50  prev() */.){.  P
7570: 61 67 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  age *pNext;     
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7590: 20 4e 65 77 20 70 61 67 65 20 74 6f 20 6c 6f 61   New page to loa
75a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  d */.  int rc;  
75b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75c0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
75d0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
75e0: 74 28 20 65 44 69 72 3d 3d 31 20 7c 7c 20 65 44  t( eDir==1 || eD
75f0: 69 72 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65  ir==-1 );.  asse
7600: 72 74 28 20 70 50 74 72 2d 3e 70 50 67 20 29 3b  rt( pPtr->pPg );
7610: 0a 20 20 61 73 73 65 72 74 28 20 70 50 74 72 2d  .  assert( pPtr-
7620: 3e 70 53 65 67 20 7c 7c 20 65 44 69 72 3e 30 20  >pSeg || eDir>0 
7630: 29 3b 0a 0a 20 20 72 63 20 3d 20 6c 73 6d 46 73  );..  rc = lsmFs
7640: 44 62 50 61 67 65 4e 65 78 74 28 70 50 74 72 2d  DbPageNext(pPtr-
7650: 3e 70 53 65 67 2c 20 70 50 74 72 2d 3e 70 50 67  >pSeg, pPtr->pPg
7660: 2c 20 65 44 69 72 2c 20 26 70 4e 65 78 74 29 3b  , eDir, &pNext);
7670: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 4c  .  assert( rc==L
7680: 53 4d 5f 4f 4b 20 7c 7c 20 70 4e 65 78 74 3d 3d  SM_OK || pNext==
7690: 30 20 29 3b 0a 20 20 73 65 67 6d 65 6e 74 50 74  0 );.  segmentPt
76a0: 72 53 65 74 50 61 67 65 28 70 50 74 72 2c 20 70  rSetPage(pPtr, p
76b0: 4e 65 78 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Next);.  return 
76c0: 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
76d0: 74 20 73 65 67 6d 65 6e 74 50 74 72 4c 6f 61 64  t segmentPtrLoad
76e0: 43 65 6c 6c 28 0a 20 20 53 65 67 6d 65 6e 74 50  Cell(.  SegmentP
76f0: 74 72 20 2a 70 50 74 72 2c 20 20 20 20 20 20 20  tr *pPtr,       
7700: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 70         /* Load p
7710: 61 67 65 20 69 6e 74 6f 20 74 68 69 73 20 53 65  age into this Se
7720: 67 6d 65 6e 74 50 74 72 20 6f 62 6a 65 63 74 20  gmentPtr object 
7730: 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 20 20 20  */.  int iNew   
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7750: 20 20 20 20 2f 2a 20 43 65 6c 6c 20 6e 75 6d 62      /* Cell numb
7760: 65 72 20 6f 66 20 6e 65 77 20 63 65 6c 6c 20 2a  er of new cell *
7770: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
7780: 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  LSM_OK;.  if( pP
7790: 74 72 2d 3e 70 50 67 20 29 7b 0a 20 20 20 20 75  tr->pPg ){.    u
77a0: 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  8 *aData;       
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
77c0: 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
77d0: 64 61 74 61 20 62 75 66 66 65 72 20 2a 2f 0a 20  data buffer */. 
77e0: 20 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20     int iOff;    
77f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7800: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 44   /* Offset in aD
7810: 61 74 61 5b 5d 20 74 6f 20 72 65 61 64 20 66 72  ata[] to read fr
7820: 6f 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  om */.    int nP
7830: 67 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20  gsz;            
7840: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
7850: 6f 66 20 70 61 67 65 20 28 61 44 61 74 61 5b 5d  of page (aData[]
7860: 29 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  ) in bytes */.. 
7870: 20 20 20 61 73 73 65 72 74 28 20 69 4e 65 77 3c     assert( iNew<
7880: 70 50 74 72 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  pPtr->nCell );. 
7890: 20 20 20 70 50 74 72 2d 3e 69 43 65 6c 6c 20 3d     pPtr->iCell =
78a0: 20 69 4e 65 77 3b 0a 20 20 20 20 61 44 61 74 61   iNew;.    aData
78b0: 20 3d 20 66 73 50 61 67 65 44 61 74 61 28 70 50   = fsPageData(pP
78c0: 74 72 2d 3e 70 50 67 2c 20 26 6e 50 67 73 7a 29  tr->pPg, &nPgsz)
78d0: 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 6c 73 6d  ;.    iOff = lsm
78e0: 47 65 74 55 31 36 28 26 61 44 61 74 61 5b 53 45  GetU16(&aData[SE
78f0: 47 4d 45 4e 54 5f 43 45 4c 4c 50 54 52 5f 4f 46  GMENT_CELLPTR_OF
7900: 46 53 45 54 28 6e 50 67 73 7a 2c 20 70 50 74 72  FSET(nPgsz, pPtr
7910: 2d 3e 69 43 65 6c 6c 29 5d 29 3b 0a 20 20 20 20  ->iCell)]);.    
7920: 70 50 74 72 2d 3e 65 54 79 70 65 20 3d 20 61 44  pPtr->eType = aD
7930: 61 74 61 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 69  ata[iOff];.    i
7940: 4f 66 66 2b 2b 3b 0a 20 20 20 20 69 4f 66 66 20  Off++;.    iOff 
7950: 2b 3d 20 47 45 54 56 41 52 49 4e 54 36 34 28 26  += GETVARINT64(&
7960: 61 44 61 74 61 5b 69 4f 66 66 5d 2c 20 70 50 74  aData[iOff], pPt
7970: 72 2d 3e 69 50 67 50 74 72 29 3b 0a 20 20 20 20  r->iPgPtr);.    
7980: 69 4f 66 66 20 2b 3d 20 47 45 54 56 41 52 49 4e  iOff += GETVARIN
7990: 54 33 32 28 26 61 44 61 74 61 5b 69 4f 66 66 5d  T32(&aData[iOff]
79a0: 2c 20 70 50 74 72 2d 3e 6e 4b 65 79 29 3b 0a 20  , pPtr->nKey);. 
79b0: 20 20 20 69 66 28 20 72 74 49 73 57 72 69 74 65     if( rtIsWrite
79c0: 28 70 50 74 72 2d 3e 65 54 79 70 65 29 20 29 7b  (pPtr->eType) ){
79d0: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 47  .      iOff += G
79e0: 45 54 56 41 52 49 4e 54 33 32 28 26 61 44 61 74  ETVARINT32(&aDat
79f0: 61 5b 69 4f 66 66 5d 2c 20 70 50 74 72 2d 3e 6e  a[iOff], pPtr->n
7a00: 56 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Val);.    }.    
7a10: 61 73 73 65 72 74 28 20 70 50 74 72 2d 3e 6e 4b  assert( pPtr->nK
7a20: 65 79 3e 3d 30 20 29 3b 0a 0a 20 20 20 20 72 63  ey>=0 );..    rc
7a30: 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 52 65 61   = segmentPtrRea
7a40: 64 44 61 74 61 28 0a 20 20 20 20 20 20 20 20 70  dData(.        p
7a50: 50 74 72 2c 20 69 4f 66 66 2c 20 70 50 74 72 2d  Ptr, iOff, pPtr-
7a60: 3e 6e 4b 65 79 2c 20 26 70 50 74 72 2d 3e 70 4b  >nKey, &pPtr->pK
7a70: 65 79 2c 20 26 70 50 74 72 2d 3e 62 6c 6f 62 31  ey, &pPtr->blob1
7a80: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
7a90: 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 72 74  rc==LSM_OK && rt
7aa0: 49 73 57 72 69 74 65 28 70 50 74 72 2d 3e 65 54  IsWrite(pPtr->eT
7ab0: 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ype) ){.      rc
7ac0: 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 52 65 61   = segmentPtrRea
7ad0: 64 44 61 74 61 28 0a 20 20 20 20 20 20 20 20 20  dData(.         
7ae0: 20 70 50 74 72 2c 20 69 4f 66 66 2b 70 50 74 72   pPtr, iOff+pPtr
7af0: 2d 3e 6e 4b 65 79 2c 20 70 50 74 72 2d 3e 6e 56  ->nKey, pPtr->nV
7b00: 61 6c 2c 20 26 70 50 74 72 2d 3e 70 56 61 6c 2c  al, &pPtr->pVal,
7b10: 20 26 70 50 74 72 2d 3e 62 6c 6f 62 32 0a 20 20   &pPtr->blob2.  
7b20: 20 20 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65      );.    }else
7b30: 7b 0a 20 20 20 20 20 20 70 50 74 72 2d 3e 6e 56  {.      pPtr->nV
7b40: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
7b50: 74 72 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a 20 20  tr->pVal = 0;.  
7b60: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
7b70: 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  n rc;.}...static
7b80: 20 53 65 67 6d 65 6e 74 20 2a 73 6f 72 74 65 64   Segment *sorted
7b90: 53 70 6c 69 74 6b 65 79 53 65 67 6d 65 6e 74 28  SplitkeySegment(
7ba0: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 29 7b 0a  Level *pLevel){.
7bb0: 20 20 4d 65 72 67 65 20 2a 70 4d 65 72 67 65 20    Merge *pMerge 
7bc0: 3d 20 70 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65  = pLevel->pMerge
7bd0: 3b 0a 20 20 4d 65 72 67 65 49 6e 70 75 74 20 2a  ;.  MergeInput *
7be0: 70 20 3d 20 26 70 4d 65 72 67 65 2d 3e 73 70 6c  p = &pMerge->spl
7bf0: 69 74 6b 65 79 3b 0a 20 20 53 65 67 6d 65 6e 74  itkey;.  Segment
7c00: 20 2a 70 53 65 67 3b 0a 20 20 69 6e 74 20 69 3b   *pSeg;.  int i;
7c10: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
7c20: 4d 65 72 67 65 2d 3e 6e 49 6e 70 75 74 3b 20 69  Merge->nInput; i
7c30: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++){.    if( p->
7c40: 69 50 67 3d 3d 70 4d 65 72 67 65 2d 3e 61 49 6e  iPg==pMerge->aIn
7c50: 70 75 74 5b 69 5d 2e 69 50 67 20 29 20 62 72 65  put[i].iPg ) bre
7c60: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d  ak;.  }.  if( pM
7c70: 65 72 67 65 2d 3e 6e 49 6e 70 75 74 3d 3d 28 70  erge->nInput==(p
7c80: 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74 2b 31 29  Level->nRight+1)
7c90: 20 26 26 20 69 3e 3d 28 70 4d 65 72 67 65 2d 3e   && i>=(pMerge->
7ca0: 6e 49 6e 70 75 74 2d 31 29 20 29 7b 0a 20 20 20  nInput-1) ){.   
7cb0: 20 70 53 65 67 20 3d 20 26 70 4c 65 76 65 6c 2d   pSeg = &pLevel-
7cc0: 3e 70 4e 65 78 74 2d 3e 6c 68 73 3b 0a 20 20 7d  >pNext->lhs;.  }
7cd0: 65 6c 73 65 7b 0a 20 20 20 20 70 53 65 67 20 3d  else{.    pSeg =
7ce0: 20 26 70 4c 65 76 65 6c 2d 3e 61 52 68 73 5b 69   &pLevel->aRhs[i
7cf0: 5d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  ];.  }..  return
7d00: 20 70 53 65 67 3b 0a 7d 0a 0a 73 74 61 74 69 63   pSeg;.}..static
7d10: 20 76 6f 69 64 20 73 6f 72 74 65 64 53 70 6c 69   void sortedSpli
7d20: 74 6b 65 79 28 6c 73 6d 5f 64 62 20 2a 70 44 62  tkey(lsm_db *pDb
7d30: 2c 20 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  , Level *pLevel,
7d40: 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 53 65   int *pRc){.  Se
7d50: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 0a 20 20 50  gment *pSeg;.  P
7d60: 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
7d70: 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 20 3d 20  lsm_env *pEnv = 
7d80: 70 44 62 2d 3e 70 45 6e 76 3b 20 20 20 20 20 20  pDb->pEnv;      
7d90: 2f 2a 20 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 68  /* Environment h
7da0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  andle */.  int r
7db0: 63 20 3d 20 2a 70 52 63 3b 0a 20 20 4d 65 72 67  c = *pRc;.  Merg
7dc0: 65 20 2a 70 4d 65 72 67 65 20 3d 20 70 4c 65 76  e *pMerge = pLev
7dd0: 65 6c 2d 3e 70 4d 65 72 67 65 3b 0a 0a 20 20 70  el->pMerge;..  p
7de0: 53 65 67 20 3d 20 73 6f 72 74 65 64 53 70 6c 69  Seg = sortedSpli
7df0: 74 6b 65 79 53 65 67 6d 65 6e 74 28 70 4c 65 76  tkeySegment(pLev
7e00: 65 6c 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 4c  el);.  if( rc==L
7e10: 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  SM_OK ){.    rc 
7e20: 3d 20 6c 73 6d 46 73 44 62 50 61 67 65 47 65 74  = lsmFsDbPageGet
7e30: 28 70 44 62 2d 3e 70 46 53 2c 20 70 53 65 67 2c  (pDb->pFS, pSeg,
7e40: 20 70 4d 65 72 67 65 2d 3e 73 70 6c 69 74 6b 65   pMerge->splitke
7e50: 79 2e 69 50 67 2c 20 26 70 50 67 29 3b 0a 20 20  y.iPg, &pPg);.  
7e60: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f  }.  if( rc==LSM_
7e70: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 54  OK ){.    int iT
7e80: 6f 70 69 63 3b 0a 20 20 20 20 42 6c 6f 62 20 62  opic;.    Blob b
7e90: 6c 6f 62 20 3d 20 7b 30 2c 20 30 2c 20 30 2c 20  lob = {0, 0, 0, 
7ea0: 30 7d 3b 0a 20 20 20 20 75 38 20 2a 61 44 61 74  0};.    u8 *aDat
7eb0: 61 3b 0a 20 20 20 20 69 6e 74 20 6e 44 61 74 61  a;.    int nData
7ec0: 3b 0a 20 20 0a 20 20 20 20 61 44 61 74 61 20 3d  ;.  .    aData =
7ed0: 20 6c 73 6d 46 73 50 61 67 65 44 61 74 61 28 70   lsmFsPageData(p
7ee0: 50 67 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20  Pg, &nData);.   
7ef0: 20 69 66 28 20 70 61 67 65 47 65 74 46 6c 61 67   if( pageGetFlag
7f00: 73 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 20  s(aData, nData) 
7f10: 26 20 53 45 47 4d 45 4e 54 5f 42 54 52 45 45 5f  & SEGMENT_BTREE_
7f20: 46 4c 41 47 20 29 7b 0a 20 20 20 20 20 20 76 6f  FLAG ){.      vo
7f30: 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 20 20  id *pKey;.      
7f40: 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20  int nKey;.      
7f50: 50 67 6e 6f 20 64 75 6d 6d 79 3b 0a 20 20 20 20  Pgno dummy;.    
7f60: 20 20 72 63 20 3d 20 70 61 67 65 47 65 74 42 74    rc = pageGetBt
7f70: 72 65 65 4b 65 79 28 70 53 65 67 2c 0a 20 20 20  reeKey(pSeg,.   
7f80: 20 20 20 20 20 20 20 70 50 67 2c 20 70 4d 65 72         pPg, pMer
7f90: 67 65 2d 3e 73 70 6c 69 74 6b 65 79 2e 69 43 65  ge->splitkey.iCe
7fa0: 6c 6c 2c 20 26 64 75 6d 6d 79 2c 20 26 69 54 6f  ll, &dummy, &iTo
7fb0: 70 69 63 2c 20 26 70 4b 65 79 2c 20 26 6e 4b 65  pic, &pKey, &nKe
7fc0: 79 2c 20 26 62 6c 6f 62 0a 20 20 20 20 20 20 29  y, &blob.      )
7fd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
7fe0: 4c 53 4d 5f 4f 4b 20 26 26 20 62 6c 6f 62 2e 70  LSM_OK && blob.p
7ff0: 44 61 74 61 21 3d 70 4b 65 79 20 29 7b 0a 20 20  Data!=pKey ){.  
8000: 20 20 20 20 20 20 72 63 20 3d 20 73 6f 72 74 65        rc = sorte
8010: 64 42 6c 6f 62 53 65 74 28 70 45 6e 76 2c 20 26  dBlobSet(pEnv, &
8020: 62 6c 6f 62 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  blob, pKey, nKey
8030: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8040: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
8050: 20 70 61 67 65 47 65 74 4b 65 79 43 6f 70 79 28   pageGetKeyCopy(
8060: 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e 76 2c  .          pEnv,
8070: 20 70 53 65 67 2c 20 70 50 67 2c 20 70 4d 65 72   pSeg, pPg, pMer
8080: 67 65 2d 3e 73 70 6c 69 74 6b 65 79 2e 69 43 65  ge->splitkey.iCe
8090: 6c 6c 2c 20 26 69 54 6f 70 69 63 2c 20 26 62 6c  ll, &iTopic, &bl
80a0: 6f 62 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ob.      );.    
80b0: 7d 0a 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  }..    pLevel->i
80c0: 53 70 6c 69 74 54 6f 70 69 63 20 3d 20 69 54 6f  SplitTopic = iTo
80d0: 70 69 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  pic;.    pLevel-
80e0: 3e 70 53 70 6c 69 74 4b 65 79 20 3d 20 62 6c 6f  >pSplitKey = blo
80f0: 62 2e 70 44 61 74 61 3b 0a 20 20 20 20 70 4c 65  b.pData;.    pLe
8100: 76 65 6c 2d 3e 6e 53 70 6c 69 74 4b 65 79 20 3d  vel->nSplitKey =
8110: 20 62 6c 6f 62 2e 6e 44 61 74 61 3b 0a 20 20 20   blob.nData;.   
8120: 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73   lsmFsPageReleas
8130: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2a  e(pPg);.  }..  *
8140: 70 52 63 20 3d 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  pRc = rc;.}../*.
8150: 2a 2a 20 52 65 73 65 74 20 61 20 73 65 67 6d 65  ** Reset a segme
8160: 6e 74 20 63 75 72 73 6f 72 2e 20 41 6c 73 6f 20  nt cursor. Also 
8170: 66 72 65 65 20 69 74 73 20 62 75 66 66 65 72 73  free its buffers
8180: 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 54 68   if they are nTh
8190: 72 65 73 68 6f 6c 64 0a 2a 2a 20 62 79 74 65 73  reshold.** bytes
81a0: 20 6f 72 20 6c 61 72 67 65 72 20 69 6e 20 73 69   or larger in si
81b0: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ze..*/.static vo
81c0: 69 64 20 73 65 67 6d 65 6e 74 50 74 72 52 65 73  id segmentPtrRes
81d0: 65 74 28 53 65 67 6d 65 6e 74 50 74 72 20 2a 70  et(SegmentPtr *p
81e0: 50 74 72 2c 20 69 6e 74 20 6e 54 68 72 65 73 68  Ptr, int nThresh
81f0: 6f 6c 64 29 7b 0a 20 20 6c 73 6d 46 73 50 61 67  old){.  lsmFsPag
8200: 65 52 65 6c 65 61 73 65 28 70 50 74 72 2d 3e 70  eRelease(pPtr->p
8210: 50 67 29 3b 0a 20 20 70 50 74 72 2d 3e 70 50 67  Pg);.  pPtr->pPg
8220: 20 3d 20 30 3b 0a 20 20 70 50 74 72 2d 3e 6e 43   = 0;.  pPtr->nC
8230: 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 74 72 2d  ell = 0;.  pPtr-
8240: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 50 74  >pKey = 0;.  pPt
8250: 72 2d 3e 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->nKey = 0;.  p
8260: 50 74 72 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a 20  Ptr->pVal = 0;. 
8270: 20 70 50 74 72 2d 3e 6e 56 61 6c 20 3d 20 30 3b   pPtr->nVal = 0;
8280: 0a 20 20 70 50 74 72 2d 3e 65 54 79 70 65 20 3d  .  pPtr->eType =
8290: 20 30 3b 0a 20 20 70 50 74 72 2d 3e 69 43 65 6c   0;.  pPtr->iCel
82a0: 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 74  l = 0;.  if( pPt
82b0: 72 2d 3e 62 6c 6f 62 31 2e 6e 41 6c 6c 6f 63 3e  r->blob1.nAlloc>
82c0: 3d 6e 54 68 72 65 73 68 6f 6c 64 20 29 20 73 6f  =nThreshold ) so
82d0: 72 74 65 64 42 6c 6f 62 46 72 65 65 28 26 70 50  rtedBlobFree(&pP
82e0: 74 72 2d 3e 62 6c 6f 62 31 29 3b 0a 20 20 69 66  tr->blob1);.  if
82f0: 28 20 70 50 74 72 2d 3e 62 6c 6f 62 32 2e 6e 41  ( pPtr->blob2.nA
8300: 6c 6c 6f 63 3e 3d 6e 54 68 72 65 73 68 6f 6c 64  lloc>=nThreshold
8310: 20 29 20 73 6f 72 74 65 64 42 6c 6f 62 46 72 65   ) sortedBlobFre
8320: 65 28 26 70 50 74 72 2d 3e 62 6c 6f 62 32 29 3b  e(&pPtr->blob2);
8330: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .}..static int s
8340: 65 67 6d 65 6e 74 50 74 72 49 67 6e 6f 72 65 53  egmentPtrIgnoreS
8350: 65 70 61 72 61 74 6f 72 73 28 4d 75 6c 74 69 43  eparators(MultiC
8360: 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 53 65 67  ursor *pCsr, Seg
8370: 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 29 7b 0a  mentPtr *pPtr){.
8380: 20 20 72 65 74 75 72 6e 20 28 70 43 73 72 2d 3e    return (pCsr->
8390: 66 6c 61 67 73 20 26 20 43 55 52 53 4f 52 5f 52  flags & CURSOR_R
83a0: 45 41 44 5f 53 45 50 41 52 41 54 4f 52 53 29 3d  EAD_SEPARATORS)=
83b0: 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 74  =0.      || (pPt
83c0: 72 21 3d 26 70 43 73 72 2d 3e 61 50 74 72 5b 70  r!=&pCsr->aPtr[p
83d0: 43 73 72 2d 3e 6e 50 74 72 2d 31 5d 29 3b 0a 7d  Csr->nPtr-1]);.}
83e0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 67  ..static int seg
83f0: 6d 65 6e 74 50 74 72 41 64 76 61 6e 63 65 28 0a  mentPtrAdvance(.
8400: 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70    MultiCursor *p
8410: 43 73 72 2c 20 0a 20 20 53 65 67 6d 65 6e 74 50  Csr, .  SegmentP
8420: 74 72 20 2a 70 50 74 72 2c 0a 20 20 69 6e 74 20  tr *pPtr,.  int 
8430: 62 52 65 76 65 72 73 65 0a 29 7b 0a 20 20 69 6e  bReverse.){.  in
8440: 74 20 65 44 69 72 20 3d 20 28 62 52 65 76 65 72  t eDir = (bRever
8450: 73 65 20 3f 20 2d 31 20 3a 20 31 29 3b 0a 20 20  se ? -1 : 1);.  
8460: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 70 50  Level *pLvl = pP
8470: 74 72 2d 3e 70 4c 65 76 65 6c 3b 0a 20 20 64 6f  tr->pLevel;.  do
8480: 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20   {.    int rc;. 
8490: 20 20 20 69 6e 74 20 69 43 65 6c 6c 3b 20 20 20     int iCell;   
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
84c0: 77 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 2a  w cell in page *
84d0: 2f 0a 20 20 20 20 69 6e 74 20 73 76 46 6c 61 67  /.    int svFlag
84e0: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
84f0: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 50 74      /* SegmentPt
8500: 72 2e 65 54 79 70 65 20 62 65 66 6f 72 65 20 61  r.eType before a
8510: 64 76 61 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 69  dvance */..    i
8520: 43 65 6c 6c 20 3d 20 70 50 74 72 2d 3e 69 43 65  Cell = pPtr->iCe
8530: 6c 6c 20 2b 20 65 44 69 72 3b 0a 20 20 20 20 61  ll + eDir;.    a
8540: 73 73 65 72 74 28 20 70 50 74 72 2d 3e 70 50 67  ssert( pPtr->pPg
8550: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8560: 69 43 65 6c 6c 3c 3d 70 50 74 72 2d 3e 6e 43 65  iCell<=pPtr->nCe
8570: 6c 6c 20 26 26 20 69 43 65 6c 6c 3e 3d 2d 31 20  ll && iCell>=-1 
8580: 29 3b 0a 0a 20 20 20 20 69 66 28 20 62 52 65 76  );..    if( bRev
8590: 65 72 73 65 20 26 26 20 70 50 74 72 2d 3e 70 53  erse && pPtr->pS
85a0: 65 67 21 3d 26 70 50 74 72 2d 3e 70 4c 65 76 65  eg!=&pPtr->pLeve
85b0: 6c 2d 3e 6c 68 73 20 29 7b 0a 20 20 20 20 20 20  l->lhs ){.      
85c0: 73 76 46 6c 61 67 73 20 3d 20 70 50 74 72 2d 3e  svFlags = pPtr->
85d0: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73  eType;.      ass
85e0: 65 72 74 28 20 73 76 46 6c 61 67 73 20 29 3b 0a  ert( svFlags );.
85f0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
8600: 43 65 6c 6c 3e 3d 70 50 74 72 2d 3e 6e 43 65 6c  Cell>=pPtr->nCel
8610: 6c 20 7c 7c 20 69 43 65 6c 6c 3c 30 20 29 7b 0a  l || iCell<0 ){.
8620: 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
8630: 20 20 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50     rc = segmentP
8640: 74 72 4e 65 78 74 50 61 67 65 28 70 50 74 72 2c  trNextPage(pPtr,
8650: 20 65 44 69 72 29 3b 20 0a 20 20 20 20 20 20 7d   eDir); .      }
8660: 77 68 69 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f  while( rc==LSM_O
8670: 4b 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  K .           &&
8680: 20 70 50 74 72 2d 3e 70 50 67 20 0a 20 20 20 20   pPtr->pPg .    
8690: 20 20 20 20 20 20 20 26 26 20 28 70 50 74 72 2d         && (pPtr-
86a0: 3e 6e 43 65 6c 6c 3d 3d 30 20 7c 7c 20 28 70 50  >nCell==0 || (pP
86b0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 53 45 47 4d  tr->flags & SEGM
86c0: 45 4e 54 5f 42 54 52 45 45 5f 46 4c 41 47 29 20  ENT_BTREE_FLAG) 
86d0: 29 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ) .      );.    
86e0: 20 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b    if( rc!=LSM_OK
86f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
8700: 20 20 20 20 69 43 65 6c 6c 20 3d 20 62 52 65 76      iCell = bRev
8710: 65 72 73 65 20 3f 20 28 70 50 74 72 2d 3e 6e 43  erse ? (pPtr->nC
8720: 65 6c 6c 2d 31 29 20 3a 20 30 3b 0a 20 20 20 20  ell-1) : 0;.    
8730: 7d 0a 20 20 20 20 72 63 20 3d 20 73 65 67 6d 65  }.    rc = segme
8740: 6e 74 50 74 72 4c 6f 61 64 43 65 6c 6c 28 70 50  ntPtrLoadCell(pP
8750: 74 72 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 20 20  tr, iCell);.    
8760: 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29  if( rc!=LSM_OK )
8770: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
8780: 20 69 66 28 20 73 76 46 6c 61 67 73 20 26 26 20   if( svFlags && 
8790: 70 50 74 72 2d 3e 70 50 67 20 29 7b 0a 20 20 20  pPtr->pPg ){.   
87a0: 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 6f 72     int res = sor
87b0: 74 65 64 4b 65 79 43 6f 6d 70 61 72 65 28 70 43  tedKeyCompare(pC
87c0: 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70 2c 0a 20  sr->pDb->xCmp,. 
87d0: 20 20 20 20 20 20 20 20 20 72 74 54 6f 70 69 63           rtTopic
87e0: 28 70 50 74 72 2d 3e 65 54 79 70 65 29 2c 20 70  (pPtr->eType), p
87f0: 50 74 72 2d 3e 70 4b 65 79 2c 20 70 50 74 72 2d  Ptr->pKey, pPtr-
8800: 3e 6e 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20  >nKey,.         
8810: 20 70 4c 76 6c 2d 3e 69 53 70 6c 69 74 54 6f 70   pLvl->iSplitTop
8820: 69 63 2c 20 70 4c 76 6c 2d 3e 70 53 70 6c 69 74  ic, pLvl->pSplit
8830: 4b 65 79 2c 20 70 4c 76 6c 2d 3e 6e 53 70 6c 69  Key, pLvl->nSpli
8840: 74 4b 65 79 0a 20 20 20 20 20 20 29 3b 0a 20 20  tKey.      );.  
8850: 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 20      if( res<0 ) 
8860: 73 65 67 6d 65 6e 74 50 74 72 52 65 73 65 74 28  segmentPtrReset(
8870: 70 50 74 72 2c 20 4c 53 4d 5f 53 45 47 4d 45 4e  pPtr, LSM_SEGMEN
8880: 54 50 54 52 5f 46 52 45 45 5f 54 48 52 45 53 48  TPTR_FREE_THRESH
8890: 4f 4c 44 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OLD);.    }..   
88a0: 20 69 66 28 20 70 50 74 72 2d 3e 70 50 67 3d 3d   if( pPtr->pPg==
88b0: 30 20 26 26 20 28 73 76 46 6c 61 67 73 20 26 20  0 && (svFlags & 
88c0: 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45 54 45 29 20  LSM_END_DELETE) 
88d0: 29 7b 0a 20 20 20 20 20 20 53 65 67 6d 65 6e 74  ){.      Segment
88e0: 20 2a 70 53 65 67 20 3d 20 70 50 74 72 2d 3e 70   *pSeg = pPtr->p
88f0: 53 65 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Seg;.      rc = 
8900: 6c 73 6d 46 73 44 62 50 61 67 65 47 65 74 28 70  lsmFsDbPageGet(p
8910: 43 73 72 2d 3e 70 44 62 2d 3e 70 46 53 2c 20 70  Csr->pDb->pFS, p
8920: 53 65 67 2c 20 70 53 65 67 2d 3e 69 46 69 72 73  Seg, pSeg->iFirs
8930: 74 2c 20 26 70 50 74 72 2d 3e 70 50 67 29 3b 0a  t, &pPtr->pPg);.
8940: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 4c 53        if( rc!=LS
8950: 4d 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  M_OK ) return rc
8960: 3b 0a 20 20 20 20 20 20 70 50 74 72 2d 3e 65 54  ;.      pPtr->eT
8970: 79 70 65 20 3d 20 4c 53 4d 5f 53 54 41 52 54 5f  ype = LSM_START_
8980: 44 45 4c 45 54 45 20 7c 20 4c 53 4d 5f 50 4f 49  DELETE | LSM_POI
8990: 4e 54 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  NT_DELETE;.     
89a0: 20 70 50 74 72 2d 3e 65 54 79 70 65 20 7c 3d 20   pPtr->eType |= 
89b0: 28 70 4c 76 6c 2d 3e 69 53 70 6c 69 74 54 6f 70  (pLvl->iSplitTop
89c0: 69 63 20 3f 20 4c 53 4d 5f 53 59 53 54 45 4d 4b  ic ? LSM_SYSTEMK
89d0: 45 59 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70  EY : 0);.      p
89e0: 50 74 72 2d 3e 70 4b 65 79 20 3d 20 70 4c 76 6c  Ptr->pKey = pLvl
89f0: 2d 3e 70 53 70 6c 69 74 4b 65 79 3b 0a 20 20 20  ->pSplitKey;.   
8a00: 20 20 20 70 50 74 72 2d 3e 6e 4b 65 79 20 3d 20     pPtr->nKey = 
8a10: 70 4c 76 6c 2d 3e 6e 53 70 6c 69 74 4b 65 79 3b  pLvl->nSplitKey;
8a20: 0a 20 20 20 20 7d 0a 0a 20 20 7d 77 68 69 6c 65  .    }..  }while
8a30: 28 20 70 43 73 72 20 0a 20 20 20 20 20 20 20 26  ( pCsr .       &
8a40: 26 20 70 50 74 72 2d 3e 70 50 67 20 0a 20 20 20  & pPtr->pPg .   
8a50: 20 20 20 20 26 26 20 73 65 67 6d 65 6e 74 50 74      && segmentPt
8a60: 72 49 67 6e 6f 72 65 53 65 70 61 72 61 74 6f 72  rIgnoreSeparator
8a70: 73 28 70 43 73 72 2c 20 70 50 74 72 29 0a 20 20  s(pCsr, pPtr).  
8a80: 20 20 20 20 20 26 26 20 72 74 49 73 53 65 70 61       && rtIsSepa
8a90: 72 61 74 6f 72 28 70 50 74 72 2d 3e 65 54 79 70  rator(pPtr->eTyp
8aa0: 65 29 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  e).  );..  retur
8ab0: 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  n LSM_OK;.}..sta
8ac0: 74 69 63 20 76 6f 69 64 20 73 65 67 6d 65 6e 74  tic void segment
8ad0: 50 74 72 45 6e 64 50 61 67 65 28 0a 20 20 46 69  PtrEndPage(.  Fi
8ae0: 6c 65 53 79 73 74 65 6d 20 2a 70 46 53 2c 20 0a  leSystem *pFS, .
8af0: 20 20 53 65 67 6d 65 6e 74 50 74 72 20 2a 70 50    SegmentPtr *pP
8b00: 74 72 2c 20 0a 20 20 69 6e 74 20 62 4c 61 73 74  tr, .  int bLast
8b10: 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 0a 29 7b  , .  int *pRc.){
8b20: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 4c 53 4d  .  if( *pRc==LSM
8b30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 53 65 67 6d 65  _OK ){.    Segme
8b40: 6e 74 20 2a 70 53 65 67 20 3d 20 70 50 74 72 2d  nt *pSeg = pPtr-
8b50: 3e 70 53 65 67 3b 0a 20 20 20 20 50 61 67 65 20  >pSeg;.    Page 
8b60: 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
8b70: 66 28 20 62 4c 61 73 74 20 29 7b 0a 20 20 20 20  f( bLast ){.    
8b80: 20 20 2a 70 52 63 20 3d 20 6c 73 6d 46 73 44 62    *pRc = lsmFsDb
8b90: 50 61 67 65 4c 61 73 74 28 70 46 53 2c 20 70 53  PageLast(pFS, pS
8ba0: 65 67 2c 20 26 70 4e 65 77 29 3b 0a 20 20 20 20  eg, &pNew);.    
8bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
8bc0: 63 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65 47  c = lsmFsDbPageG
8bd0: 65 74 28 70 46 53 2c 20 70 53 65 67 2c 20 70 53  et(pFS, pSeg, pS
8be0: 65 67 2d 3e 69 46 69 72 73 74 2c 20 26 70 4e 65  eg->iFirst, &pNe
8bf0: 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65  w);.    }.    se
8c00: 67 6d 65 6e 74 50 74 72 53 65 74 50 61 67 65 28  gmentPtrSetPage(
8c10: 70 50 74 72 2c 20 70 4e 65 77 29 3b 0a 20 20 7d  pPtr, pNew);.  }
8c20: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
8c30: 6f 20 6d 6f 76 65 20 74 68 65 20 73 65 67 6d 65  o move the segme
8c40: 6e 74 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65  nt pointer passe
8c50: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
8c60: 61 72 67 75 6d 65 6e 74 20 73 6f 20 74 68 61 74  argument so that
8c70: 20 69 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 61 74   it.** points at
8c80: 20 65 69 74 68 65 72 20 74 68 65 20 66 69 72 73   either the firs
8c90: 74 20 28 62 4c 61 73 74 3d 3d 30 29 20 6f 72 20  t (bLast==0) or 
8ca0: 6c 61 73 74 20 28 62 4c 61 73 74 3d 3d 31 29 20  last (bLast==1) 
8cb0: 63 65 6c 6c 20 69 6e 20 74 68 65 20 76 61 6c 69  cell in the vali
8cc0: 64 0a 2a 2a 20 72 65 67 69 6f 6e 20 6f 66 20 74  d.** region of t
8cd0: 68 65 20 73 65 67 6d 65 6e 74 20 64 65 66 69 6e  he segment defin
8ce0: 65 64 20 62 79 20 70 50 74 72 2d 3e 69 46 69 72  ed by pPtr->iFir
8cf0: 73 74 20 61 6e 64 20 70 50 74 72 2d 3e 69 4c 61  st and pPtr->iLa
8d00: 73 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  st..**.** Return
8d10: 20 4c 53 4d 5f 4f 4b 20 69 66 20 73 75 63 63 65   LSM_OK if succe
8d20: 73 73 66 75 6c 20 6f 72 20 61 6e 20 6c 73 6d 20  ssful or an lsm 
8d30: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
8d40: 6d 65 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  mething goes.** 
8d50: 77 72 6f 6e 67 20 28 49 4f 20 65 72 72 6f 72 2c  wrong (IO error,
8d60: 20 4f 4f 4d 20 65 74 63 2e 29 2e 0a 2a 2f 0a 73   OOM etc.)..*/.s
8d70: 74 61 74 69 63 20 69 6e 74 20 73 65 67 6d 65 6e  tatic int segmen
8d80: 74 50 74 72 45 6e 64 28 4d 75 6c 74 69 43 75 72  tPtrEnd(MultiCur
8d90: 73 6f 72 20 2a 70 43 73 72 2c 20 53 65 67 6d 65  sor *pCsr, Segme
8da0: 6e 74 50 74 72 20 2a 70 50 74 72 2c 20 69 6e 74  ntPtr *pPtr, int
8db0: 20 62 4c 61 73 74 29 7b 0a 20 20 4c 65 76 65 6c   bLast){.  Level
8dc0: 20 2a 70 4c 76 6c 20 3d 20 70 50 74 72 2d 3e 70   *pLvl = pPtr->p
8dd0: 4c 65 76 65 6c 3b 0a 20 20 69 6e 74 20 72 63 20  Level;.  int rc 
8de0: 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 46 69 6c 65  = LSM_OK;.  File
8df0: 53 79 73 74 65 6d 20 2a 70 46 53 20 3d 20 70 43  System *pFS = pC
8e00: 73 72 2d 3e 70 44 62 2d 3e 70 46 53 3b 0a 20 20  sr->pDb->pFS;.  
8e10: 69 6e 74 20 62 49 67 6e 6f 72 65 3b 0a 0a 20 20  int bIgnore;..  
8e20: 73 65 67 6d 65 6e 74 50 74 72 45 6e 64 50 61 67  segmentPtrEndPag
8e30: 65 28 70 46 53 2c 20 70 50 74 72 2c 20 62 4c 61  e(pFS, pPtr, bLa
8e40: 73 74 2c 20 26 72 63 29 3b 0a 20 20 77 68 69 6c  st, &rc);.  whil
8e50: 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  e( rc==LSM_OK &&
8e60: 20 70 50 74 72 2d 3e 70 50 67 20 0a 20 20 20 20   pPtr->pPg .    
8e70: 20 20 26 26 20 28 70 50 74 72 2d 3e 6e 43 65 6c    && (pPtr->nCel
8e80: 6c 3d 3d 30 20 7c 7c 20 28 70 50 74 72 2d 3e 66  l==0 || (pPtr->f
8e90: 6c 61 67 73 20 26 20 53 45 47 4d 45 4e 54 5f 42  lags & SEGMENT_B
8ea0: 54 52 45 45 5f 46 4c 41 47 29 29 0a 20 20 29 7b  TREE_FLAG)).  ){
8eb0: 0a 20 20 20 20 72 63 20 3d 20 73 65 67 6d 65 6e  .    rc = segmen
8ec0: 74 50 74 72 4e 65 78 74 50 61 67 65 28 70 50 74  tPtrNextPage(pPt
8ed0: 72 2c 20 28 62 4c 61 73 74 20 3f 20 2d 31 20 3a  r, (bLast ? -1 :
8ee0: 20 31 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   1));.  }..  if(
8ef0: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70   rc==LSM_OK && p
8f00: 50 74 72 2d 3e 70 50 67 20 29 7b 0a 20 20 20 20  Ptr->pPg ){.    
8f10: 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 4c  rc = segmentPtrL
8f20: 6f 61 64 43 65 6c 6c 28 70 50 74 72 2c 20 62 4c  oadCell(pPtr, bL
8f30: 61 73 74 20 3f 20 28 70 50 74 72 2d 3e 6e 43 65  ast ? (pPtr->nCe
8f40: 6c 6c 2d 31 29 20 3a 20 30 29 3b 0a 20 20 20 20  ll-1) : 0);.    
8f50: 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26  if( rc==LSM_OK &
8f60: 26 20 62 4c 61 73 74 20 26 26 20 70 50 74 72 2d  & bLast && pPtr-
8f70: 3e 70 53 65 67 21 3d 26 70 4c 76 6c 2d 3e 6c 68  >pSeg!=&pLvl->lh
8f80: 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  s ){.      int r
8f90: 65 73 20 3d 20 73 6f 72 74 65 64 4b 65 79 43 6f  es = sortedKeyCo
8fa0: 6d 70 61 72 65 28 70 43 73 72 2d 3e 70 44 62 2d  mpare(pCsr->pDb-
8fb0: 3e 78 43 6d 70 2c 0a 20 20 20 20 20 20 20 20 20  >xCmp,.         
8fc0: 20 72 74 54 6f 70 69 63 28 70 50 74 72 2d 3e 65   rtTopic(pPtr->e
8fd0: 54 79 70 65 29 2c 20 70 50 74 72 2d 3e 70 4b 65  Type), pPtr->pKe
8fe0: 79 2c 20 70 50 74 72 2d 3e 6e 4b 65 79 2c 0a 20  y, pPtr->nKey,. 
8ff0: 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69           pLvl->i
9000: 53 70 6c 69 74 54 6f 70 69 63 2c 20 70 4c 76 6c  SplitTopic, pLvl
9010: 2d 3e 70 53 70 6c 69 74 4b 65 79 2c 20 70 4c 76  ->pSplitKey, pLv
9020: 6c 2d 3e 6e 53 70 6c 69 74 4b 65 79 0a 20 20 20  l->nSplitKey.   
9030: 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
9040: 72 65 73 3c 30 20 29 20 73 65 67 6d 65 6e 74 50  res<0 ) segmentP
9050: 74 72 52 65 73 65 74 28 70 50 74 72 2c 20 4c 53  trReset(pPtr, LS
9060: 4d 5f 53 45 47 4d 45 4e 54 50 54 52 5f 46 52 45  M_SEGMENTPTR_FRE
9070: 45 5f 54 48 52 45 53 48 4f 4c 44 29 3b 0a 20 20  E_THRESHOLD);.  
9080: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 62 49 67    }.  }.  .  bIg
9090: 6e 6f 72 65 20 3d 20 73 65 67 6d 65 6e 74 50 74  nore = segmentPt
90a0: 72 49 67 6e 6f 72 65 53 65 70 61 72 61 74 6f 72  rIgnoreSeparator
90b0: 73 28 70 43 73 72 2c 20 70 50 74 72 29 3b 0a 20  s(pCsr, pPtr);. 
90c0: 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
90d0: 26 26 20 70 50 74 72 2d 3e 70 50 67 20 26 26 20  && pPtr->pPg && 
90e0: 62 49 67 6e 6f 72 65 20 26 26 20 72 74 49 73 53  bIgnore && rtIsS
90f0: 65 70 61 72 61 74 6f 72 28 70 50 74 72 2d 3e 65  eparator(pPtr->e
9100: 54 79 70 65 29 20 29 7b 0a 20 20 20 20 72 63 20  Type) ){.    rc 
9110: 3d 20 73 65 67 6d 65 6e 74 50 74 72 41 64 76 61  = segmentPtrAdva
9120: 6e 63 65 28 70 43 73 72 2c 20 70 50 74 72 2c 20  nce(pCsr, pPtr, 
9130: 62 4c 61 73 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  bLast);.  }..#if
9140: 20 30 0a 20 20 69 66 28 20 62 4c 61 73 74 20 26   0.  if( bLast &
9150: 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20  & rc==LSM_OK && 
9160: 70 50 74 72 2d 3e 70 50 67 0a 20 20 20 26 26 20  pPtr->pPg.   && 
9170: 70 50 74 72 2d 3e 70 53 65 67 3d 3d 26 70 4c 76  pPtr->pSeg==&pLv
9180: 6c 2d 3e 6c 68 73 20 0a 20 20 20 26 26 20 70 4c  l->lhs .   && pL
9190: 76 6c 2d 3e 6e 52 69 67 68 74 20 26 26 20 28 70  vl->nRight && (p
91a0: 50 74 72 2d 3e 65 54 79 70 65 20 26 20 4c 53 4d  Ptr->eType & LSM
91b0: 5f 53 54 41 52 54 5f 44 45 4c 45 54 45 29 0a 20  _START_DELETE). 
91c0: 20 29 7b 0a 20 20 20 20 70 50 74 72 2d 3e 69 43   ){.    pPtr->iC
91d0: 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 74 72 2d  ell++;.    pPtr-
91e0: 3e 65 54 79 70 65 20 3d 20 4c 53 4d 5f 45 4e 44  >eType = LSM_END
91f0: 5f 44 45 4c 45 54 45 20 7c 20 28 70 4c 76 6c 2d  _DELETE | (pLvl-
9200: 3e 69 53 70 6c 69 74 54 6f 70 69 63 29 3b 0a 20  >iSplitTopic);. 
9210: 20 20 20 70 50 74 72 2d 3e 70 4b 65 79 20 3d 20     pPtr->pKey = 
9220: 70 4c 76 6c 2d 3e 70 53 70 6c 69 74 4b 65 79 3b  pLvl->pSplitKey;
9230: 0a 20 20 20 20 70 50 74 72 2d 3e 6e 4b 65 79 20  .    pPtr->nKey 
9240: 3d 20 70 4c 76 6c 2d 3e 6e 53 70 6c 69 74 4b 65  = pLvl->nSplitKe
9250: 79 3b 0a 20 20 20 20 70 50 74 72 2d 3e 70 56 61  y;.    pPtr->pVa
9260: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 74 72 2d  l = 0;.    pPtr-
9270: 3e 6e 56 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 23  >nVal = 0;.  }.#
9280: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
9290: 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  rc;.}..static vo
92a0: 69 64 20 73 65 67 6d 65 6e 74 50 74 72 4b 65 79  id segmentPtrKey
92b0: 28 53 65 67 6d 65 6e 74 50 74 72 20 2a 70 50 74  (SegmentPtr *pPt
92c0: 72 2c 20 76 6f 69 64 20 2a 2a 70 70 4b 65 79 2c  r, void **ppKey,
92d0: 20 69 6e 74 20 2a 70 6e 4b 65 79 29 7b 0a 20 20   int *pnKey){.  
92e0: 61 73 73 65 72 74 28 20 70 50 74 72 2d 3e 70 50  assert( pPtr->pP
92f0: 67 20 29 3b 0a 20 20 2a 70 70 4b 65 79 20 3d 20  g );.  *ppKey = 
9300: 70 50 74 72 2d 3e 70 4b 65 79 3b 0a 20 20 2a 70  pPtr->pKey;.  *p
9310: 6e 4b 65 79 20 3d 20 70 50 74 72 2d 3e 6e 4b 65  nKey = pPtr->nKe
9320: 79 3b 0a 7d 0a 0a 23 69 66 20 30 20 2f 2a 20 4e  y;.}..#if 0 /* N
9330: 4f 54 20 55 53 45 44 20 2a 2f 0a 73 74 61 74 69  OT USED */.stati
9340: 63 20 63 68 61 72 20 2a 6b 65 79 54 6f 53 74 72  c char *keyToStr
9350: 69 6e 67 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e  ing(lsm_env *pEn
9360: 76 2c 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  v, void *pKey, i
9370: 6e 74 20 6e 4b 65 79 29 7b 0a 20 20 69 6e 74 20  nt nKey){.  int 
9380: 69 3b 0a 20 20 75 38 20 2a 61 4b 65 79 20 3d 20  i;.  u8 *aKey = 
9390: 28 75 38 20 2a 29 70 4b 65 79 3b 0a 20 20 63 68  (u8 *)pKey;.  ch
93a0: 61 72 20 2a 7a 52 65 74 20 3d 20 28 63 68 61 72  ar *zRet = (char
93b0: 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 28 70 45 6e   *)lsmMalloc(pEn
93c0: 76 2c 20 6e 4b 65 79 2b 31 29 3b 0a 0a 20 20 66  v, nKey+1);..  f
93d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20  or(i=0; i<nKey; 
93e0: 69 2b 2b 29 7b 0a 20 20 20 20 7a 52 65 74 5b 69  i++){.    zRet[i
93f0: 5d 20 3d 20 28 63 68 61 72 29 28 69 73 61 6c 6e  ] = (char)(isaln
9400: 75 6d 28 61 4b 65 79 5b 69 5d 29 20 3f 20 61 4b  um(aKey[i]) ? aK
9410: 65 79 5b 69 5d 20 3a 20 27 2e 27 29 3b 0a 20 20  ey[i] : '.');.  
9420: 7d 0a 20 20 7a 52 65 74 5b 6e 4b 65 79 5d 20 3d  }.  zRet[nKey] =
9430: 20 27 5c 30 27 3b 0a 20 20 72 65 74 75 72 6e 20   '\0';.  return 
9440: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
9450: 23 69 66 20 30 20 2f 2a 20 4e 4f 54 20 55 53 45  #if 0 /* NOT USE
9460: 44 20 2a 2f 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  D */./*.** Check
9470: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 74   that the page t
9480: 68 61 74 20 70 50 74 72 20 63 75 72 72 65 6e 74  hat pPtr current
9490: 6c 79 20 68 61 73 20 6c 6f 61 64 65 64 20 69 73  ly has loaded is
94a0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
94b0: 65 0a 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66  e.** to search f
94c0: 6f 72 20 6b 65 79 20 28 70 4b 65 79 2f 6e 4b 65  or key (pKey/nKe
94d0: 79 29 2e 20 49 66 20 69 74 20 69 73 2c 20 72 65  y). If it is, re
94e0: 74 75 72 6e 20 31 2e 20 4f 74 68 65 72 77 69 73  turn 1. Otherwis
94f0: 65 2c 20 61 6e 20 61 73 73 65 72 74 0a 2a 2a 20  e, an assert.** 
9500: 66 61 69 6c 73 20 61 6e 64 20 74 68 69 73 20 66  fails and this f
9510: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
9520: 20 72 65 74 75 72 6e 2e 0a 2a 2f 0a 73 74 61 74   return..*/.stat
9530: 69 63 20 69 6e 74 20 61 73 73 65 72 74 4b 65 79  ic int assertKey
9540: 4c 6f 63 61 74 69 6f 6e 28 0a 20 20 4d 75 6c 74  Location(.  Mult
9550: 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a  iCursor *pCsr, .
9560: 20 20 53 65 67 6d 65 6e 74 50 74 72 20 2a 70 50    SegmentPtr *pP
9570: 74 72 2c 20 0a 20 20 76 6f 69 64 20 2a 70 4b 65  tr, .  void *pKe
9580: 79 2c 20 69 6e 74 20 6e 4b 65 79 0a 29 7b 0a 20  y, int nKey.){. 
9590: 20 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 20 3d   lsm_env *pEnv =
95a0: 20 6c 73 6d 46 73 45 6e 76 28 70 43 73 72 2d 3e   lsmFsEnv(pCsr->
95b0: 70 44 62 2d 3e 70 46 53 29 3b 0a 20 20 42 6c 6f  pDb->pFS);.  Blo
95c0: 62 20 62 6c 6f 62 20 3d 20 7b 30 2c 20 30 2c 20  b blob = {0, 0, 
95d0: 30 7d 3b 0a 20 20 69 6e 74 20 65 44 69 72 3b 0a  0};.  int eDir;.
95e0: 20 20 69 6e 74 20 69 54 6f 70 69 63 20 3d 20 30    int iTopic = 0
95f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9600: 20 20 2f 2a 20 54 4f 44 4f 3a 20 46 69 78 20 6d    /* TODO: Fix m
9610: 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 65 44 69 72  e */..  for(eDir
9620: 3d 2d 31 3b 20 65 44 69 72 3c 3d 31 3b 20 65 44  =-1; eDir<=1; eD
9630: 69 72 2b 3d 32 29 7b 0a 20 20 20 20 50 61 67 65  ir+=2){.    Page
9640: 20 2a 70 54 65 73 74 20 3d 20 70 50 74 72 2d 3e   *pTest = pPtr->
9650: 70 50 67 3b 0a 0a 20 20 20 20 6c 73 6d 46 73 50  pPg;..    lsmFsP
9660: 61 67 65 52 65 66 28 70 54 65 73 74 29 3b 0a 20  ageRef(pTest);. 
9670: 20 20 20 77 68 69 6c 65 28 20 70 54 65 73 74 20     while( pTest 
9680: 29 7b 0a 20 20 20 20 20 20 53 65 67 6d 65 6e 74  ){.      Segment
9690: 20 2a 70 53 65 67 20 3d 20 70 50 74 72 2d 3e 70   *pSeg = pPtr->p
96a0: 53 65 67 3b 0a 20 20 20 20 20 20 50 61 67 65 20  Seg;.      Page 
96b0: 2a 70 4e 65 78 74 3b 0a 0a 20 20 20 20 20 20 69  *pNext;..      i
96c0: 6e 74 20 72 63 20 3d 20 6c 73 6d 46 73 44 62 50  nt rc = lsmFsDbP
96d0: 61 67 65 4e 65 78 74 28 70 53 65 67 2c 20 70 54  ageNext(pSeg, pT
96e0: 65 73 74 2c 20 65 44 69 72 2c 20 26 70 4e 65 78  est, eDir, &pNex
96f0: 74 29 3b 0a 20 20 20 20 20 20 6c 73 6d 46 73 50  t);.      lsmFsP
9700: 61 67 65 52 65 6c 65 61 73 65 28 70 54 65 73 74  ageRelease(pTest
9710: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
9720: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
9730: 20 20 70 54 65 73 74 20 3d 20 70 4e 65 78 74 3b    pTest = pNext;
9740: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 73  ..      if( pTes
9750: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
9760: 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20   nData;.        
9770: 75 38 20 2a 61 44 61 74 61 20 3d 20 66 73 50 61  u8 *aData = fsPa
9780: 67 65 44 61 74 61 28 70 54 65 73 74 2c 20 26 6e  geData(pTest, &n
9790: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69  Data);.        i
97a0: 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 61 67 65 47  nt nCell = pageG
97b0: 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44  etNRec(aData, nD
97c0: 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  ata);.        in
97d0: 74 20 66 6c 61 67 73 20 3d 20 70 61 67 65 47 65  t flags = pageGe
97e0: 74 46 6c 61 67 73 28 61 44 61 74 61 2c 20 6e 44  tFlags(aData, nD
97f0: 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ata);.        if
9800: 28 20 6e 43 65 6c 6c 20 26 26 20 30 3d 3d 28 66  ( nCell && 0==(f
9810: 6c 61 67 73 26 53 45 47 4d 45 4e 54 5f 42 54 52  lags&SEGMENT_BTR
9820: 45 45 5f 46 4c 41 47 29 20 29 7b 0a 20 20 20 20  EE_FLAG) ){.    
9830: 20 20 20 20 20 20 69 6e 74 20 6e 50 67 4b 65 79        int nPgKey
9840: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
9850: 69 50 67 54 6f 70 69 63 3b 0a 20 20 20 20 20 20  iPgTopic;.      
9860: 20 20 20 20 75 38 20 2a 70 50 67 4b 65 79 3b 0a      u8 *pPgKey;.
9870: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 65            int re
9880: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  s;.          int
9890: 20 69 43 65 6c 6c 3b 0a 0a 20 20 20 20 20 20 20   iCell;..       
98a0: 20 20 20 69 43 65 6c 6c 20 3d 20 28 28 65 44 69     iCell = ((eDi
98b0: 72 20 3c 20 30 29 20 3f 20 28 6e 43 65 6c 6c 2d  r < 0) ? (nCell-
98c0: 31 29 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20  1) : 0);.       
98d0: 20 20 20 70 50 67 4b 65 79 20 3d 20 70 61 67 65     pPgKey = page
98e0: 47 65 74 4b 65 79 28 70 53 65 67 2c 20 70 54 65  GetKey(pSeg, pTe
98f0: 73 74 2c 20 69 43 65 6c 6c 2c 20 26 69 50 67 54  st, iCell, &iPgT
9900: 6f 70 69 63 2c 20 26 6e 50 67 4b 65 79 2c 20 26  opic, &nPgKey, &
9910: 62 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 20  blob);.         
9920: 20 72 65 73 20 3d 20 69 54 6f 70 69 63 20 2d 20   res = iTopic - 
9930: 69 50 67 54 6f 70 69 63 3b 0a 20 20 20 20 20 20  iPgTopic;.      
9940: 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
9950: 20 72 65 73 20 3d 20 70 43 73 72 2d 3e 70 44 62   res = pCsr->pDb
9960: 2d 3e 78 43 6d 70 28 70 4b 65 79 2c 20 6e 4b 65  ->xCmp(pKey, nKe
9970: 79 2c 20 70 50 67 4b 65 79 2c 20 6e 50 67 4b 65  y, pPgKey, nPgKe
9980: 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  y);.          if
9990: 28 20 28 65 44 69 72 3d 3d 31 20 26 26 20 72 65  ( (eDir==1 && re
99a0: 73 3e 30 29 20 7c 7c 20 28 65 44 69 72 3d 3d 2d  s>0) || (eDir==-
99b0: 31 20 26 26 20 72 65 73 3c 30 29 20 29 7b 0a 20  1 && res<0) ){. 
99c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
99d0: 6b 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68  king this branch
99e0: 20 6d 65 61 6e 73 20 73 6f 6d 65 74 68 69 6e 67   means something
99f0: 20 68 61 73 20 67 6f 6e 65 20 77 72 6f 6e 67 2e   has gone wrong.
9a00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
9a10: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 6c 73 6d  char *zMsg = lsm
9a20: 4d 61 6c 6c 6f 63 50 72 69 6e 74 66 28 70 45 6e  MallocPrintf(pEn
9a30: 76 2c 20 22 4b 65 79 20 5c 22 25 73 5c 22 20 69  v, "Key \"%s\" i
9a40: 73 20 6e 6f 74 20 6f 6e 20 70 61 67 65 20 25 64  s not on page %d
9a50: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
9a60: 20 20 20 20 6b 65 79 54 6f 53 74 72 69 6e 67 28      keyToString(
9a70: 70 45 6e 76 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  pEnv, pKey, nKey
9a80: 29 2c 20 6c 73 6d 46 73 50 61 67 65 4e 75 6d 62  ), lsmFsPageNumb
9a90: 65 72 28 70 50 74 72 2d 3e 70 50 67 29 0a 20 20  er(pPtr->pPg).  
9aa0: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
9ab0: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
9ac0: 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c  (stderr, "%s\n",
9ad0: 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20   zMsg);.        
9ae0: 20 20 20 20 61 73 73 65 72 74 28 20 21 22 61 73      assert( !"as
9af0: 73 65 72 74 4b 65 79 4c 6f 63 61 74 69 6f 6e 28  sertKeyLocation(
9b00: 29 20 66 61 69 6c 65 64 22 20 29 3b 0a 20 20 20  ) failed" );.   
9b10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9b20: 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65     lsmFsPageRele
9b30: 61 73 65 28 70 54 65 73 74 29 3b 0a 20 20 20 20  ase(pTest);.    
9b40: 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 30 3b        pTest = 0;
9b50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9b60: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
9b70: 73 6f 72 74 65 64 42 6c 6f 62 46 72 65 65 28 26  sortedBlobFree(&
9b80: 62 6c 6f 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  blob);.  return 
9b90: 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  1;.}.#endif..#if
9ba0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
9bb0: 69 63 20 69 6e 74 20 61 73 73 65 72 74 53 65 65  ic int assertSee
9bc0: 6b 52 65 73 75 6c 74 28 0a 20 20 4d 75 6c 74 69  kResult(.  Multi
9bd0: 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 0a 20 20  Cursor *pCsr,.  
9be0: 53 65 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72  SegmentPtr *pPtr
9bf0: 2c 0a 20 20 69 6e 74 20 69 54 6f 70 69 63 2c 0a  ,.  int iTopic,.
9c00: 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 0a 20 20    void *pKey,.  
9c10: 69 6e 74 20 6e 4b 65 79 2c 0a 20 20 69 6e 74 20  int nKey,.  int 
9c20: 65 53 65 65 6b 0a 29 7b 0a 20 20 69 66 28 20 70  eSeek.){.  if( p
9c30: 50 74 72 2d 3e 70 50 67 20 29 7b 0a 20 20 20 20  Ptr->pPg ){.    
9c40: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 72 65 73  int res;.    res
9c50: 20 3d 20 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70   = sortedKeyComp
9c60: 61 72 65 28 70 43 73 72 2d 3e 70 44 62 2d 3e 78  are(pCsr->pDb->x
9c70: 43 6d 70 2c 20 69 54 6f 70 69 63 2c 20 70 4b 65  Cmp, iTopic, pKe
9c80: 79 2c 20 6e 4b 65 79 2c 0a 20 20 20 20 20 20 20  y, nKey,.       
9c90: 20 72 74 54 6f 70 69 63 28 70 50 74 72 2d 3e 65   rtTopic(pPtr->e
9ca0: 54 79 70 65 29 2c 20 70 50 74 72 2d 3e 70 4b 65  Type), pPtr->pKe
9cb0: 79 2c 20 70 50 74 72 2d 3e 6e 4b 65 79 0a 20 20  y, pPtr->nKey.  
9cc0: 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 53    );..    if( eS
9cd0: 65 65 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 45 51  eek==LSM_SEEK_EQ
9ce0: 20 29 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d   ) return (res==
9cf0: 30 29 3b 0a 20 20 20 20 69 66 28 20 65 53 65 65  0);.    if( eSee
9d00: 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 4c 45 20 29  k==LSM_SEEK_LE )
9d10: 20 72 65 74 75 72 6e 20 28 72 65 73 3e 3d 30 29   return (res>=0)
9d20: 3b 0a 20 20 20 20 69 66 28 20 65 53 65 65 6b 3d  ;.    if( eSeek=
9d30: 3d 4c 53 4d 5f 53 45 45 4b 5f 47 45 20 29 20 72  =LSM_SEEK_GE ) r
9d40: 65 74 75 72 6e 20 28 72 65 73 3c 3d 30 29 3b 0a  eturn (res<=0);.
9d50: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b    }..  return 1;
9d60: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  .}.#endif..stati
9d70: 63 20 69 6e 74 20 73 65 67 6d 65 6e 74 50 74 72  c int segmentPtr
9d80: 53 65 61 72 63 68 4f 76 65 72 73 69 7a 65 64 28  SearchOversized(
9d90: 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  .  MultiCursor *
9da0: 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCsr,           
9db0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 63 6f 6e     /* Cursor con
9dc0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 67 6d 65 6e  text */.  Segmen
9dd0: 74 50 74 72 20 2a 70 50 74 72 2c 20 20 20 20 20  tPtr *pPtr,     
9de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
9df0: 6e 74 65 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a  nter to seek */.
9e00: 20 20 69 6e 74 20 69 54 6f 70 69 63 2c 20 20 20    int iTopic,   
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e20: 20 20 2f 2a 20 54 6f 70 69 63 20 6f 66 20 6b 65    /* Topic of ke
9e30: 79 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  y to search for 
9e40: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c  */.  void *pKey,
9e50: 20 69 6e 74 20 6e 4b 65 79 20 20 20 20 20 20 20   int nKey       
9e60: 20 20 20 20 20 2f 2a 20 4b 65 79 20 74 6f 20 73       /* Key to s
9e70: 65 65 6b 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69  eek to */.){.  i
9e80: 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 20  nt (*xCmp)(void 
9e90: 2a 2c 20 69 6e 74 2c 20 76 6f 69 64 20 2a 2c 20  *, int, void *, 
9ea0: 69 6e 74 29 20 3d 20 70 43 73 72 2d 3e 70 44 62  int) = pCsr->pDb
9eb0: 2d 3e 78 43 6d 70 3b 0a 20 20 69 6e 74 20 72 63  ->xCmp;.  int rc
9ec0: 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20 20 2f 2a   = LSM_OK;..  /*
9ed0: 20 49 66 20 74 68 65 20 4f 56 45 52 53 49 5a 45   If the OVERSIZE
9ee0: 44 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  D flag is set, t
9ef0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
9f00: 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 0a 20  pointer in the. 
9f10: 20 2a 2a 20 75 70 70 65 72 20 6c 65 76 65 6c 20   ** upper level 
9f20: 74 6f 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  to the next page
9f30: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20   in the segment 
9f40: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 74  that contains at
9f50: 20 6c 65 61 73 74 0a 20 20 2a 2a 20 6f 6e 65 20   least.  ** one 
9f60: 6b 65 79 2e 20 53 6f 20 63 6f 6d 70 61 72 65 20  key. So compare 
9f70: 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
9f80: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
9f90: 61 67 65 20 77 69 74 68 20 74 68 65 0a 20 20 2a  age with the.  *
9fa0: 2a 20 6b 65 79 20 62 65 69 6e 67 20 73 6f 75 67  * key being soug
9fb0: 68 74 20 28 70 4b 65 79 2f 6e 4b 65 79 29 2e 20  ht (pKey/nKey). 
9fc0: 49 66 20 28 70 4b 65 79 2f 6e 4b 65 79 29 20 69  If (pKey/nKey) i
9fd0: 73 20 6c 61 72 67 65 72 2c 20 61 64 76 61 6e 63  s larger, advanc
9fe0: 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6e 65  e.  ** to the ne
9ff0: 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 73  xt page in the s
a000: 65 67 6d 65 6e 74 20 74 68 61 74 20 63 6f 6e 74  egment that cont
a010: 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
a020: 65 20 6b 65 79 2e 20 0a 20 20 2a 2f 0a 20 20 77  e key. .  */.  w
a030: 68 69 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  hile( rc==LSM_OK
a040: 20 26 26 20 28 70 50 74 72 2d 3e 66 6c 61 67 73   && (pPtr->flags
a050: 20 26 20 50 47 46 54 52 5f 53 4b 49 50 5f 4e 45   & PGFTR_SKIP_NE
a060: 58 54 5f 46 4c 41 47 29 20 29 7b 0a 20 20 20 20  XT_FLAG) ){.    
a070: 75 38 20 2a 70 4c 61 73 74 4b 65 79 3b 0a 20 20  u8 *pLastKey;.  
a080: 20 20 69 6e 74 20 6e 4c 61 73 74 4b 65 79 3b 0a    int nLastKey;.
a090: 20 20 20 20 69 6e 74 20 69 4c 61 73 74 54 6f 70      int iLastTop
a0a0: 69 63 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b  ic;.    int res;
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
a0d0: 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f  of comparison */
a0e0: 0a 20 20 20 20 50 61 67 65 20 2a 70 4e 65 78 74  .    Page *pNext
a0f0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
a100: 68 65 20 6c 61 73 74 20 6b 65 79 20 6f 6e 20 74  he last key on t
a110: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
a120: 20 2a 2f 0a 20 20 20 20 70 4c 61 73 74 4b 65 79   */.    pLastKey
a130: 20 3d 20 70 61 67 65 47 65 74 4b 65 79 28 70 50   = pageGetKey(pP
a140: 74 72 2d 3e 70 53 65 67 2c 0a 20 20 20 20 20 20  tr->pSeg,.      
a150: 20 20 70 50 74 72 2d 3e 70 50 67 2c 20 70 50 74    pPtr->pPg, pPt
a160: 72 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 26 69 4c 61  r->nCell-1, &iLa
a170: 73 74 54 6f 70 69 63 2c 20 26 6e 4c 61 73 74 4b  stTopic, &nLastK
a180: 65 79 2c 20 26 70 50 74 72 2d 3e 62 6c 6f 62 31  ey, &pPtr->blob1
a190: 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  .    );..    /* 
a1a0: 49 66 20 74 68 65 20 6c 6f 61 64 65 64 20 6b 65  If the loaded ke
a1b0: 79 20 69 73 20 3e 3d 20 74 68 61 6e 20 28 70 4b  y is >= than (pK
a1c0: 65 79 2f 6e 4b 65 79 29 2c 20 62 72 65 61 6b 20  ey/nKey), break 
a1d0: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  out of the loop.
a1e0: 0a 20 20 20 20 2a 2a 20 49 66 20 28 70 4b 65 79  .    ** If (pKey
a1f0: 2f 6e 4b 65 79 29 20 69 73 20 70 72 65 73 65 6e  /nKey) is presen
a200: 74 20 69 6e 20 74 68 69 73 20 61 72 72 61 79 2c  t in this array,
a210: 20 69 74 20 6d 75 73 74 20 62 65 20 6f 6e 20 74   it must be on t
a220: 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20  he current .    
a230: 2a 2a 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ** page.  */.   
a240: 20 72 65 73 20 3d 20 73 6f 72 74 65 64 4b 65 79   res = sortedKey
a250: 43 6f 6d 70 61 72 65 28 0a 20 20 20 20 20 20 20  Compare(.       
a260: 20 78 43 6d 70 2c 20 69 4c 61 73 74 54 6f 70 69   xCmp, iLastTopi
a270: 63 2c 20 70 4c 61 73 74 4b 65 79 2c 20 6e 4c 61  c, pLastKey, nLa
a280: 73 74 4b 65 79 2c 20 69 54 6f 70 69 63 2c 20 70  stKey, iTopic, p
a290: 4b 65 79 2c 20 6e 4b 65 79 0a 20 20 20 20 29 3b  Key, nKey.    );
a2a0: 0a 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20  .    if( res>=0 
a2b0: 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
a2c0: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
a2d0: 6e 65 78 74 20 70 61 67 65 20 74 68 61 74 20 63  next page that c
a2e0: 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
a2f0: 20 6f 6e 65 20 6b 65 79 2e 20 2a 2f 0a 20 20 20   one key. */.   
a300: 20 70 4e 65 78 74 20 3d 20 70 50 74 72 2d 3e 70   pNext = pPtr->p
a310: 50 67 3b 0a 20 20 20 20 6c 73 6d 46 73 50 61 67  Pg;.    lsmFsPag
a320: 65 52 65 66 28 70 4e 65 78 74 29 3b 0a 20 20 20  eRef(pNext);.   
a330: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
a340: 20 20 20 50 61 67 65 20 2a 70 4c 6f 61 64 3b 0a     Page *pLoad;.
a350: 20 20 20 20 20 20 75 38 20 2a 61 44 61 74 61 3b        u8 *aData;
a360: 20 69 6e 74 20 6e 44 61 74 61 3b 0a 0a 20 20 20   int nData;..   
a370: 20 20 20 72 63 20 3d 20 6c 73 6d 46 73 44 62 50     rc = lsmFsDbP
a380: 61 67 65 4e 65 78 74 28 70 50 74 72 2d 3e 70 53  ageNext(pPtr->pS
a390: 65 67 2c 20 70 4e 65 78 74 2c 20 31 2c 20 26 70  eg, pNext, 1, &p
a3a0: 4c 6f 61 64 29 3b 0a 20 20 20 20 20 20 6c 73 6d  Load);.      lsm
a3b0: 46 73 50 61 67 65 52 65 6c 65 61 73 65 28 70 4e  FsPageRelease(pN
a3c0: 65 78 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  ext);.      pNex
a3d0: 74 20 3d 20 70 4c 6f 61 64 3b 0a 20 20 20 20 20  t = pLoad;.     
a3e0: 20 69 66 28 20 70 4e 65 78 74 3d 3d 30 20 29 20   if( pNext==0 ) 
a3f0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 61 73  break;..      as
a400: 73 65 72 74 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  sert( rc==LSM_OK
a410: 20 29 3b 0a 20 20 20 20 20 20 61 44 61 74 61 20   );.      aData 
a420: 3d 20 6c 73 6d 46 73 50 61 67 65 44 61 74 61 28  = lsmFsPageData(
a430: 70 4e 65 78 74 2c 20 26 6e 44 61 74 61 29 3b 0a  pNext, &nData);.
a440: 20 20 20 20 20 20 69 66 28 20 28 70 61 67 65 47        if( (pageG
a450: 65 74 46 6c 61 67 73 28 61 44 61 74 61 2c 20 6e  etFlags(aData, n
a460: 44 61 74 61 29 20 26 20 53 45 47 4d 45 4e 54 5f  Data) & SEGMENT_
a470: 42 54 52 45 45 5f 46 4c 41 47 29 3d 3d 30 0a 20  BTREE_FLAG)==0. 
a480: 20 20 20 20 20 20 26 26 20 70 61 67 65 47 65 74        && pageGet
a490: 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44 61 74  NRec(aData, nDat
a4a0: 61 29 3e 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  a)>0.      ){.  
a4b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a4c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
a4d0: 66 28 20 70 4e 65 78 74 3d 3d 30 20 29 20 62 72  f( pNext==0 ) br
a4e0: 65 61 6b 3b 0a 20 20 20 20 73 65 67 6d 65 6e 74  eak;.    segment
a4f0: 50 74 72 53 65 74 50 61 67 65 28 70 50 74 72 2c  PtrSetPage(pPtr,
a500: 20 70 4e 65 78 74 29 3b 0a 0a 20 20 20 20 2f 2a   pNext);..    /*
a510: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 70 72 6f   This should pro
a520: 62 61 62 6c 79 20 62 65 20 61 6e 20 4c 53 4d 5f  bably be an LSM_
a530: 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 2a  CORRUPT error. *
a540: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  /.    assert( rc
a550: 21 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 28 70 50 74  !=LSM_OK || (pPt
a560: 72 2d 3e 66 6c 61 67 73 20 26 20 50 47 46 54 52  r->flags & PGFTR
a570: 5f 53 4b 49 50 5f 54 48 49 53 5f 46 4c 41 47 29  _SKIP_THIS_FLAG)
a580: 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   );.  }..  retur
a590: 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
a5a0: 69 6e 74 20 70 74 72 46 77 64 50 6f 69 6e 74 65  int ptrFwdPointe
a5b0: 72 28 0a 20 20 50 61 67 65 20 2a 70 50 61 67 65  r(.  Page *pPage
a5c0: 2c 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 0a 20  ,.  int iCell,. 
a5d0: 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 0a   Segment *pSeg,.
a5e0: 20 20 50 67 6e 6f 20 2a 70 69 50 74 72 2c 0a 20    Pgno *piPtr,. 
a5f0: 20 69 6e 74 20 2a 70 62 46 6f 75 6e 64 0a 29 7b   int *pbFound.){
a600: 0a 20 20 50 61 67 65 20 2a 70 50 67 20 3d 20 70  .  Page *pPg = p
a610: 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 46 69 72  Page;.  int iFir
a620: 73 74 20 3d 20 69 43 65 6c 6c 3b 0a 20 20 69 6e  st = iCell;.  in
a630: 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 0a  t rc = LSM_OK;..
a640: 20 20 64 6f 20 7b 0a 20 20 20 20 50 61 67 65 20    do {.    Page 
a650: 2a 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  *pNext = 0;.    
a660: 75 38 20 2a 61 44 61 74 61 3b 0a 20 20 20 20 69  u8 *aData;.    i
a670: 6e 74 20 6e 44 61 74 61 3b 0a 0a 20 20 20 20 61  nt nData;..    a
a680: 44 61 74 61 20 3d 20 6c 73 6d 46 73 50 61 67 65  Data = lsmFsPage
a690: 44 61 74 61 28 70 50 67 2c 20 26 6e 44 61 74 61  Data(pPg, &nData
a6a0: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 61 67 65  );.    if( (page
a6b0: 47 65 74 46 6c 61 67 73 28 61 44 61 74 61 2c 20  GetFlags(aData, 
a6c0: 6e 44 61 74 61 29 20 26 20 53 45 47 4d 45 4e 54  nData) & SEGMENT
a6d0: 5f 42 54 52 45 45 5f 46 4c 41 47 29 3d 3d 30 20  _BTREE_FLAG)==0 
a6e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
a6f0: 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20        int nCell 
a700: 3d 20 70 61 67 65 47 65 74 4e 52 65 63 28 61 44  = pageGetNRec(aD
a710: 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20  ata, nData);.   
a720: 20 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b     for(i=iFirst;
a730: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
a740: 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
a750: 20 3d 20 2a 70 61 67 65 47 65 74 43 65 6c 6c 28   = *pageGetCell(
a760: 61 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 69 29  aData, nData, i)
a770: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65  ;.        if( (e
a780: 54 79 70 65 20 26 20 4c 53 4d 5f 53 54 41 52 54  Type & LSM_START
a790: 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20  _DELETE)==0 ){. 
a7a0: 20 20 20 20 20 20 20 20 20 2a 70 62 46 6f 75 6e           *pbFoun
a7b0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  d = 1;.         
a7c0: 20 2a 70 69 50 74 72 20 3d 20 70 61 67 65 47 65   *piPtr = pageGe
a7d0: 74 52 65 63 6f 72 64 50 74 72 28 61 44 61 74 61  tRecordPtr(aData
a7e0: 2c 20 6e 44 61 74 61 2c 20 69 29 20 2b 20 70 61  , nData, i) + pa
a7f0: 67 65 47 65 74 50 74 72 28 61 44 61 74 61 2c 20  geGetPtr(aData, 
a800: 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  nData);.        
a810: 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61    lsmFsPageRelea
a820: 73 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  se(pPg);.       
a830: 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b     return LSM_OK
a840: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a850: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
a860: 63 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65 4e  c = lsmFsDbPageN
a870: 65 78 74 28 70 53 65 67 2c 20 70 50 67 2c 20 31  ext(pSeg, pPg, 1
a880: 2c 20 26 70 4e 65 78 74 29 3b 0a 20 20 20 20 6c  , &pNext);.    l
a890: 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65 28  smFsPageRelease(
a8a0: 70 50 67 29 3b 0a 20 20 20 20 70 50 67 20 3d 20  pPg);.    pPg = 
a8b0: 70 4e 65 78 74 3b 0a 20 20 20 20 69 46 69 72 73  pNext;.    iFirs
a8c0: 74 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28  t = 0;.  }while(
a8d0: 20 70 50 67 20 26 26 20 72 63 3d 3d 4c 53 4d 5f   pPg && rc==LSM_
a8e0: 4f 4b 20 29 3b 0a 20 20 6c 73 6d 46 73 50 61 67  OK );.  lsmFsPag
a8f0: 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 0a  eRelease(pPg);..
a900: 20 20 2a 70 62 46 6f 75 6e 64 20 3d 20 30 3b 0a    *pbFound = 0;.
a910: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a920: 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74 65  static int sorte
a930: 64 52 68 73 46 69 72 73 74 28 4d 75 6c 74 69 43  dRhsFirst(MultiC
a940: 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 4c 65 76  ursor *pCsr, Lev
a950: 65 6c 20 2a 70 4c 76 6c 2c 20 53 65 67 6d 65 6e  el *pLvl, Segmen
a960: 74 50 74 72 20 2a 70 50 74 72 29 7b 0a 20 20 69  tPtr *pPtr){.  i
a970: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 65  nt rc;.  rc = se
a980: 67 6d 65 6e 74 50 74 72 45 6e 64 28 70 43 73 72  gmentPtrEnd(pCsr
a990: 2c 20 70 50 74 72 2c 20 30 29 3b 0a 20 20 77 68  , pPtr, 0);.  wh
a9a0: 69 6c 65 28 20 70 50 74 72 2d 3e 70 50 67 20 26  ile( pPtr->pPg &
a9b0: 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  & rc==LSM_OK ){.
a9c0: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 73 6f      int res = so
a9d0: 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65 28 70  rtedKeyCompare(p
a9e0: 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70 2c 0a  Csr->pDb->xCmp,.
a9f0: 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 53          pLvl->iS
aa00: 70 6c 69 74 54 6f 70 69 63 2c 20 70 4c 76 6c 2d  plitTopic, pLvl-
aa10: 3e 70 53 70 6c 69 74 4b 65 79 2c 20 70 4c 76 6c  >pSplitKey, pLvl
aa20: 2d 3e 6e 53 70 6c 69 74 4b 65 79 2c 0a 20 20 20  ->nSplitKey,.   
aa30: 20 20 20 20 20 72 74 54 6f 70 69 63 28 70 50 74       rtTopic(pPt
aa40: 72 2d 3e 65 54 79 70 65 29 2c 20 70 50 74 72 2d  r->eType), pPtr-
aa50: 3e 70 4b 65 79 2c 20 70 50 74 72 2d 3e 6e 4b 65  >pKey, pPtr->nKe
aa60: 79 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  y.    );.    if(
aa70: 20 72 65 73 3c 3d 30 20 29 20 62 72 65 61 6b 3b   res<=0 ) break;
aa80: 0a 20 20 20 20 72 63 20 3d 20 73 65 67 6d 65 6e  .    rc = segmen
aa90: 74 50 74 72 41 64 76 61 6e 63 65 28 70 43 73 72  tPtrAdvance(pCsr
aaa0: 2c 20 70 50 74 72 2c 20 30 29 3b 0a 20 20 7d 0a  , pPtr, 0);.  }.
aab0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
aac0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
aad0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
aae0: 73 20 70 61 72 74 20 6f 66 20 61 20 53 45 45 4b  s part of a SEEK
aaf0: 5f 47 45 20 6f 70 20 6f 6e 20 61 20 6d 75 6c 74  _GE op on a mult
ab00: 69 2d 63 75 72 73 6f 72 20 69 66 20 74 68 65 20  i-cursor if the 
ab10: 0a 2a 2a 20 46 43 20 70 6f 69 6e 74 65 72 20 72  .** FC pointer r
ab20: 65 61 64 20 66 72 6f 6d 20 73 65 67 6d 65 6e 74  ead from segment
ab30: 20 2a 70 50 74 72 20 63 6f 6d 65 73 20 66 72 6f   *pPtr comes fro
ab40: 6d 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  m an entry with 
ab50: 74 68 65 20 0a 2a 2a 20 4c 53 4d 5f 53 54 41 52  the .** LSM_STAR
ab60: 54 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 73 65  T_DELETE flag se
ab70: 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
ab80: 74 68 65 20 70 6f 69 6e 74 65 72 20 76 61 6c 75  the pointer valu
ab90: 65 20 63 61 6e 6e 6f 74 20 62 65 20 0a 2a 2a 20  e cannot be .** 
aba0: 74 72 75 73 74 65 64 2e 20 49 6e 73 74 65 61 64  trusted. Instead
abb0: 2c 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 68  , the pointer th
abc0: 61 74 20 73 68 6f 75 6c 64 20 62 65 20 66 6f 6c  at should be fol
abd0: 6c 6f 77 65 64 20 69 73 20 74 68 61 74 20 61 73  lowed is that as
abe0: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
abf0: 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
ac00: 69 6e 20 2a 70 50 74 72 20 74 68 61 74 20 64 6f  in *pPtr that do
ac10: 65 73 20 6e 6f 74 20 68 61 76 65 20 4c 53 4d 5f  es not have LSM_
ac20: 53 54 41 52 54 5f 44 45 4c 45 54 45 20 73 65 74  START_DELETE set
ac30: 2e 0a 2a 2a 0a 2a 2a 20 57 68 79 20 74 68 65 20  ..**.** Why the 
ac40: 70 6f 69 6e 74 65 72 73 20 63 61 6e 27 74 20 62  pointers can't b
ac50: 65 20 74 72 75 73 74 65 64 3a 0a 2a 2a 0a 2a 2a  e trusted:.**.**
ac60: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69  .**.** TODO: Thi
ac70: 73 20 69 73 20 61 20 73 74 6f 70 2d 67 61 70 20  s is a stop-gap 
ac80: 73 6f 6c 75 74 69 6f 6e 3a 0a 2a 2a 20 0a 2a 2a  solution:.** .**
ac90: 20 20 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74     At the moment
aca0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
acb0: 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  is called from w
acc0: 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 50 74 72  ithin segmentPtr
acd0: 53 65 65 6b 28 29 2c 20 0a 2a 2a 20 20 20 61 73  Seek(), .**   as
ace0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 69   part of the ini
acf0: 74 69 61 6c 20 6c 73 6d 4d 43 75 72 73 6f 72 53  tial lsmMCursorS
ad00: 65 65 6b 28 29 20 63 61 6c 6c 2e 20 48 6f 77 65  eek() call. Howe
ad10: 76 65 72 2c 20 63 6f 6e 73 69 64 65 72 20 61 20  ver, consider a 
ad20: 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 20 77  .**   database w
ad30: 68 65 72 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  here the followi
ad40: 6e 67 20 68 61 73 20 6f 63 63 75 72 72 65 64 3a  ng has occurred:
ad50: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20 41  .**.**      1. A
ad60: 20 72 61 6e 67 65 20 64 65 6c 65 74 65 20 72 65   range delete re
ad70: 6d 6f 76 65 73 20 6b 65 79 73 20 31 2e 2e 39 39  moves keys 1..99
ad80: 39 39 20 75 73 69 6e 67 20 61 20 72 61 6e 67 65  99 using a range
ad90: 20 64 65 6c 65 74 65 2e 0a 2a 2a 20 20 20 20 20   delete..**     
ada0: 20 32 2e 20 4b 65 79 73 20 31 20 74 68 72 6f 75   2. Keys 1 throu
adb0: 67 68 20 39 39 39 39 20 61 72 65 20 72 65 69 6e  gh 9999 are rein
adc0: 73 65 72 74 65 64 2e 0a 2a 2a 20 20 20 20 20 20  serted..**      
add0: 33 2e 20 54 68 65 20 6c 65 76 65 6c 73 20 63 6f  3. The levels co
ade0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6f 70 73  ntaining the ops
adf0: 20 69 6e 20 31 2e 20 61 6e 64 20 32 2e 20 61 62   in 1. and 2. ab
ae00: 6f 76 65 20 61 72 65 20 6d 65 72 67 65 64 2e 20  ove are merged. 
ae10: 43 61 6c 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  Call.**         
ae20: 74 68 69 73 20 6c 65 76 65 6c 20 4e 2e 20 4c 65  this level N. Le
ae30: 76 65 6c 20 4e 20 63 6f 6e 74 61 69 6e 73 20 46  vel N contains F
ae40: 43 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6c 65  C pointers to le
ae50: 76 65 6c 20 4e 2b 31 2e 0a 2a 2a 0a 2a 2a 20 20  vel N+1..**.**  
ae60: 20 54 68 65 6e 2c 20 69 66 20 74 68 65 20 75 73   Then, if the us
ae70: 65 72 20 61 74 74 65 6d 70 74 73 20 74 6f 20 71  er attempts to q
ae80: 75 65 72 79 20 66 6f 72 20 28 6b 65 79 3e 3d 32  uery for (key>=2
ae90: 20 4c 49 4d 49 54 20 31 30 29 2c 20 74 68 65 20   LIMIT 10), the 
aea0: 0a 2a 2a 20 20 20 6c 73 6d 4d 43 75 72 73 6f 72  .**   lsmMCursor
aeb0: 53 65 65 6b 28 29 20 63 61 6c 6c 20 77 69 6c 6c  Seek() call will
aec0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
aed0: 20 39 39 39 38 20 65 6e 74 72 69 65 73 20 73 65   9998 entries se
aee0: 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 0a 2a  arching for a .*
aef0: 2a 20 20 20 70 6f 69 6e 74 65 72 20 64 6f 77 6e  *   pointer down
af00: 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 4e 2b   to the level N+
af10: 31 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20  1 that is never 
af20: 61 63 74 75 61 6c 6c 79 20 75 73 65 64 2e 20 49  actually used. I
af30: 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 20 20  t would be.**   
af40: 6d 75 63 68 20 62 65 74 74 65 72 20 69 66 20 74  much better if t
af50: 68 65 20 6d 75 6c 74 69 2d 63 75 72 73 6f 72 20  he multi-cursor 
af60: 63 6f 75 6c 64 20 64 6f 20 74 68 69 73 20 6c 61  could do this la
af70: 7a 69 6c 79 20 2d 20 6f 6e 6c 79 20 73 65 65 6b  zily - only seek
af80: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 6c 65 76   to the.**   lev
af90: 65 6c 20 28 4e 2b 31 29 20 70 61 67 65 20 61 66  el (N+1) page af
afa0: 74 65 72 20 74 68 65 20 75 73 65 72 20 68 61 73  ter the user has
afb0: 20 6d 6f 76 65 64 20 74 68 65 20 63 75 72 73 6f   moved the curso
afc0: 72 20 6f 6e 20 6c 65 76 65 6c 20 4e 20 70 61 73  r on level N pas
afd0: 73 65 64 0a 2a 2a 20 20 20 74 68 65 20 62 69 67  sed.**   the big
afe0: 20 72 61 6e 67 65 2d 64 65 6c 65 74 65 2e 0a 2a   range-delete..*
aff0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 67  /.static int seg
b000: 6d 65 6e 74 50 74 72 46 77 64 50 6f 69 6e 74 65  mentPtrFwdPointe
b010: 72 28 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72  r(.  MultiCursor
b020: 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20   *pCsr,         
b030: 20 20 20 20 20 2f 2a 20 4d 75 6c 74 69 2d 63 75       /* Multi-cu
b040: 72 73 6f 72 20 70 50 74 72 20 62 65 6c 6f 6e 67  rsor pPtr belong
b050: 73 20 74 6f 20 2a 2f 0a 20 20 53 65 67 6d 65 6e  s to */.  Segmen
b060: 74 50 74 72 20 2a 70 50 74 72 2c 20 20 20 20 20  tPtr *pPtr,     
b070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
b080: 6d 65 6e 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20  ment-pointer to 
b090: 65 78 74 72 61 63 74 20 46 43 20 70 74 72 20 66  extract FC ptr f
b0a0: 72 6f 6d 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  rom */.  Pgno *p
b0b0: 69 50 74 72 20 20 20 20 20 20 20 20 20 20 20 20  iPtr            
b0c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
b0d0: 20 46 43 20 70 6f 69 6e 74 65 72 20 76 61 6c 75   FC pointer valu
b0e0: 65 20 2a 2f 0a 29 7b 0a 20 20 4c 65 76 65 6c 20  e */.){.  Level 
b0f0: 2a 70 4c 76 6c 20 3d 20 70 50 74 72 2d 3e 70 4c  *pLvl = pPtr->pL
b100: 65 76 65 6c 3b 0a 20 20 4c 65 76 65 6c 20 2a 70  evel;.  Level *p
b110: 4e 65 78 74 20 3d 20 70 4c 76 6c 2d 3e 70 4e 65  Next = pLvl->pNe
b120: 78 74 3b 0a 20 20 50 61 67 65 20 2a 70 50 67 20  xt;.  Page *pPg 
b130: 3d 20 70 50 74 72 2d 3e 70 50 67 3b 0a 20 20 69  = pPtr->pPg;.  i
b140: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 46 6f  nt rc;.  int bFo
b150: 75 6e 64 3b 0a 20 20 50 67 6e 6f 20 69 4f 75 74  und;.  Pgno iOut
b160: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 50 74   = 0;..  if( pPt
b170: 72 2d 3e 70 53 65 67 3d 3d 26 70 4c 76 6c 2d 3e  r->pSeg==&pLvl->
b180: 6c 68 73 20 7c 7c 20 70 50 74 72 2d 3e 70 53 65  lhs || pPtr->pSe
b190: 67 3d 3d 26 70 4c 76 6c 2d 3e 61 52 68 73 5b 70  g==&pLvl->aRhs[p
b1a0: 4c 76 6c 2d 3e 6e 52 69 67 68 74 2d 31 5d 20 29  Lvl->nRight-1] )
b1b0: 7b 0a 20 20 20 20 69 66 28 20 70 4e 65 78 74 3d  {.    if( pNext=
b1c0: 3d 30 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28  =0 .        || (
b1d0: 70 4e 65 78 74 2d 3e 6e 52 69 67 68 74 3d 3d 30  pNext->nRight==0
b1e0: 20 26 26 20 70 4e 65 78 74 2d 3e 6c 68 73 2e 69   && pNext->lhs.i
b1f0: 52 6f 6f 74 29 0a 20 20 20 20 20 20 20 20 7c 7c  Root).        ||
b200: 20 28 70 4e 65 78 74 2d 3e 6e 52 69 67 68 74 21   (pNext->nRight!
b210: 3d 30 20 26 26 20 70 4e 65 78 74 2d 3e 61 52 68  =0 && pNext->aRh
b220: 73 5b 30 5d 2e 69 52 6f 6f 74 29 0a 20 20 20 20  s[0].iRoot).    
b230: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f    ){.      /* Do
b240: 20 6e 6f 74 68 69 6e 67 2e 20 54 68 65 20 70 6f   nothing. The po
b250: 69 6e 74 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62  inter will not b
b260: 65 20 75 73 65 64 20 61 6e 79 77 61 79 2e 20 2a  e used anyway. *
b270: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4c  /.      return L
b280: 53 4d 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  SM_OK;.    }.  }
b290: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50  else{.    if( pP
b2a0: 74 72 5b 31 5d 2e 70 53 65 67 2d 3e 69 52 6f 6f  tr[1].pSeg->iRoo
b2b0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
b2c0: 6e 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n LSM_OK;.    }.
b2d0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
b2e0: 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 77   for a pointer w
b2f0: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
b300: 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20  t segment. */.  
b310: 6c 73 6d 46 73 50 61 67 65 52 65 66 28 70 50 67  lsmFsPageRef(pPg
b320: 29 3b 0a 20 20 72 63 20 3d 20 70 74 72 46 77 64  );.  rc = ptrFwd
b330: 50 6f 69 6e 74 65 72 28 70 50 67 2c 20 70 50 74  Pointer(pPg, pPt
b340: 72 2d 3e 69 43 65 6c 6c 2c 20 70 50 74 72 2d 3e  r->iCell, pPtr->
b350: 70 53 65 67 2c 20 26 69 4f 75 74 2c 20 26 62 46  pSeg, &iOut, &bF
b360: 6f 75 6e 64 29 3b 0a 0a 20 20 69 66 28 20 72 63  ound);..  if( rc
b370: 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 62 46 6f 75  ==LSM_OK && bFou
b380: 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  nd==0 ){.    /* 
b390: 54 68 69 73 20 63 61 73 65 20 68 61 70 70 65 6e  This case happen
b3a0: 73 20 77 68 65 6e 20 70 50 74 72 20 70 6f 69 6e  s when pPtr poin
b3b0: 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  ts to the left-h
b3c0: 61 6e 64 2d 73 69 64 65 20 6f 66 20 61 20 73 65  and-side of a se
b3d0: 67 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 63 75 72  gment.    ** cur
b3e0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 67 6f 69 6e  rently undergoin
b3f0: 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
b400: 20 6d 65 72 67 65 2e 20 49 6e 20 74 68 69 73 20   merge. In this 
b410: 63 61 73 65 2c 20 6a 75 6d 70 20 74 6f 20 74 68  case, jump to th
b420: 65 0a 20 20 20 20 2a 2a 20 6f 6c 64 65 73 74 20  e.    ** oldest 
b430: 73 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 72  segment in the r
b440: 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f  ight-hand-side o
b450: 66 20 74 68 65 20 73 61 6d 65 20 6c 65 76 65 6c  f the same level
b460: 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 0a 20 20   and continue.  
b470: 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 2e 20    ** searching. 
b480: 42 75 74 20 2d 20 64 6f 20 6e 6f 74 20 63 6f 6e  But - do not con
b490: 73 69 64 65 72 20 61 6e 79 20 6b 65 79 73 20 73  sider any keys s
b4a0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
b4b0: 6c 65 76 65 6c 73 0a 20 20 20 20 2a 2a 20 73 70  levels.    ** sp
b4c0: 6c 69 74 2d 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  lit-key. */.    
b4d0: 53 65 67 6d 65 6e 74 50 74 72 20 70 74 72 3b 0a  SegmentPtr ptr;.
b4e0: 0a 20 20 20 20 69 66 28 20 70 50 74 72 2d 3e 70  .    if( pPtr->p
b4f0: 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3d 3d 30  Level->nRight==0
b500: 20 7c 7c 20 70 50 74 72 2d 3e 70 53 65 67 21 3d   || pPtr->pSeg!=
b510: 26 70 50 74 72 2d 3e 70 4c 65 76 65 6c 2d 3e 6c  &pPtr->pLevel->l
b520: 68 73 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  hs ){.      retu
b530: 72 6e 20 4c 53 4d 5f 43 4f 52 52 55 50 54 5f 42  rn LSM_CORRUPT_B
b540: 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
b550: 6d 65 6d 73 65 74 28 26 70 74 72 2c 20 30 2c 20  memset(&ptr, 0, 
b560: 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 50 74  sizeof(SegmentPt
b570: 72 29 29 3b 0a 20 20 20 20 70 74 72 2e 70 4c 65  r));.    ptr.pLe
b580: 76 65 6c 20 3d 20 70 50 74 72 2d 3e 70 4c 65 76  vel = pPtr->pLev
b590: 65 6c 3b 0a 20 20 20 20 70 74 72 2e 70 53 65 67  el;.    ptr.pSeg
b5a0: 20 3d 20 26 70 74 72 2e 70 4c 65 76 65 6c 2d 3e   = &ptr.pLevel->
b5b0: 61 52 68 73 5b 70 74 72 2e 70 4c 65 76 65 6c 2d  aRhs[ptr.pLevel-
b5c0: 3e 6e 52 69 67 68 74 2d 31 5d 3b 0a 20 20 20 20  >nRight-1];.    
b5d0: 72 63 20 3d 20 73 6f 72 74 65 64 52 68 73 46 69  rc = sortedRhsFi
b5e0: 72 73 74 28 70 43 73 72 2c 20 70 74 72 2e 70 4c  rst(pCsr, ptr.pL
b5f0: 65 76 65 6c 2c 20 26 70 74 72 29 3b 0a 20 20 20  evel, &ptr);.   
b600: 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
b610: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
b620: 72 46 77 64 50 6f 69 6e 74 65 72 28 70 74 72 2e  rFwdPointer(ptr.
b630: 70 50 67 2c 20 70 74 72 2e 69 43 65 6c 6c 2c 20  pPg, ptr.iCell, 
b640: 70 74 72 2e 70 53 65 67 2c 20 26 69 4f 75 74 2c  ptr.pSeg, &iOut,
b650: 20 26 62 46 6f 75 6e 64 29 3b 0a 20 20 20 20 20   &bFound);.     
b660: 20 70 74 72 2e 70 50 67 20 3d 20 30 3b 0a 20 20   ptr.pPg = 0;.  
b670: 20 20 7d 0a 20 20 20 20 73 65 67 6d 65 6e 74 50    }.    segmentP
b680: 74 72 52 65 73 65 74 28 26 70 74 72 2c 20 30 29  trReset(&ptr, 0)
b690: 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 50 74 72 20  ;.  }..  *piPtr 
b6a0: 3d 20 69 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e  = iOut;.  return
b6b0: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
b6c0: 6e 74 20 73 65 67 6d 65 6e 74 50 74 72 53 65 65  nt segmentPtrSee
b6d0: 6b 28 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72  k(.  MultiCursor
b6e0: 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20   *pCsr,         
b6f0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 63       /* Cursor c
b700: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 67 6d  ontext */.  Segm
b710: 65 6e 74 50 74 72 20 2a 70 50 74 72 2c 20 20 20  entPtr *pPtr,   
b720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
b730: 6f 69 6e 74 65 72 20 74 6f 20 73 65 65 6b 20 2a  ointer to seek *
b740: 2f 0a 20 20 69 6e 74 20 69 54 6f 70 69 63 2c 20  /.  int iTopic, 
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 20 20 20 20 2f 2a 20 4b 65 79 20 74 6f 70 69 63      /* Key topic
b770: 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20   to seek to */. 
b780: 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74   void *pKey, int
b790: 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
b7a0: 20 2f 2a 20 4b 65 79 20 74 6f 20 73 65 65 6b 20   /* Key to seek 
b7b0: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 65 53 65 65  to */.  int eSee
b7c0: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
b7d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
b7e0: 68 20 62 69 61 73 20 2d 20 73 65 65 20 61 62 6f  h bias - see abo
b7f0: 76 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50  ve */.  int *piP
b800: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
b810: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
b820: 46 43 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  FC pointer */.  
b830: 69 6e 74 20 2a 70 62 53 74 6f 70 0a 29 7b 0a 20  int *pbStop.){. 
b840: 20 69 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69   int (*xCmp)(voi
b850: 64 20 2a 2c 20 69 6e 74 2c 20 76 6f 69 64 20 2a  d *, int, void *
b860: 2c 20 69 6e 74 29 20 3d 20 70 43 73 72 2d 3e 70  , int) = pCsr->p
b870: 44 62 2d 3e 78 43 6d 70 3b 0a 20 20 69 6e 74 20  Db->xCmp;.  int 
b880: 72 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  res = 0;        
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8a0: 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d  /* Result of com
b8b0: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f  parison operatio
b8c0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
b8d0: 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 4d  LSM_OK;.  int iM
b8e0: 69 6e 3b 0a 20 20 69 6e 74 20 69 4d 61 78 3b 0a  in;.  int iMax;.
b8f0: 20 20 50 67 6e 6f 20 69 50 74 72 4f 75 74 20 3d    Pgno iPtrOut =
b900: 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   0;..  /* If the
b910: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
b920: 6e 74 61 69 6e 73 20 61 6e 20 6f 76 65 72 73 69  ntains an oversi
b930: 7a 65 64 20 65 6e 74 72 79 2c 20 74 68 65 6e 20  zed entry, then 
b940: 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
b950: 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f 6e  * pointers to on
b960: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
b970: 20 73 75 62 73 65 71 75 65 6e 74 20 70 61 67 65   subsequent page
b980: 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65 64 20  s in the sorted 
b990: 72 75 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 66 6f  run..  ** The fo
b9a0: 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 65 6e 73  llowing call ens
b9b0: 75 72 65 73 20 74 68 61 74 20 74 68 65 20 73 65  ures that the se
b9c0: 67 6d 65 6e 74 2d 70 74 72 20 70 6f 69 6e 74 73  gment-ptr points
b9d0: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
b9e0: 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
b9f0: 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 72  is case.  */.  r
ba00: 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 53 65  c = segmentPtrSe
ba10: 61 72 63 68 4f 76 65 72 73 69 7a 65 64 28 70 43  archOversized(pC
ba20: 73 72 2c 20 70 50 74 72 2c 20 69 54 6f 70 69 63  sr, pPtr, iTopic
ba30: 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , pKey, nKey);. 
ba40: 20 69 50 74 72 4f 75 74 20 3d 20 70 50 74 72 2d   iPtrOut = pPtr-
ba50: 3e 69 50 74 72 3b 0a 0a 20 20 2f 2a 20 41 73 73  >iPtr;..  /* Ass
ba60: 65 72 74 20 74 68 61 74 20 74 68 69 73 20 70 61  ert that this pa
ba70: 67 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ge is the right 
ba80: 70 61 67 65 20 6f 66 20 74 68 69 73 20 73 65 67  page of this seg
ba90: 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 6b 65 79  ment for the key
baa0: 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 72  .  ** that we ar
bab0: 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 2e  e searching for.
bac0: 20 44 6f 20 74 68 69 73 20 62 79 20 6c 6f 61 64   Do this by load
bad0: 69 6e 67 20 70 61 67 65 20 28 69 50 67 2d 31 29  ing page (iPg-1)
bae0: 20 61 6e 64 20 74 65 73 74 69 6e 67 0a 20 20 2a   and testing.  *
baf0: 2a 20 74 68 61 74 20 70 4b 65 79 2f 6e 4b 65 79  * that pKey/nKey
bb00: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
bb10: 20 61 6c 6c 20 6b 65 79 73 20 6f 6e 20 74 68 61   all keys on tha
bb20: 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 6e  t page, and then
bb30: 20 62 79 20 0a 20 20 2a 2a 20 6c 6f 61 64 69 6e   by .  ** loadin
bb40: 67 20 28 69 50 67 2b 31 29 20 61 6e 64 20 74 65  g (iPg+1) and te
bb50: 73 74 69 6e 67 20 74 68 61 74 20 70 4b 65 79 2f  sting that pKey/
bb60: 6e 4b 65 79 20 69 73 20 73 6d 61 6c 6c 65 72 20  nKey is smaller 
bb70: 74 68 61 6e 20 61 6c 6c 0a 20 20 2a 2a 20 74 68  than all.  ** th
bb80: 65 20 6b 65 79 73 20 69 74 20 68 6f 75 73 65 73  e keys it houses
bb90: 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  .  .  **.  ** TO
bba0: 44 4f 3a 20 57 69 74 68 20 72 61 6e 67 65 2d 64  DO: With range-d
bbb0: 65 6c 65 74 65 73 20 69 6e 20 74 68 65 20 74 72  eletes in the tr
bbc0: 65 65 2c 20 74 68 65 20 74 65 73 74 20 64 65 73  ee, the test des
bbd0: 63 72 69 62 65 64 20 61 62 6f 76 65 20 6d 61 79  cribed above may
bbe0: 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 23 69 66 20   fail..  */.#if 
bbf0: 30 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  0.  assert( asse
bc00: 72 74 4b 65 79 4c 6f 63 61 74 69 6f 6e 28 70 43  rtKeyLocation(pC
bc10: 73 72 2c 20 70 50 74 72 2c 20 70 4b 65 79 2c 20  sr, pPtr, pKey, 
bc20: 6e 4b 65 79 29 20 29 3b 0a 23 65 6e 64 69 66 0a  nKey) );.#endif.
bc30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 74 72 2d  .  assert( pPtr-
bc40: 3e 6e 43 65 6c 6c 3e 30 20 0a 20 20 20 20 20 20  >nCell>0 .      
bc50: 20 7c 7c 20 70 50 74 72 2d 3e 70 53 65 67 2d 3e   || pPtr->pSeg->
bc60: 6e 53 69 7a 65 3d 3d 31 20 0a 20 20 20 20 20 20  nSize==1 .      
bc70: 20 7c 7c 20 6c 73 6d 46 73 44 62 50 61 67 65 49   || lsmFsDbPageI
bc80: 73 4c 61 73 74 28 70 50 74 72 2d 3e 70 53 65 67  sLast(pPtr->pSeg
bc90: 2c 20 70 50 74 72 2d 3e 70 50 67 29 0a 20 20 29  , pPtr->pPg).  )
bca0: 3b 0a 20 20 69 66 28 20 70 50 74 72 2d 3e 6e 43  ;.  if( pPtr->nC
bcb0: 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 73 65  ell==0 ){.    se
bcc0: 67 6d 65 6e 74 50 74 72 52 65 73 65 74 28 70 50  gmentPtrReset(pP
bcd0: 74 72 2c 20 4c 53 4d 5f 53 45 47 4d 45 4e 54 50  tr, LSM_SEGMENTP
bce0: 54 52 5f 46 52 45 45 5f 54 48 52 45 53 48 4f 4c  TR_FREE_THRESHOL
bcf0: 44 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  D);.  }else{.   
bd00: 20 69 4d 69 6e 20 3d 20 30 3b 0a 20 20 20 20 69   iMin = 0;.    i
bd10: 4d 61 78 20 3d 20 70 50 74 72 2d 3e 6e 43 65 6c  Max = pPtr->nCel
bd20: 6c 2d 31 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  l-1;..    while(
bd30: 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20   1 ){.      int 
bd40: 69 54 72 79 20 3d 20 28 69 4d 69 6e 2b 69 4d 61  iTry = (iMin+iMa
bd50: 78 29 2f 32 3b 0a 20 20 20 20 20 20 76 6f 69 64  x)/2;.      void
bd60: 20 2a 70 4b 65 79 54 3b 20 69 6e 74 20 6e 4b 65   *pKeyT; int nKe
bd70: 79 54 3b 20 20 20 20 20 20 20 2f 2a 20 4b 65 79  yT;       /* Key
bd80: 20 66 6f 72 20 63 65 6c 6c 20 69 54 72 79 20 2a   for cell iTry *
bd90: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 54 6f 70  /.      int iTop
bda0: 69 63 54 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  icT;..      asse
bdb0: 72 74 28 20 69 54 72 79 3c 69 4d 61 78 20 7c 7c  rt( iTry<iMax ||
bdc0: 20 69 4d 69 6e 3d 3d 69 4d 61 78 20 29 3b 0a 0a   iMin==iMax );..
bdd0: 20 20 20 20 20 20 72 63 20 3d 20 73 65 67 6d 65        rc = segme
bde0: 6e 74 50 74 72 4c 6f 61 64 43 65 6c 6c 28 70 50  ntPtrLoadCell(pP
bdf0: 74 72 2c 20 69 54 72 79 29 3b 0a 20 20 20 20 20  tr, iTry);.     
be00: 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20   if( rc!=LSM_OK 
be10: 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
be20: 73 65 67 6d 65 6e 74 50 74 72 4b 65 79 28 70 50  segmentPtrKey(pP
be30: 74 72 2c 20 26 70 4b 65 79 54 2c 20 26 6e 4b 65  tr, &pKeyT, &nKe
be40: 79 54 29 3b 0a 20 20 20 20 20 20 69 54 6f 70 69  yT);.      iTopi
be50: 63 54 20 3d 20 72 74 54 6f 70 69 63 28 70 50 74  cT = rtTopic(pPt
be60: 72 2d 3e 65 54 79 70 65 29 3b 0a 0a 20 20 20 20  r->eType);..    
be70: 20 20 72 65 73 20 3d 20 73 6f 72 74 65 64 4b 65    res = sortedKe
be80: 79 43 6f 6d 70 61 72 65 28 78 43 6d 70 2c 20 69  yCompare(xCmp, i
be90: 54 6f 70 69 63 54 2c 20 70 4b 65 79 54 2c 20 6e  TopicT, pKeyT, n
bea0: 4b 65 79 54 2c 20 69 54 6f 70 69 63 2c 20 70 4b  KeyT, iTopic, pK
beb0: 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20  ey, nKey);.     
bec0: 20 69 66 28 20 72 65 73 3c 3d 30 20 29 7b 0a 20   if( res<=0 ){. 
bed0: 20 20 20 20 20 20 20 69 50 74 72 4f 75 74 20 3d         iPtrOut =
bee0: 20 70 50 74 72 2d 3e 69 50 74 72 20 2b 20 70 50   pPtr->iPtr + pP
bef0: 74 72 2d 3e 69 50 67 50 74 72 3b 0a 20 20 20 20  tr->iPgPtr;.    
bf00: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
bf10: 65 73 3d 3d 30 20 7c 7c 20 69 4d 69 6e 3d 3d 69  es==0 || iMin==i
bf20: 4d 61 78 20 29 7b 0a 20 20 20 20 20 20 20 20 62  Max ){.        b
bf30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
bf40: 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
bf50: 20 20 20 20 20 20 20 69 4d 61 78 20 3d 20 4c 53         iMax = LS
bf60: 4d 5f 4d 41 58 28 69 54 72 79 2d 31 2c 20 69 4d  M_MAX(iTry-1, iM
bf70: 69 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  in);.      }else
bf80: 7b 0a 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d  {.        iMin =
bf90: 20 69 54 72 79 2b 31 3b 0a 20 20 20 20 20 20 7d   iTry+1;.      }
bfa0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
bfb0: 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
bfc0: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 3d      assert( res=
bfd0: 3d 30 20 7c 7c 20 28 69 4d 69 6e 3d 3d 69 4d 61  =0 || (iMin==iMa
bfe0: 78 20 26 26 20 69 4d 69 6e 3e 3d 30 20 26 26 20  x && iMin>=0 && 
bff0: 69 4d 69 6e 3c 70 50 74 72 2d 3e 6e 43 65 6c 6c  iMin<pPtr->nCell
c000: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ) );.      if( r
c010: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  es ){.        rc
c020: 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 4c 6f 61   = segmentPtrLoa
c030: 64 43 65 6c 6c 28 70 50 74 72 2c 20 69 4d 69 6e  dCell(pPtr, iMin
c040: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c050: 20 61 73 73 65 72 74 28 20 72 63 21 3d 4c 53 4d   assert( rc!=LSM
c060: 5f 4f 4b 20 7c 7c 20 72 65 73 3e 30 20 7c 7c 20  _OK || res>0 || 
c070: 69 50 74 72 4f 75 74 3d 3d 28 70 50 74 72 2d 3e  iPtrOut==(pPtr->
c080: 69 50 74 72 20 2b 20 70 50 74 72 2d 3e 69 50 67  iPtr + pPtr->iPg
c090: 50 74 72 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  Ptr) );..      i
c0a0: 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc==LSM_OK ){
c0b0: 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
c0c0: 20 65 53 65 65 6b 20 29 7b 0a 20 20 20 20 20 20   eSeek ){.      
c0d0: 20 20 20 20 63 61 73 65 20 4c 53 4d 5f 53 45 45      case LSM_SEE
c0e0: 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 20 20  K_EQ: {.        
c0f0: 20 20 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20      int eType = 
c100: 70 50 74 72 2d 3e 65 54 79 70 65 3b 0a 20 20 20  pPtr->eType;.   
c110: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
c120: 73 3c 30 20 26 26 20 28 65 54 79 70 65 20 26 20  s<0 && (eType & 
c130: 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54 45  LSM_START_DELETE
c140: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
c150: 7c 7c 20 28 72 65 73 3e 30 20 26 26 20 28 65 54  || (res>0 && (eT
c160: 79 70 65 20 26 20 4c 53 4d 5f 45 4e 44 5f 44 45  ype & LSM_END_DE
c170: 4c 45 54 45 29 29 0a 20 20 20 20 20 20 20 20 20  LETE)).         
c180: 20 20 20 20 7c 7c 20 28 72 65 73 3d 3d 30 20 26      || (res==0 &
c190: 26 20 28 65 54 79 70 65 20 26 20 4c 53 4d 5f 50  & (eType & LSM_P
c1a0: 4f 49 4e 54 5f 44 45 4c 45 54 45 29 29 0a 20 20  OINT_DELETE)).  
c1b0: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
c1c0: 20 20 20 20 20 20 20 20 20 20 20 2a 70 62 53 74             *pbSt
c1d0: 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  op = 1;.        
c1e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
c1f0: 73 3d 3d 30 20 26 26 20 28 65 54 79 70 65 20 26  s==0 && (eType &
c200: 20 4c 53 4d 5f 49 4e 53 45 52 54 29 20 29 7b 0a   LSM_INSERT) ){.
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 73                ls
c220: 6d 5f 65 6e 76 20 2a 70 45 6e 76 20 3d 20 70 43  m_env *pEnv = pC
c230: 73 72 2d 3e 70 44 62 2d 3e 70 45 6e 76 3b 0a 20  sr->pDb->pEnv;. 
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 62               *pb
c250: 53 74 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  Stop = 1;.      
c260: 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 65 54          pCsr->eT
c270: 79 70 65 20 3d 20 70 50 74 72 2d 3e 65 54 79 70  ype = pPtr->eTyp
c280: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
c290: 20 72 63 20 3d 20 73 6f 72 74 65 64 42 6c 6f 62   rc = sortedBlob
c2a0: 53 65 74 28 70 45 6e 76 2c 20 26 70 43 73 72 2d  Set(pEnv, &pCsr-
c2b0: 3e 6b 65 79 2c 20 70 50 74 72 2d 3e 70 4b 65 79  >key, pPtr->pKey
c2c0: 2c 20 70 50 74 72 2d 3e 6e 4b 65 79 29 3b 0a 20  , pPtr->nKey);. 
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
c2e0: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
c300: 63 20 3d 20 73 6f 72 74 65 64 42 6c 6f 62 53 65  c = sortedBlobSe
c310: 74 28 70 45 6e 76 2c 20 26 70 43 73 72 2d 3e 76  t(pEnv, &pCsr->v
c320: 61 6c 2c 20 70 50 74 72 2d 3e 70 56 61 6c 2c 20  al, pPtr->pVal, 
c330: 70 50 74 72 2d 3e 6e 56 61 6c 29 3b 0a 20 20 20  pPtr->nVal);.   
c340: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
c350: 20 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d             pCsr-
c360: 3e 66 6c 61 67 73 20 7c 3d 20 43 55 52 53 4f 52  >flags |= CURSOR
c370: 5f 53 45 45 4b 5f 45 51 3b 0a 20 20 20 20 20 20  _SEEK_EQ;.      
c380: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c390: 20 20 20 20 73 65 67 6d 65 6e 74 50 74 72 52 65      segmentPtrRe
c3a0: 73 65 74 28 70 50 74 72 2c 20 4c 53 4d 5f 53 45  set(pPtr, LSM_SE
c3b0: 47 4d 45 4e 54 50 54 52 5f 46 52 45 45 5f 54 48  GMENTPTR_FREE_TH
c3c0: 52 45 53 48 4f 4c 44 29 3b 0a 20 20 20 20 20 20  RESHOLD);.      
c3d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c3e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c3f0: 20 20 20 63 61 73 65 20 4c 53 4d 5f 53 45 45 4b     case LSM_SEEK
c400: 5f 4c 45 3a 0a 20 20 20 20 20 20 20 20 20 20 20  _LE:.           
c410: 20 69 66 28 20 72 65 73 3e 30 20 29 20 72 63 20   if( res>0 ) rc 
c420: 3d 20 73 65 67 6d 65 6e 74 50 74 72 41 64 76 61  = segmentPtrAdva
c430: 6e 63 65 28 70 43 73 72 2c 20 70 50 74 72 2c 20  nce(pCsr, pPtr, 
c440: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
c450: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
c460: 20 63 61 73 65 20 4c 53 4d 5f 53 45 45 4b 5f 47   case LSM_SEEK_G
c470: 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E: {.           
c480: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69   /* Figure out i
c490: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 27 73 6b  f we need to 'sk
c4a0: 69 70 27 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ip' the pointer 
c4b0: 66 6f 72 77 61 72 64 20 6f 72 20 6e 6f 74 20 2a  forward or not *
c4c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
c4d0: 28 20 28 72 65 73 3c 3d 30 20 26 26 20 28 70 50  ( (res<=0 && (pP
c4e0: 74 72 2d 3e 65 54 79 70 65 20 26 20 4c 53 4d 5f  tr->eType & LSM_
c4f0: 53 54 41 52 54 5f 44 45 4c 45 54 45 29 29 20 0a  START_DELETE)) .
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
c510: 28 72 65 73 3e 30 20 20 26 26 20 28 70 50 74 72  (res>0  && (pPtr
c520: 2d 3e 65 54 79 70 65 20 26 20 4c 53 4d 5f 45 4e  ->eType & LSM_EN
c530: 44 5f 44 45 4c 45 54 45 29 29 20 0a 20 20 20 20  D_DELETE)) .    
c540: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
c550: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65           rc = se
c560: 67 6d 65 6e 74 50 74 72 46 77 64 50 6f 69 6e 74  gmentPtrFwdPoint
c570: 65 72 28 70 43 73 72 2c 20 70 50 74 72 2c 20 26  er(pCsr, pPtr, &
c580: 69 50 74 72 4f 75 74 29 3b 0a 20 20 20 20 20 20  iPtrOut);.      
c590: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c5a0: 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 26 26      if( res<0 &&
c5b0: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
c5d0: 3d 20 73 65 67 6d 65 6e 74 50 74 72 41 64 76 61  = segmentPtrAdva
c5e0: 6e 63 65 28 70 43 73 72 2c 20 70 50 74 72 2c 20  nce(pCsr, pPtr, 
c5f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
c600: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  }.            br
c610: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
c620: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c630: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
c640: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 73   If the cursor s
c650: 65 65 6b 20 68 61 73 20 66 6f 75 6e 64 20 61 20  eek has found a 
c660: 73 65 70 61 72 61 74 6f 72 20 6b 65 79 2c 20 61  separator key, a
c670: 6e 64 20 74 68 69 73 20 63 75 72 73 6f 72 20 69  nd this cursor i
c680: 73 0a 20 20 20 20 2a 2a 20 73 75 70 70 6f 73 65  s.    ** suppose
c690: 64 20 74 6f 20 69 67 6e 6f 72 65 20 73 65 70 61  d to ignore sepa
c6a0: 72 61 74 6f 72 73 20 6b 65 79 73 2c 20 61 64 76  rators keys, adv
c6b0: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
c6c0: 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 20 20   entry.  */.    
c6d0: 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26  if( rc==LSM_OK &
c6e0: 26 20 70 50 74 72 2d 3e 70 50 67 0a 20 20 20 20  & pPtr->pPg.    
c6f0: 20 26 26 20 73 65 67 6d 65 6e 74 50 74 72 49 67   && segmentPtrIg
c700: 6e 6f 72 65 53 65 70 61 72 61 74 6f 72 73 28 70  noreSeparators(p
c710: 43 73 72 2c 20 70 50 74 72 29 20 0a 20 20 20 20  Csr, pPtr) .    
c720: 20 26 26 20 72 74 49 73 53 65 70 61 72 61 74 6f   && rtIsSeparato
c730: 72 28 70 50 74 72 2d 3e 65 54 79 70 65 29 0a 20  r(pPtr->eType). 
c740: 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
c750: 72 74 28 20 65 53 65 65 6b 21 3d 4c 53 4d 5f 53  rt( eSeek!=LSM_S
c760: 45 45 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  EEK_EQ );.      
c770: 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 41  rc = segmentPtrA
c780: 64 76 61 6e 63 65 28 70 43 73 72 2c 20 70 50 74  dvance(pCsr, pPt
c790: 72 2c 20 65 53 65 65 6b 3d 3d 4c 53 4d 5f 53 45  r, eSeek==LSM_SE
c7a0: 45 4b 5f 4c 45 29 3b 0a 20 20 20 20 7d 0a 20 20  EK_LE);.    }.  
c7b0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  }..  assert( rc!
c7c0: 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 61 73 73 65 72  =LSM_OK || asser
c7d0: 74 53 65 65 6b 52 65 73 75 6c 74 28 70 43 73 72  tSeekResult(pCsr
c7e0: 2c 70 50 74 72 2c 69 54 6f 70 69 63 2c 70 4b 65  ,pPtr,iTopic,pKe
c7f0: 79 2c 6e 4b 65 79 2c 65 53 65 65 6b 29 20 29 3b  y,nKey,eSeek) );
c800: 0a 20 20 2a 70 69 50 74 72 20 3d 20 28 69 6e 74  .  *piPtr = (int
c810: 29 69 50 74 72 4f 75 74 3b 0a 20 20 72 65 74 75  )iPtrOut;.  retu
c820: 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
c830: 20 69 6e 74 20 73 65 65 6b 49 6e 42 74 72 65 65   int seekInBtree
c840: 28 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20  (.  MultiCursor 
c850: 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
c860: 20 20 20 20 2f 2a 20 4d 75 6c 74 69 2d 63 75 72      /* Multi-cur
c870: 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  sor object */.  
c880: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20  Segment *pSeg,  
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 2f 2a 20 53 65 65 6b 20 77 69 74 68 69 6e 20 74  /* Seek within t
c8b0: 68 69 73 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  his segment */. 
c8c0: 20 69 6e 74 20 69 54 6f 70 69 63 2c 0a 20 20 76   int iTopic,.  v
c8d0: 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e  oid *pKey, int n
c8e0: 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
c8f0: 2a 20 4b 65 79 20 74 6f 20 73 65 65 6b 20 74 6f  * Key to seek to
c900: 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 61 50 67 2c   */.  Pgno *aPg,
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c920: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61        /* OUT: Pa
c930: 67 65 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20  ge numbers */.  
c940: 50 61 67 65 20 2a 2a 70 70 50 67 20 20 20 20 20  Page **ppPg     
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 2f 2a 20 4f 55 54 3a 20 4c 65 61 66 20 28 73 6f  /* OUT: Leaf (so
c970: 72 74 65 64 2d 72 75 6e 29 20 70 61 67 65 20 72  rted-run) page r
c980: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 29 7b 0a 20  eference */.){. 
c990: 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
c9a0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 50 67 3b  t rc;.  int iPg;
c9b0: 0a 20 20 50 61 67 65 20 2a 70 50 67 20 3d 20 30  .  Page *pPg = 0
c9c0: 3b 0a 20 20 42 6c 6f 62 20 62 6c 6f 62 20 3d 20  ;.  Blob blob = 
c9d0: 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 69 50  {0, 0, 0};..  iP
c9e0: 67 20 3d 20 28 69 6e 74 29 70 53 65 67 2d 3e 69  g = (int)pSeg->i
c9f0: 52 6f 6f 74 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  Root;.  do {.   
ca00: 20 50 67 6e 6f 20 2a 70 69 46 69 72 73 74 20 3d   Pgno *piFirst =
ca10: 20 30 3b 0a 20 20 20 20 69 66 28 20 61 50 67 20   0;.    if( aPg 
ca20: 29 7b 0a 20 20 20 20 20 20 61 50 67 5b 69 2b 2b  ){.      aPg[i++
ca30: 5d 20 3d 20 69 50 67 3b 0a 20 20 20 20 20 20 70  ] = iPg;.      p
ca40: 69 46 69 72 73 74 20 3d 20 26 61 50 67 5b 69 5d  iFirst = &aPg[i]
ca50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
ca60: 3d 20 6c 73 6d 46 73 44 62 50 61 67 65 47 65 74  = lsmFsDbPageGet
ca70: 28 70 43 73 72 2d 3e 70 44 62 2d 3e 70 46 53 2c  (pCsr->pDb->pFS,
ca80: 20 70 53 65 67 2c 20 69 50 67 2c 20 26 70 50 67   pSeg, iPg, &pPg
ca90: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
caa0: 63 3d 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 70 50 67  c==LSM_OK || pPg
cab0: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ==0 );.    if( r
cac0: 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20  c==LSM_OK ){.   
cad0: 20 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20     u8 *aData;   
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
caf0: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
cb00: 69 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f  ing page data */
cb10: 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 61 74 61  .      int nData
cb20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cb30: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 44     /* Size of aD
cb40: 61 74 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ata[] in bytes *
cb50: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 69 6e  /.      int iMin
cb60: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 61 78  ;.      int iMax
cb70: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 65 63  ;.      int nRec
cb80: 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
cb90: 73 3b 0a 0a 20 20 20 20 20 20 61 44 61 74 61 20  s;..      aData 
cba0: 3d 20 66 73 50 61 67 65 44 61 74 61 28 70 50 67  = fsPageData(pPg
cbb0: 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20  , &nData);.     
cbc0: 20 66 6c 61 67 73 20 3d 20 70 61 67 65 47 65 74   flags = pageGet
cbd0: 46 6c 61 67 73 28 61 44 61 74 61 2c 20 6e 44 61  Flags(aData, nDa
cbe0: 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  ta);.      if( (
cbf0: 66 6c 61 67 73 20 26 20 53 45 47 4d 45 4e 54 5f  flags & SEGMENT_
cc00: 42 54 52 45 45 5f 46 4c 41 47 29 3d 3d 30 20 29  BTREE_FLAG)==0 )
cc10: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69   break;..      i
cc20: 50 67 20 3d 20 28 69 6e 74 29 70 61 67 65 47 65  Pg = (int)pageGe
cc30: 74 50 74 72 28 61 44 61 74 61 2c 20 6e 44 61 74  tPtr(aData, nDat
cc40: 61 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d  a);.      nRec =
cc50: 20 70 61 67 65 47 65 74 4e 52 65 63 28 61 44 61   pageGetNRec(aDa
cc60: 74 61 2c 20 6e 44 61 74 61 29 3b 0a 0a 20 20 20  ta, nData);..   
cc70: 20 20 20 69 4d 69 6e 20 3d 20 30 3b 0a 20 20 20     iMin = 0;.   
cc80: 20 20 20 69 4d 61 78 20 3d 20 6e 52 65 63 2d 31     iMax = nRec-1
cc90: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  ;.      while( i
cca0: 4d 61 78 3e 3d 69 4d 69 6e 20 29 7b 0a 20 20 20  Max>=iMin ){.   
ccb0: 20 20 20 20 20 69 6e 74 20 69 54 72 79 20 3d 20       int iTry = 
ccc0: 28 69 4d 69 6e 2b 69 4d 61 78 29 2f 32 3b 0a 20  (iMin+iMax)/2;. 
ccd0: 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4b 65         void *pKe
cce0: 79 54 3b 20 69 6e 74 20 6e 4b 65 79 54 3b 20 20  yT; int nKeyT;  
ccf0: 20 20 20 20 20 2f 2a 20 4b 65 79 20 66 6f 72 20       /* Key for 
cd00: 63 65 6c 6c 20 69 54 72 79 20 2a 2f 0a 20 20 20  cell iTry */.   
cd10: 20 20 20 20 20 69 6e 74 20 69 54 6f 70 69 63 54       int iTopicT
cd20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cd30: 20 20 20 2f 2a 20 54 6f 70 69 63 20 66 6f 72 20     /* Topic for 
cd40: 6b 65 79 20 70 4b 65 79 54 2f 6e 4b 65 79 54 20  key pKeyT/nKeyT 
cd50: 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
cd60: 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  iPtr;           
cd70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
cd80: 74 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ter associated w
cd90: 69 74 68 20 63 65 6c 6c 20 69 54 72 79 20 2a 2f  ith cell iTry */
cda0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
cdb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cdc0: 20 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 20         /* (pKey 
cdd0: 2d 20 70 4b 65 79 54 29 20 2a 2f 0a 0a 20 20 20  - pKeyT) */..   
cde0: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 47 65       rc = pageGe
cdf0: 74 42 74 72 65 65 4b 65 79 28 0a 20 20 20 20 20  tBtreeKey(.     
ce00: 20 20 20 20 20 20 20 70 53 65 67 2c 20 70 50 67         pSeg, pPg
ce10: 2c 20 69 54 72 79 2c 20 26 69 50 74 72 2c 20 26  , iTry, &iPtr, &
ce20: 69 54 6f 70 69 63 54 2c 20 26 70 4b 65 79 54 2c  iTopicT, &pKeyT,
ce30: 20 26 6e 4b 65 79 54 2c 20 26 62 6c 6f 62 0a 20   &nKeyT, &blob. 
ce40: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
ce50: 20 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b    if( rc!=LSM_OK
ce60: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
ce70: 20 20 69 66 28 20 70 69 46 69 72 73 74 20 26 26    if( piFirst &&
ce80: 20 70 4b 65 79 54 3d 3d 62 6c 6f 62 2e 70 44 61   pKeyT==blob.pDa
ce90: 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
cea0: 2a 70 69 46 69 72 73 74 20 3d 20 70 61 67 65 47  *piFirst = pageG
ceb0: 65 74 42 74 72 65 65 52 65 66 28 70 50 67 2c 20  etBtreeRef(pPg, 
cec0: 69 54 72 79 29 3b 0a 20 20 20 20 20 20 20 20 20  iTry);.         
ced0: 20 70 69 46 69 72 73 74 20 3d 20 30 3b 0a 20 20   piFirst = 0;.  
cee0: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
cef0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
cf00: 72 65 73 20 3d 20 73 6f 72 74 65 64 4b 65 79 43  res = sortedKeyC
cf10: 6f 6d 70 61 72 65 28 0a 20 20 20 20 20 20 20 20  ompare(.        
cf20: 20 20 20 20 70 43 73 72 2d 3e 70 44 62 2d 3e 78      pCsr->pDb->x
cf30: 43 6d 70 2c 20 69 54 6f 70 69 63 2c 20 70 4b 65  Cmp, iTopic, pKe
cf40: 79 2c 20 6e 4b 65 79 2c 20 69 54 6f 70 69 63 54  y, nKey, iTopicT
cf50: 2c 20 70 4b 65 79 54 2c 20 6e 4b 65 79 54 0a 20  , pKeyT, nKeyT. 
cf60: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
cf70: 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
cf80: 20 20 20 20 20 20 20 20 20 69 50 67 20 3d 20 28           iPg = (
cf90: 69 6e 74 29 69 50 74 72 3b 0a 20 20 20 20 20 20  int)iPtr;.      
cfa0: 20 20 20 20 69 4d 61 78 20 3d 20 69 54 72 79 2d      iMax = iTry-
cfb0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
cfc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4d 69 6e  {.          iMin
cfd0: 20 3d 20 69 54 72 79 2b 31 3b 0a 20 20 20 20 20   = iTry+1;.     
cfe0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
cff0: 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65     lsmFsPageRele
d000: 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ase(pPg);.      
d010: 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  pPg = 0;.    }. 
d020: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 4c 53 4d   }while( rc==LSM
d030: 5f 4f 4b 20 29 3b 0a 0a 20 20 73 6f 72 74 65 64  _OK );..  sorted
d040: 42 6c 6f 62 46 72 65 65 28 26 62 6c 6f 62 29 3b  BlobFree(&blob);
d050: 0a 20 20 61 73 73 65 72 74 28 20 28 72 63 3d 3d  .  assert( (rc==
d060: 4c 53 4d 5f 4f 4b 29 3d 3d 28 70 50 67 21 3d 30  LSM_OK)==(pPg!=0
d070: 29 20 29 3b 0a 20 20 69 66 28 20 70 70 50 67 20  ) );.  if( ppPg 
d080: 29 7b 0a 20 20 20 20 2a 70 70 50 67 20 3d 20 70  ){.    *ppPg = p
d090: 50 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  Pg;.  }else{.   
d0a0: 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73   lsmFsPageReleas
d0b0: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
d0c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
d0d0: 69 63 20 69 6e 74 20 73 65 65 6b 49 6e 53 65 67  ic int seekInSeg
d0e0: 6d 65 6e 74 28 0a 20 20 4d 75 6c 74 69 43 75 72  ment(.  MultiCur
d0f0: 73 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20 53 65  sor *pCsr, .  Se
d100: 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 2c 0a  gmentPtr *pPtr,.
d110: 20 20 69 6e 74 20 69 54 6f 70 69 63 2c 0a 20 20    int iTopic,.  
d120: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20  void *pKey, int 
d130: 6e 4b 65 79 2c 0a 20 20 69 6e 74 20 69 50 67 2c  nKey,.  int iPg,
d140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d150: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
d160: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69  to search */.  i
d170: 6e 74 20 65 53 65 65 6b 2c 20 20 20 20 20 20 20  nt eSeek,       
d180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d190: 2a 20 53 65 61 72 63 68 20 62 69 61 73 20 2d 20  * Search bias - 
d1a0: 73 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 69  see above */.  i
d1b0: 6e 74 20 2a 70 69 50 74 72 2c 20 20 20 20 20 20  nt *piPtr,      
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d1d0: 2a 20 4f 55 54 3a 20 46 43 20 70 6f 69 6e 74 65  * OUT: FC pointe
d1e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 53 74  r */.  int *pbSt
d1f0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
d200: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
d210: 74 6f 70 20 73 65 61 72 63 68 20 66 6c 61 67 20  top search flag 
d220: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 74 72  */.){.  int iPtr
d230: 20 3d 20 69 50 67 3b 0a 20 20 69 6e 74 20 72 63   = iPg;.  int rc
d240: 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20 20 69 66   = LSM_OK;..  if
d250: 28 20 70 50 74 72 2d 3e 70 53 65 67 2d 3e 69 52  ( pPtr->pSeg->iR
d260: 6f 6f 74 20 29 7b 0a 20 20 20 20 50 61 67 65 20  oot ){.    Page 
d270: 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74  *pPg;.    assert
d280: 28 20 70 50 74 72 2d 3e 70 53 65 67 2d 3e 69 52  ( pPtr->pSeg->iR
d290: 6f 6f 74 21 3d 30 20 29 3b 0a 20 20 20 20 72 63  oot!=0 );.    rc
d2a0: 20 3d 20 73 65 65 6b 49 6e 42 74 72 65 65 28 70   = seekInBtree(p
d2b0: 43 73 72 2c 20 70 50 74 72 2d 3e 70 53 65 67 2c  Csr, pPtr->pSeg,
d2c0: 20 69 54 6f 70 69 63 2c 20 70 4b 65 79 2c 20 6e   iTopic, pKey, n
d2d0: 4b 65 79 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  Key, 0, &pPg);. 
d2e0: 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
d2f0: 4b 20 29 20 73 65 67 6d 65 6e 74 50 74 72 53 65  K ) segmentPtrSe
d300: 74 50 61 67 65 28 70 50 74 72 2c 20 70 50 67 29  tPage(pPtr, pPg)
d310: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
d320: 66 28 20 69 50 74 72 3d 3d 30 20 29 7b 0a 20 20  f( iPtr==0 ){.  
d330: 20 20 20 20 69 50 74 72 20 3d 20 28 69 6e 74 29      iPtr = (int)
d340: 70 50 74 72 2d 3e 70 53 65 67 2d 3e 69 46 69 72  pPtr->pSeg->iFir
d350: 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  st;.    }.    if
d360: 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
d370: 20 20 20 20 20 20 72 63 20 3d 20 73 65 67 6d 65        rc = segme
d380: 6e 74 50 74 72 4c 6f 61 64 50 61 67 65 28 70 43  ntPtrLoadPage(pC
d390: 73 72 2d 3e 70 44 62 2d 3e 70 46 53 2c 20 70 50  sr->pDb->pFS, pP
d3a0: 74 72 2c 20 69 50 74 72 29 3b 0a 20 20 20 20 7d  tr, iPtr);.    }
d3b0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
d3c0: 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  LSM_OK ){.    rc
d3d0: 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 53 65 65   = segmentPtrSee
d3e0: 6b 28 70 43 73 72 2c 20 70 50 74 72 2c 20 69 54  k(pCsr, pPtr, iT
d3f0: 6f 70 69 63 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  opic, pKey, nKey
d400: 2c 20 65 53 65 65 6b 2c 20 70 69 50 74 72 2c 20  , eSeek, piPtr, 
d410: 70 62 53 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 72  pbStop);.  }.  r
d420: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d430: 2a 2a 20 53 65 65 6b 20 65 61 63 68 20 73 65 67  ** Seek each seg
d440: 6d 65 6e 74 20 70 6f 69 6e 74 65 72 20 69 6e 20  ment pointer in 
d450: 74 68 65 20 61 72 72 61 79 20 6f 66 20 28 70 4c  the array of (pL
d460: 76 6c 2d 3e 6e 52 69 67 68 74 2b 31 29 20 61 74  vl->nRight+1) at
d470: 20 61 50 74 72 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 70   aPtr[]..**.** p
d480: 62 53 74 6f 70 3a 0a 2a 2a 20 20 20 54 68 69 73  bStop:.**   This
d490: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 6e   parameter is on
d4a0: 6c 79 20 73 69 67 6e 69 66 69 63 61 6e 74 20 69  ly significant i
d4b0: 66 20 70 61 72 61 6d 65 74 65 72 20 65 53 65 65  f parameter eSee
d4c0: 6b 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 20  k is set to.**  
d4d0: 20 4c 53 4d 5f 53 45 45 4b 5f 45 51 2e 20 49 6e   LSM_SEEK_EQ. In
d4e0: 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20 69   this case, it i
d4f0: 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 62 65  s set to true be
d500: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
d510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 65 65 6b 20  f.**   the seek 
d520: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 66 69 6e  operation is fin
d530: 69 73 68 65 64 2e 20 54 68 69 73 20 63 61 6e 20  ished. This can 
d540: 68 61 70 70 65 6e 20 69 6e 20 74 77 6f 20 77 61  happen in two wa
d550: 79 73 3a 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 20  ys:.**   .**    
d560: 20 61 29 20 41 20 6b 65 79 20 6d 61 74 63 68 69   a) A key matchi
d570: 6e 67 20 28 70 4b 65 79 2f 6e 4b 65 79 29 20 69  ng (pKey/nKey) i
d580: 73 20 66 6f 75 6e 64 2c 20 6f 72 0a 2a 2a 20 20  s found, or.**  
d590: 20 20 20 62 29 20 41 20 70 6f 69 6e 74 2d 64 65     b) A point-de
d5a0: 6c 65 74 65 20 6f 72 20 72 61 6e 67 65 2d 64 65  lete or range-de
d5b0: 6c 65 74 65 20 64 65 6c 65 74 69 6e 67 20 74 68  lete deleting th
d5c0: 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 0a  e key is found..
d5d0: 2a 2a 0a 2a 2a 20 20 20 49 6e 20 63 61 73 65 20  **.**   In case 
d5e0: 28 61 29 2c 20 74 68 65 20 6d 75 6c 74 69 2d 63  (a), the multi-c
d5f0: 75 72 73 6f 72 20 43 55 52 53 4f 52 5f 53 45 45  ursor CURSOR_SEE
d600: 4b 5f 45 51 20 66 6c 61 67 20 69 73 20 73 65 74  K_EQ flag is set
d610: 20 61 6e 64 20 74 68 65 20 70 43 73 72 2d 3e 6b   and the pCsr->k
d620: 65 79 0a 2a 2a 20 20 20 61 6e 64 20 70 43 73 72  ey.**   and pCsr
d630: 2d 3e 76 61 6c 20 62 6c 6f 62 73 20 70 6f 70 75  ->val blobs popu
d640: 6c 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74  lated before ret
d650: 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
d660: 63 20 69 6e 74 20 73 65 65 6b 49 6e 4c 65 76 65  c int seekInLeve
d670: 6c 28 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72  l(.  MultiCursor
d680: 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20   *pCsr,         
d690: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 64 20 63       /* Sorted c
d6a0: 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 74 6f 20  ursor object to 
d6b0: 73 65 65 6b 20 2a 2f 0a 20 20 53 65 67 6d 65 6e  seek */.  Segmen
d6c0: 74 50 74 72 20 2a 61 50 74 72 2c 20 20 20 20 20  tPtr *aPtr,     
d6d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
d6e0: 6e 74 65 72 20 74 6f 20 61 72 72 61 79 20 6f 66  nter to array of
d6f0: 20 28 6e 52 68 73 2b 31 29 20 53 50 73 20 2a 2f   (nRhs+1) SPs */
d700: 0a 20 20 69 6e 74 20 65 53 65 65 6b 2c 20 20 20  .  int eSeek,   
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 62 69 61     /* Search bia
d730: 73 20 2d 20 73 65 65 20 61 62 6f 76 65 20 2a 2f  s - see above */
d740: 0a 20 20 69 6e 74 20 69 54 6f 70 69 63 2c 20 20  .  int iTopic,  
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d760: 20 20 20 2f 2a 20 4b 65 79 20 74 6f 70 69 63 20     /* Key topic 
d770: 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f  to search for */
d780: 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  .  void *pKey, i
d790: 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  nt nKey,        
d7a0: 20 20 20 2f 2a 20 4b 65 79 20 74 6f 20 73 65 61     /* Key to sea
d7b0: 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 50 67 6e  rch for */.  Pgn
d7c0: 6f 20 2a 70 69 50 67 6e 6f 2c 20 20 20 20 20 20  o *piPgno,      
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d7e0: 49 4e 2f 4f 55 54 3a 20 66 72 61 63 74 69 6f 6e  IN/OUT: fraction
d7f0: 20 63 61 73 63 61 64 65 20 70 6f 69 6e 74 65 72   cascade pointer
d800: 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74   (or 0) */.  int
d810: 20 2a 70 62 53 74 6f 70 20 20 20 20 20 20 20 20   *pbStop        
d820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d830: 4f 55 54 3a 20 53 65 65 20 61 62 6f 76 65 20 2a  OUT: See above *
d840: 2f 0a 29 7b 0a 20 20 4c 65 76 65 6c 20 2a 70 4c  /.){.  Level *pL
d850: 76 6c 20 3d 20 61 50 74 72 5b 30 5d 2e 70 4c 65  vl = aPtr[0].pLe
d860: 76 65 6c 3b 20 20 20 2f 2a 20 4c 65 76 65 6c 20  vel;   /* Level 
d870: 74 6f 20 73 65 65 6b 20 77 69 74 68 69 6e 20 2a  to seek within *
d880: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d  /.  int rc = LSM
d890: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
d8a0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
d8b0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 75 74  de */.  int iOut
d8c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d8d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
d8e0: 65 72 20 74 6f 20 72 65 74 75 72 6e 20 74 6f 20  er to return to 
d8f0: 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20  caller */.  int 
d900: 72 65 73 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  res = -1;       
d910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d920: 65 73 75 6c 74 20 6f 66 20 78 43 6d 70 28 70 4b  esult of xCmp(pK
d930: 65 79 2c 20 73 70 6c 69 74 29 20 2a 2f 0a 20 20  ey, split) */.  
d940: 69 6e 74 20 6e 52 68 73 20 3d 20 70 4c 76 6c 2d  int nRhs = pLvl-
d950: 3e 6e 52 69 67 68 74 3b 20 20 20 20 20 20 20 20  >nRight;        
d960: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 69 67  /* Number of rig
d970: 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 73 65 67  ht-hand-side seg
d980: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 62  ments */.  int b
d990: 53 74 6f 70 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Stop = 0;..  /* 
d9a0: 49 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  If this is a com
d9b0: 70 6f 73 69 74 65 20 6c 65 76 65 6c 20 28 6f 6e  posite level (on
d9c0: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
d9d0: 72 67 6f 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d  rgoing an increm
d9e0: 65 6e 74 61 6c 0a 20 20 2a 2a 20 6d 65 72 67 65  ental.  ** merge
d9f0: 29 2c 20 66 69 67 75 72 65 20 6f 75 74 20 69 66  ), figure out if
da00: 20 74 68 65 20 73 65 61 72 63 68 20 6b 65 79 20   the search key 
da10: 69 73 20 6c 61 72 67 65 72 20 6f 72 20 73 6d 61  is larger or sma
da20: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20  ller than the.  
da30: 2a 2a 20 6c 65 76 65 6c 73 20 73 70 6c 69 74 2d  ** levels split-
da40: 6b 65 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e  key.  */.  if( n
da50: 52 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  Rhs ){.    res =
da60: 20 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72   sortedKeyCompar
da70: 65 28 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d  e(pCsr->pDb->xCm
da80: 70 2c 20 69 54 6f 70 69 63 2c 20 70 4b 65 79 2c  p, iTopic, pKey,
da90: 20 6e 4b 65 79 2c 20 0a 20 20 20 20 20 20 20 20   nKey, .        
daa0: 70 4c 76 6c 2d 3e 69 53 70 6c 69 74 54 6f 70 69  pLvl->iSplitTopi
dab0: 63 2c 20 70 4c 76 6c 2d 3e 70 53 70 6c 69 74 4b  c, pLvl->pSplitK
dac0: 65 79 2c 20 70 4c 76 6c 2d 3e 6e 53 70 6c 69 74  ey, pLvl->nSplit
dad0: 4b 65 79 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  Key.    );.  }..
dae0: 20 20 2f 2a 20 49 66 20 28 72 65 73 3c 30 29 2c    /* If (res<0),
daf0: 20 74 68 65 6e 20 6b 65 79 20 70 4b 65 79 2f 6e   then key pKey/n
db00: 4b 65 79 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  Key is smaller t
db10: 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b 65  han the split-ke
db20: 79 20 28 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20  y (or this.  ** 
db30: 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 73 69  is not a composi
db40: 74 65 20 6c 65 76 65 6c 20 61 6e 64 20 74 68 65  te level and the
db50: 72 65 20 69 73 20 6e 6f 20 73 70 6c 69 74 2d 6b  re is no split-k
db60: 65 79 29 2e 20 53 65 61 72 63 68 20 74 68 65 20  ey). Search the 
db70: 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61 6e 64 2d  .  ** left-hand-
db80: 73 69 64 65 20 6f 66 20 74 68 65 20 6c 65 76 65  side of the leve
db90: 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  l in this case. 
dba0: 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 3c 30 20   */.  if( res<0 
dbb0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 74 72 20  ){.    int iPtr 
dbc0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 52 68  = 0;.    if( nRh
dbd0: 73 3d 3d 30 20 29 20 69 50 74 72 20 3d 20 28 69  s==0 ) iPtr = (i
dbe0: 6e 74 29 2a 70 69 50 67 6e 6f 3b 0a 0a 20 20 20  nt)*piPgno;..   
dbf0: 20 72 63 20 3d 20 73 65 65 6b 49 6e 53 65 67 6d   rc = seekInSegm
dc00: 65 6e 74 28 0a 20 20 20 20 20 20 20 20 70 43 73  ent(.        pCs
dc10: 72 2c 20 26 61 50 74 72 5b 30 5d 2c 20 69 54 6f  r, &aPtr[0], iTo
dc20: 70 69 63 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c  pic, pKey, nKey,
dc30: 20 69 50 74 72 2c 20 65 53 65 65 6b 2c 20 26 69   iPtr, eSeek, &i
dc40: 4f 75 74 2c 20 26 62 53 74 6f 70 0a 20 20 20 20  Out, &bStop.    
dc50: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c  );.    if( rc==L
dc60: 53 4d 5f 4f 4b 20 26 26 20 6e 52 68 73 3e 30 20  SM_OK && nRhs>0 
dc70: 26 26 20 65 53 65 65 6b 3d 3d 4c 53 4d 5f 53 45  && eSeek==LSM_SE
dc80: 45 4b 5f 47 45 20 26 26 20 61 50 74 72 5b 30 5d  EK_GE && aPtr[0]
dc90: 2e 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .pPg==0 ){.     
dca0: 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a   res = 0;.    }.
dcb0: 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 65 73    }.  .  if( res
dcc0: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  >=0 ){.    int b
dcd0: 48 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Hit = 0;        
dce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
dcf0: 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   if at least one
dd00: 20 72 68 73 20 69 73 20 6e 6f 74 20 45 4f 46 20   rhs is not EOF 
dd10: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 74 72 20  */.    int iPtr 
dd20: 3d 20 28 69 6e 74 29 2a 70 69 50 67 6e 6f 3b 0a  = (int)*piPgno;.
dd30: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
dd40: 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 4c 53 4d 5f  or(i=1; rc==LSM_
dd50: 4f 4b 20 26 26 20 69 3c 3d 6e 52 68 73 20 26 26  OK && i<=nRhs &&
dd60: 20 62 53 74 6f 70 3d 3d 30 3b 20 69 2b 2b 29 7b   bStop==0; i++){
dd70: 0a 20 20 20 20 20 20 53 65 67 6d 65 6e 74 50 74  .      SegmentPt
dd80: 72 20 2a 70 50 74 72 20 3d 20 26 61 50 74 72 5b  r *pPtr = &aPtr[
dd90: 69 5d 3b 0a 20 20 20 20 20 20 69 4f 75 74 20 3d  i];.      iOut =
dda0: 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
ddb0: 65 65 6b 49 6e 53 65 67 6d 65 6e 74 28 0a 20 20  eekInSegment(.  
ddc0: 20 20 20 20 20 20 20 20 70 43 73 72 2c 20 70 50          pCsr, pP
ddd0: 74 72 2c 20 69 54 6f 70 69 63 2c 20 70 4b 65 79  tr, iTopic, pKey
dde0: 2c 20 6e 4b 65 79 2c 20 69 50 74 72 2c 20 65 53  , nKey, iPtr, eS
ddf0: 65 65 6b 2c 20 26 69 4f 75 74 2c 20 26 62 53 74  eek, &iOut, &bSt
de00: 6f 70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  op.      );.    
de10: 20 20 69 50 74 72 20 3d 20 69 4f 75 74 3b 0a 0a    iPtr = iOut;..
de20: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
de30: 73 65 67 6d 65 6e 74 2d 70 6f 69 6e 74 65 72 20  segment-pointer 
de40: 68 61 73 20 73 65 74 74 6c 65 64 20 6f 6e 20 61  has settled on a
de50: 20 6b 65 79 20 74 68 61 74 20 69 73 20 73 6d 61   key that is sma
de60: 6c 6c 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20  ller than.      
de70: 2a 2a 20 74 68 65 20 73 70 6c 69 74 6b 65 79 2c  ** the splitkey,
de80: 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
de90: 73 65 67 6d 65 6e 74 2d 70 6f 69 6e 74 65 72 2e  segment-pointer.
dea0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
deb0: 50 74 72 2d 3e 70 50 67 20 29 7b 0a 20 20 20 20  Ptr->pPg ){.    
dec0: 20 20 20 20 72 65 73 20 3d 20 73 6f 72 74 65 64      res = sorted
ded0: 4b 65 79 43 6f 6d 70 61 72 65 28 70 43 73 72 2d  KeyCompare(pCsr-
dee0: 3e 70 44 62 2d 3e 78 43 6d 70 2c 20 0a 20 20 20  >pDb->xCmp, .   
def0: 20 20 20 20 20 20 20 20 20 72 74 54 6f 70 69 63           rtTopic
df00: 28 70 50 74 72 2d 3e 65 54 79 70 65 29 2c 20 70  (pPtr->eType), p
df10: 50 74 72 2d 3e 70 4b 65 79 2c 20 70 50 74 72 2d  Ptr->pKey, pPtr-
df20: 3e 6e 4b 65 79 2c 20 0a 20 20 20 20 20 20 20 20  >nKey, .        
df30: 20 20 20 20 70 4c 76 6c 2d 3e 69 53 70 6c 69 74      pLvl->iSplit
df40: 54 6f 70 69 63 2c 20 70 4c 76 6c 2d 3e 70 53 70  Topic, pLvl->pSp
df50: 6c 69 74 4b 65 79 2c 20 70 4c 76 6c 2d 3e 6e 53  litKey, pLvl->nS
df60: 70 6c 69 74 4b 65 79 0a 20 20 20 20 20 20 20 20  plitKey.        
df70: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
df80: 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  es<0 ){.        
df90: 20 20 69 66 28 20 70 50 74 72 2d 3e 65 54 79 70    if( pPtr->eTyp
dfa0: 65 20 26 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45  e & LSM_START_DE
dfb0: 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20  LETE ){.        
dfc0: 20 20 20 20 70 50 74 72 2d 3e 65 54 79 70 65 20      pPtr->eType 
dfd0: 26 3d 20 7e 4c 53 4d 5f 49 4e 53 45 52 54 3b 0a  &= ~LSM_INSERT;.
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 74 72              pPtr
dff0: 2d 3e 70 4b 65 79 20 3d 20 70 4c 76 6c 2d 3e 70  ->pKey = pLvl->p
e000: 53 70 6c 69 74 4b 65 79 3b 0a 20 20 20 20 20 20  SplitKey;.      
e010: 20 20 20 20 20 20 70 50 74 72 2d 3e 6e 4b 65 79        pPtr->nKey
e020: 20 3d 20 70 4c 76 6c 2d 3e 6e 53 70 6c 69 74 4b   = pLvl->nSplitK
e030: 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
e040: 70 50 74 72 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a  pPtr->pVal = 0;.
e050: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 74 72              pPtr
e060: 2d 3e 6e 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nVal = 0;.    
e070: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e080: 20 20 20 20 20 20 20 20 20 73 65 67 6d 65 6e 74           segment
e090: 50 74 72 52 65 73 65 74 28 70 50 74 72 2c 20 4c  PtrReset(pPtr, L
e0a0: 53 4d 5f 53 45 47 4d 45 4e 54 50 54 52 5f 46 52  SM_SEGMENTPTR_FR
e0b0: 45 45 5f 54 48 52 45 53 48 4f 4c 44 29 3b 0a 20  EE_THRESHOLD);. 
e0c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e0d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
e0e0: 20 20 20 20 69 66 28 20 61 50 74 72 5b 69 5d 2e      if( aPtr[i].
e0f0: 70 4b 65 79 20 29 20 62 48 69 74 20 3d 20 31 3b  pKey ) bHit = 1;
e100: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
e110: 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 65 53  rc==LSM_OK && eS
e120: 65 65 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 4c 45  eek==LSM_SEEK_LE
e130: 20 26 26 20 62 48 69 74 3d 3d 30 20 29 7b 0a 20   && bHit==0 ){. 
e140: 20 20 20 20 20 72 63 20 3d 20 73 65 67 6d 65 6e       rc = segmen
e150: 74 50 74 72 45 6e 64 28 70 43 73 72 2c 20 26 61  tPtrEnd(pCsr, &a
e160: 50 74 72 5b 30 5d 2c 20 31 29 3b 0a 20 20 20 20  Ptr[0], 1);.    
e170: 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
e180: 20 65 53 65 65 6b 3d 3d 4c 53 4d 5f 53 45 45 4b   eSeek==LSM_SEEK
e190: 5f 45 51 20 7c 7c 20 62 53 74 6f 70 3d 3d 30 20  _EQ || bStop==0 
e1a0: 29 3b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20 69  );.  *piPgno = i
e1b0: 4f 75 74 3b 0a 20 20 2a 70 62 53 74 6f 70 20 3d  Out;.  *pbStop =
e1c0: 20 62 53 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e   bStop;.  return
e1d0: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76   rc;.}..static v
e1e0: 6f 69 64 20 6d 75 6c 74 69 43 75 72 73 6f 72 47  oid multiCursorG
e1f0: 65 74 4b 65 79 28 0a 20 20 4d 75 6c 74 69 43 75  etKey(.  MultiCu
e200: 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20 69  rsor *pCsr, .  i
e210: 6e 74 20 69 4b 65 79 2c 0a 20 20 69 6e 74 20 2a  nt iKey,.  int *
e220: 70 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  peType,         
e230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
e240: 54 3a 20 4b 65 79 20 74 79 70 65 20 28 53 4f 52  T: Key type (SOR
e250: 54 45 44 5f 57 52 49 54 45 20 65 74 63 2e 29 20  TED_WRITE etc.) 
e260: 2a 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4b 65  */.  void **ppKe
e270: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
e280: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
e290: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
e2a0: 6f 6e 74 61 69 6e 69 6e 67 20 6b 65 79 20 2a 2f  ontaining key */
e2b0: 0a 20 20 69 6e 74 20 2a 70 6e 4b 65 79 20 20 20  .  int *pnKey   
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20     /* OUT: Size 
e2e0: 6f 66 20 2a 70 70 4b 65 79 20 69 6e 20 62 79 74  of *ppKey in byt
e2f0: 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  es */.){.  int n
e300: 4b 65 79 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20  Key = 0;.  void 
e310: 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  *pKey = 0;.  int
e320: 20 65 54 79 70 65 20 3d 20 30 3b 0a 0a 20 20 73   eType = 0;..  s
e330: 77 69 74 63 68 28 20 69 4b 65 79 20 29 7b 0a 20  witch( iKey ){. 
e340: 20 20 20 63 61 73 65 20 43 55 52 53 4f 52 5f 44     case CURSOR_D
e350: 41 54 41 5f 54 52 45 45 30 3a 0a 20 20 20 20 63  ATA_TREE0:.    c
e360: 61 73 65 20 43 55 52 53 4f 52 5f 44 41 54 41 5f  ase CURSOR_DATA_
e370: 54 52 45 45 31 3a 20 7b 0a 20 20 20 20 20 20 54  TREE1: {.      T
e380: 72 65 65 43 75 72 73 6f 72 20 2a 70 54 72 65 65  reeCursor *pTree
e390: 43 73 72 20 3d 20 70 43 73 72 2d 3e 61 70 54 72  Csr = pCsr->apTr
e3a0: 65 65 43 73 72 5b 69 4b 65 79 2d 43 55 52 53 4f  eeCsr[iKey-CURSO
e3b0: 52 5f 44 41 54 41 5f 54 52 45 45 30 5d 3b 0a 20  R_DATA_TREE0];. 
e3c0: 20 20 20 20 20 69 66 28 20 6c 73 6d 54 72 65 65       if( lsmTree
e3d0: 43 75 72 73 6f 72 56 61 6c 69 64 28 70 54 72 65  CursorValid(pTre
e3e0: 65 43 73 72 29 20 29 7b 0a 20 20 20 20 20 20 20  eCsr) ){.       
e3f0: 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 4b 65   lsmTreeCursorKe
e400: 79 28 70 54 72 65 65 43 73 72 2c 20 26 65 54 79  y(pTreeCsr, &eTy
e410: 70 65 2c 20 26 70 4b 65 79 2c 20 26 6e 4b 65 79  pe, &pKey, &nKey
e420: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e430: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
e440: 20 20 20 63 61 73 65 20 43 55 52 53 4f 52 5f 44     case CURSOR_D
e450: 41 54 41 5f 53 59 53 54 45 4d 3a 20 7b 0a 20 20  ATA_SYSTEM: {.  
e460: 20 20 20 20 53 6e 61 70 73 68 6f 74 20 2a 70 57      Snapshot *pW
e470: 6f 72 6b 65 72 20 3d 20 70 43 73 72 2d 3e 70 44  orker = pCsr->pD
e480: 62 2d 3e 70 57 6f 72 6b 65 72 3b 0a 20 20 20 20  b->pWorker;.    
e490: 20 20 69 66 28 20 70 57 6f 72 6b 65 72 20 26 26    if( pWorker &&
e4a0: 20 28 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20   (pCsr->flags & 
e4b0: 43 55 52 53 4f 52 5f 46 4c 55 53 48 5f 46 52 45  CURSOR_FLUSH_FRE
e4c0: 45 4c 49 53 54 29 20 29 7b 0a 20 20 20 20 20 20  ELIST) ){.      
e4d0: 20 20 69 6e 74 20 6e 45 6e 74 72 79 20 3d 20 70    int nEntry = p
e4e0: 57 6f 72 6b 65 72 2d 3e 66 72 65 65 6c 69 73 74  Worker->freelist
e4f0: 2e 6e 45 6e 74 72 79 3b 0a 20 20 20 20 20 20 20  .nEntry;.       
e500: 20 69 66 28 20 70 43 73 72 2d 3e 69 46 72 65 65   if( pCsr->iFree
e510: 20 3c 20 28 6e 45 6e 74 72 79 2a 32 29 20 29 7b   < (nEntry*2) ){
e520: 0a 20 20 20 20 20 20 20 20 20 20 46 72 65 65 6c  .          Freel
e530: 69 73 74 45 6e 74 72 79 20 2a 61 45 6e 74 72 79  istEntry *aEntry
e540: 20 3d 20 70 57 6f 72 6b 65 72 2d 3e 66 72 65 65   = pWorker->free
e550: 6c 69 73 74 2e 61 45 6e 74 72 79 3b 0a 20 20 20  list.aEntry;.   
e560: 20 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 6e         int i = n
e570: 45 6e 74 72 79 20 2d 20 31 20 2d 20 28 70 43 73  Entry - 1 - (pCs
e580: 72 2d 3e 69 46 72 65 65 20 2f 20 32 29 3b 0a 20  r->iFree / 2);. 
e590: 20 20 20 20 20 20 20 20 20 75 33 32 20 69 4b 65           u32 iKe
e5a0: 79 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20  y = 0;..        
e5b0: 20 20 69 66 28 20 28 70 43 73 72 2d 3e 69 46 72    if( (pCsr->iFr
e5c0: 65 65 20 25 20 32 29 20 29 7b 0a 20 20 20 20 20  ee % 2) ){.     
e5d0: 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 4c         eType = L
e5e0: 53 4d 5f 45 4e 44 5f 44 45 4c 45 54 45 7c 4c 53  SM_END_DELETE|LS
e5f0: 4d 5f 53 59 53 54 45 4d 4b 45 59 3b 0a 20 20 20  M_SYSTEMKEY;.   
e600: 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20           iKey = 
e610: 61 45 6e 74 72 79 5b 69 5d 2e 69 42 6c 6b 2d 31  aEntry[i].iBlk-1
e620: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
e630: 65 20 69 66 28 20 61 45 6e 74 72 79 5b 69 5d 2e  e if( aEntry[i].
e640: 69 49 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  iId>=0 ){.      
e650: 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 4c 53        eType = LS
e660: 4d 5f 49 4e 53 45 52 54 7c 4c 53 4d 5f 53 59 53  M_INSERT|LSM_SYS
e670: 54 45 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  TEMKEY;.        
e680: 20 20 20 20 69 4b 65 79 20 3d 20 61 45 6e 74 72      iKey = aEntr
e690: 79 5b 69 5d 2e 69 42 6c 6b 3b 0a 0a 20 20 20 20  y[i].iBlk;..    
e6a0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
e6b0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 65 6e 74 72  e in-memory entr
e6c0: 79 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65  y immediately be
e6d0: 66 6f 72 65 20 74 68 69 73 20 6f 6e 65 20 77 61  fore this one wa
e6e0: 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  s a.            
e6f0: 20 2a 2a 20 44 45 4c 45 54 45 2c 20 61 6e 64 20   ** DELETE, and 
e700: 74 68 65 20 62 6c 6f 63 6b 20 6e 75 6d 62 65 72  the block number
e710: 20 69 73 20 6f 6e 65 20 67 72 65 61 74 65 72 20   is one greater 
e720: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
e730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  .             **
e740: 20 62 6c 6f 63 6b 20 6e 75 6d 62 65 72 2c 20 6d   block number, m
e750: 61 72 6b 20 74 68 69 73 20 65 6e 74 72 79 20 61  ark this entry a
e760: 73 20 61 6e 20 22 65 6e 64 2d 64 65 6c 65 74 65  s an "end-delete
e770: 2d 72 61 6e 67 65 22 2e 20 2a 2f 0a 20 20 20 20  -range". */.    
e780: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 28 6e          if( i<(n
e790: 45 6e 74 72 79 2d 31 29 20 26 26 20 61 45 6e 74  Entry-1) && aEnt
e7a0: 72 79 5b 69 2b 31 5d 2e 69 42 6c 6b 3d 3d 69 4b  ry[i+1].iBlk==iK
e7b0: 65 79 2b 31 20 26 26 20 61 45 6e 74 72 79 5b 69  ey+1 && aEntry[i
e7c0: 2b 31 5d 2e 69 49 64 3c 30 20 29 7b 0a 20 20 20  +1].iId<0 ){.   
e7d0: 20 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65             eType
e7e0: 20 7c 3d 20 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45   |= LSM_END_DELE
e7f0: 54 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  TE;.            
e800: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  }..          }el
e810: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
e820: 65 54 79 70 65 20 3d 20 4c 53 4d 5f 53 54 41 52  eType = LSM_STAR
e830: 54 5f 44 45 4c 45 54 45 7c 4c 53 4d 5f 53 59 53  T_DELETE|LSM_SYS
e840: 54 45 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  TEMKEY;.        
e850: 20 20 20 20 69 4b 65 79 20 3d 20 61 45 6e 74 72      iKey = aEntr
e860: 79 5b 69 5d 2e 69 42 6c 6b 20 2b 20 31 3b 0a 20  y[i].iBlk + 1;. 
e870: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
e880: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
e890: 69 6e 2d 6d 65 6d 6f 72 79 20 65 6e 74 72 79 20  in-memory entry 
e8a0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
e8b0: 72 20 74 68 69 73 20 6f 6e 65 20 69 73 20 61 0a  r this one is a.
e8c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 44 45 4c            ** DEL
e8d0: 45 54 45 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ETE, and the blo
e8e0: 63 6b 20 6e 75 6d 62 65 72 20 69 73 20 6f 6e 65  ck number is one
e8f0: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 63   less than the c
e900: 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20  urrent.         
e910: 20 2a 2a 20 6b 65 79 2c 20 6d 61 72 6b 20 74 68   ** key, mark th
e920: 69 73 20 65 6e 74 72 79 20 61 73 20 61 6e 20 22  is entry as an "
e930: 73 74 61 72 74 2d 64 65 6c 65 74 65 2d 72 61 6e  start-delete-ran
e940: 67 65 22 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ge".  */.       
e950: 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 61 45     if( i>0 && aE
e960: 6e 74 72 79 5b 69 2d 31 5d 2e 69 42 6c 6b 3d 3d  ntry[i-1].iBlk==
e970: 69 4b 65 79 2d 31 20 26 26 20 61 45 6e 74 72 79  iKey-1 && aEntry
e980: 5b 69 2d 31 5d 2e 69 49 64 3c 30 20 29 7b 0a 20  [i-1].iId<0 ){. 
e990: 20 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65             eType
e9a0: 20 7c 3d 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45   |= LSM_START_DE
e9b0: 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 20 20  LETE;.          
e9c0: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  }..          pKe
e9d0: 79 20 3d 20 70 43 73 72 2d 3e 70 53 79 73 74 65  y = pCsr->pSyste
e9e0: 6d 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  mVal;.          
e9f0: 6e 4b 65 79 20 3d 20 34 3b 0a 20 20 20 20 20 20  nKey = 4;.      
ea00: 20 20 20 20 6c 73 6d 50 75 74 55 33 32 28 70 4b      lsmPutU32(pK
ea10: 65 79 2c 20 7e 69 4b 65 79 29 3b 0a 20 20 20 20  ey, ~iKey);.    
ea20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ea30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ea40: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  ..    default: {
ea50: 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 20  .      int iPtr 
ea60: 3d 20 69 4b 65 79 20 2d 20 43 55 52 53 4f 52 5f  = iKey - CURSOR_
ea70: 44 41 54 41 5f 53 45 47 4d 45 4e 54 3b 0a 20 20  DATA_SEGMENT;.  
ea80: 20 20 20 20 61 73 73 65 72 74 28 20 69 50 74 72      assert( iPtr
ea90: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
eaa0: 20 69 50 74 72 3d 3d 70 43 73 72 2d 3e 6e 50 74   iPtr==pCsr->nPt
eab0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  r ){.        if(
eac0: 20 70 43 73 72 2d 3e 70 42 74 43 73 72 20 29 7b   pCsr->pBtCsr ){
ead0: 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 20  .          pKey 
eae0: 3d 20 70 43 73 72 2d 3e 70 42 74 43 73 72 2d 3e  = pCsr->pBtCsr->
eaf0: 70 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  pKey;.          
eb00: 6e 4b 65 79 20 3d 20 70 43 73 72 2d 3e 70 42 74  nKey = pCsr->pBt
eb10: 43 73 72 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 20  Csr->nKey;.     
eb20: 20 20 20 20 20 65 54 79 70 65 20 3d 20 70 43 73       eType = pCs
eb30: 72 2d 3e 70 42 74 43 73 72 2d 3e 65 54 79 70 65  r->pBtCsr->eType
eb40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
eb50: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50 74 72    }else if( iPtr
eb60: 3c 70 43 73 72 2d 3e 6e 50 74 72 20 29 7b 0a 20  <pCsr->nPtr ){. 
eb70: 20 20 20 20 20 20 20 53 65 67 6d 65 6e 74 50 74         SegmentPt
eb80: 72 20 2a 70 50 74 72 20 3d 20 26 70 43 73 72 2d  r *pPtr = &pCsr-
eb90: 3e 61 50 74 72 5b 69 50 74 72 5d 3b 0a 20 20 20  >aPtr[iPtr];.   
eba0: 20 20 20 20 20 69 66 28 20 70 50 74 72 2d 3e 70       if( pPtr->p
ebb0: 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Pg ){.          
ebc0: 70 4b 65 79 20 3d 20 70 50 74 72 2d 3e 70 4b 65  pKey = pPtr->pKe
ebd0: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4b 65  y;.          nKe
ebe0: 79 20 3d 20 70 50 74 72 2d 3e 6e 4b 65 79 3b 0a  y = pPtr->nKey;.
ebf0: 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
ec00: 3d 20 70 50 74 72 2d 3e 65 54 79 70 65 3b 0a 20  = pPtr->eType;. 
ec10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ec20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ec30: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
ec40: 65 54 79 70 65 20 29 20 2a 70 65 54 79 70 65 20  eType ) *peType 
ec50: 3d 20 65 54 79 70 65 3b 0a 20 20 69 66 28 20 70  = eType;.  if( p
ec60: 6e 4b 65 79 20 29 20 2a 70 6e 4b 65 79 20 3d 20  nKey ) *pnKey = 
ec70: 6e 4b 65 79 3b 0a 20 20 69 66 28 20 70 70 4b 65  nKey;.  if( ppKe
ec80: 79 20 29 20 2a 70 70 4b 65 79 20 3d 20 70 4b 65  y ) *ppKey = pKe
ec90: 79 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  y;.}..static int
eca0: 20 73 6f 72 74 65 64 44 62 4b 65 79 43 6f 6d 70   sortedDbKeyComp
ecb0: 61 72 65 28 0a 20 20 4d 75 6c 74 69 43 75 72 73  are(.  MultiCurs
ecc0: 6f 72 20 2a 70 43 73 72 2c 0a 20 20 69 6e 74 20  or *pCsr,.  int 
ecd0: 69 4c 68 73 46 6c 61 67 73 2c 20 76 6f 69 64 20  iLhsFlags, void 
ece0: 2a 70 4c 68 73 4b 65 79 2c 20 69 6e 74 20 6e 4c  *pLhsKey, int nL
ecf0: 68 73 4b 65 79 2c 0a 20 20 69 6e 74 20 69 52 68  hsKey,.  int iRh
ed00: 73 46 6c 61 67 73 2c 20 76 6f 69 64 20 2a 70 52  sFlags, void *pR
ed10: 68 73 4b 65 79 2c 20 69 6e 74 20 6e 52 68 73 4b  hsKey, int nRhsK
ed20: 65 79 0a 29 7b 0a 20 20 69 6e 74 20 28 2a 78 43  ey.){.  int (*xC
ed30: 6d 70 29 28 76 6f 69 64 20 2a 2c 20 69 6e 74 2c  mp)(void *, int,
ed40: 20 76 6f 69 64 20 2a 2c 20 69 6e 74 29 20 3d 20   void *, int) = 
ed50: 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70 3b  pCsr->pDb->xCmp;
ed60: 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 2f  .  int res;..  /
ed70: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
ed80: 79 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  ys, including th
ed90: 65 20 73 79 73 74 65 6d 20 66 6c 61 67 2e 20 2a  e system flag. *
eda0: 2f 0a 20 20 72 65 73 20 3d 20 73 6f 72 74 65 64  /.  res = sorted
edb0: 4b 65 79 43 6f 6d 70 61 72 65 28 78 43 6d 70 2c  KeyCompare(xCmp,
edc0: 20 0a 20 20 20 20 72 74 54 6f 70 69 63 28 69 4c   .    rtTopic(iL
edd0: 68 73 46 6c 61 67 73 29 2c 20 70 4c 68 73 4b 65  hsFlags), pLhsKe
ede0: 79 2c 20 6e 4c 68 73 4b 65 79 2c 0a 20 20 20 20  y, nLhsKey,.    
edf0: 72 74 54 6f 70 69 63 28 69 52 68 73 46 6c 61 67  rtTopic(iRhsFlag
ee00: 73 29 2c 20 70 52 68 73 4b 65 79 2c 20 6e 52 68  s), pRhsKey, nRh
ee10: 73 4b 65 79 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  sKey.  );..  /* 
ee20: 49 66 20 61 20 6b 65 79 20 68 61 73 20 74 68 65  If a key has the
ee30: 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54   LSM_START_DELET
ee40: 45 20 66 6c 61 67 20 73 65 74 2c 20 62 75 74 20  E flag set, but 
ee50: 6e 6f 74 20 74 68 65 20 4c 53 4d 5f 49 4e 53 45  not the LSM_INSE
ee60: 52 54 20 6f 72 0a 20 20 2a 2a 20 4c 53 4d 5f 50  RT or.  ** LSM_P
ee70: 4f 49 4e 54 5f 44 45 4c 45 54 45 20 66 6c 61 67  OINT_DELETE flag
ee80: 73 2c 20 69 74 20 69 73 20 63 6f 6e 73 69 64 65  s, it is conside
ee90: 72 65 64 20 61 20 64 65 6c 74 61 20 6c 61 72 67  red a delta larg
eea0: 65 72 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74  er. This prevent
eeb0: 73 0a 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e  s.  ** the begin
eec0: 6e 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65 6e 2d  ning of an open-
eed0: 65 6e 64 65 64 20 73 65 74 20 66 72 6f 6d 20 6d  ended set from m
eee0: 61 73 6b 69 6e 67 20 61 20 64 61 74 61 62 61 73  asking a databas
eef0: 65 20 65 6e 74 72 79 20 6f 72 0a 20 20 2a 2a 20  e entry or.  ** 
ef00: 64 65 6c 65 74 65 20 61 74 20 61 20 6c 6f 77 65  delete at a lowe
ef10: 72 20 6c 65 76 65 6c 2e 20 20 2a 2f 0a 20 20 69  r level.  */.  i
ef20: 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 70 43  f( res==0 && (pC
ef30: 73 72 2d 3e 66 6c 61 67 73 20 26 20 43 55 52 53  sr->flags & CURS
ef40: 4f 52 5f 49 47 4e 4f 52 45 5f 44 45 4c 45 54 45  OR_IGNORE_DELETE
ef50: 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ) ){.    const i
ef60: 6e 74 20 6d 20 3d 20 4c 53 4d 5f 50 4f 49 4e 54  nt m = LSM_POINT
ef70: 5f 44 45 4c 45 54 45 7c 4c 53 4d 5f 49 4e 53 45  _DELETE|LSM_INSE
ef80: 52 54 7c 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45 54  RT|LSM_END_DELET
ef90: 45 20 7c 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c  E |LSM_START_DEL
efa0: 45 54 45 3b 0a 20 20 20 20 69 6e 74 20 69 44 65  ETE;.    int iDe
efb0: 6c 31 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  l1 = 0;.    int 
efc0: 69 44 65 6c 32 20 3d 20 30 3b 0a 0a 20 20 20 20  iDel2 = 0;..    
efd0: 69 66 28 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45  if( LSM_START_DE
efe0: 4c 45 54 45 3d 3d 28 69 4c 68 73 46 6c 61 67 73  LETE==(iLhsFlags
eff0: 20 26 20 6d 29 20 29 20 69 44 65 6c 31 20 3d 20   & m) ) iDel1 = 
f000: 2b 31 3b 0a 20 20 20 20 69 66 28 20 4c 53 4d 5f  +1;.    if( LSM_
f010: 45 4e 44 5f 44 45 4c 45 54 45 20 20 3d 3d 28 69  END_DELETE  ==(i
f020: 4c 68 73 46 6c 61 67 73 20 26 20 6d 29 20 29 20  LhsFlags & m) ) 
f030: 69 44 65 6c 31 20 3d 20 2d 31 3b 0a 20 20 20 20  iDel1 = -1;.    
f040: 69 66 28 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45  if( LSM_START_DE
f050: 4c 45 54 45 3d 3d 28 69 52 68 73 46 6c 61 67 73  LETE==(iRhsFlags
f060: 20 26 20 6d 29 20 29 20 69 44 65 6c 32 20 3d 20   & m) ) iDel2 = 
f070: 2b 31 3b 0a 20 20 20 20 69 66 28 20 4c 53 4d 5f  +1;.    if( LSM_
f080: 45 4e 44 5f 44 45 4c 45 54 45 20 20 3d 3d 28 69  END_DELETE  ==(i
f090: 52 68 73 46 6c 61 67 73 20 26 20 6d 29 20 29 20  RhsFlags & m) ) 
f0a0: 69 44 65 6c 32 20 3d 20 2d 31 3b 0a 0a 20 20 20  iDel2 = -1;..   
f0b0: 20 72 65 73 20 3d 20 28 69 44 65 6c 31 20 2d 20   res = (iDel1 - 
f0c0: 69 44 65 6c 32 29 3b 0a 20 20 7d 0a 0a 20 20 72  iDel2);.  }..  r
f0d0: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 73 74  eturn res;.}..st
f0e0: 61 74 69 63 20 76 6f 69 64 20 6d 75 6c 74 69 43  atic void multiC
f0f0: 75 72 73 6f 72 44 6f 43 6f 6d 70 61 72 65 28 4d  ursorDoCompare(M
f100: 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72  ultiCursor *pCsr
f110: 2c 20 69 6e 74 20 69 4f 75 74 2c 20 69 6e 74 20  , int iOut, int 
f120: 62 52 65 76 65 72 73 65 29 7b 0a 20 20 69 6e 74  bReverse){.  int
f130: 20 69 31 3b 0a 20 20 69 6e 74 20 69 32 3b 0a 20   i1;.  int i2;. 
f140: 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 76 6f 69   int iRes;.  voi
f150: 64 20 2a 70 4b 65 79 31 3b 20 69 6e 74 20 6e 4b  d *pKey1; int nK
f160: 65 79 31 3b 20 69 6e 74 20 65 54 79 70 65 31 3b  ey1; int eType1;
f170: 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 32 3b 20  .  void *pKey2; 
f180: 69 6e 74 20 6e 4b 65 79 32 3b 20 69 6e 74 20 65  int nKey2; int e
f190: 54 79 70 65 32 3b 0a 20 20 63 6f 6e 73 74 20 69  Type2;.  const i
f1a0: 6e 74 20 6d 75 6c 20 3d 20 28 62 52 65 76 65 72  nt mul = (bRever
f1b0: 73 65 20 3f 20 2d 31 20 3a 20 31 29 3b 0a 0a 20  se ? -1 : 1);.. 
f1c0: 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61   assert( pCsr->a
f1d0: 54 72 65 65 20 26 26 20 69 4f 75 74 3c 70 43 73  Tree && iOut<pCs
f1e0: 72 2d 3e 6e 54 72 65 65 20 29 3b 0a 20 20 69 66  r->nTree );.  if
f1f0: 28 20 69 4f 75 74 3e 3d 28 70 43 73 72 2d 3e 6e  ( iOut>=(pCsr->n
f200: 54 72 65 65 2f 32 29 20 29 7b 0a 20 20 20 20 69  Tree/2) ){.    i
f210: 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 43 73 72  1 = (iOut - pCsr
f220: 2d 3e 6e 54 72 65 65 2f 32 29 20 2a 20 32 3b 0a  ->nTree/2) * 2;.
f230: 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b      i2 = i1 + 1;
f240: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31  .  }else{.    i1
f250: 20 3d 20 70 43 73 72 2d 3e 61 54 72 65 65 5b 69   = pCsr->aTree[i
f260: 4f 75 74 2a 32 5d 3b 0a 20 20 20 20 69 32 20 3d  Out*2];.    i2 =
f270: 20 70 43 73 72 2d 3e 61 54 72 65 65 5b 69 4f 75   pCsr->aTree[iOu
f280: 74 2a 32 2b 31 5d 3b 0a 20 20 7d 0a 0a 20 20 6d  t*2+1];.  }..  m
f290: 75 6c 74 69 43 75 72 73 6f 72 47 65 74 4b 65 79  ultiCursorGetKey
f2a0: 28 70 43 73 72 2c 20 69 31 2c 20 26 65 54 79 70  (pCsr, i1, &eTyp
f2b0: 65 31 2c 20 26 70 4b 65 79 31 2c 20 26 6e 4b 65  e1, &pKey1, &nKe
f2c0: 79 31 29 3b 0a 20 20 6d 75 6c 74 69 43 75 72 73  y1);.  multiCurs
f2d0: 6f 72 47 65 74 4b 65 79 28 70 43 73 72 2c 20 69  orGetKey(pCsr, i
f2e0: 32 2c 20 26 65 54 79 70 65 32 2c 20 26 70 4b 65  2, &eType2, &pKe
f2f0: 79 32 2c 20 26 6e 4b 65 79 32 29 3b 0a 0a 20 20  y2, &nKey2);..  
f300: 69 66 28 20 70 4b 65 79 31 3d 3d 30 20 29 7b 0a  if( pKey1==0 ){.
f310: 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20      iRes = i2;. 
f320: 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 32   }else if( pKey2
f330: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 52 65 73 20  ==0 ){.    iRes 
f340: 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = i1;.  }else{. 
f350: 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20     int res;..   
f360: 20 2f 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20   /* Compare the 
f370: 6b 65 79 73 20 2a 2f 0a 20 20 20 20 72 65 73 20  keys */.    res 
f380: 3d 20 73 6f 72 74 65 64 44 62 4b 65 79 43 6f 6d  = sortedDbKeyCom
f390: 70 61 72 65 28 70 43 73 72 2c 0a 20 20 20 20 20  pare(pCsr,.     
f3a0: 20 20 20 65 54 79 70 65 31 2c 20 70 4b 65 79 31     eType1, pKey1
f3b0: 2c 20 6e 4b 65 79 31 2c 20 65 54 79 70 65 32 2c  , nKey1, eType2,
f3c0: 20 70 4b 65 79 32 2c 20 6e 4b 65 79 32 0a 20 20   pKey2, nKey2.  
f3d0: 20 20 29 3b 0a 0a 20 20 20 20 72 65 73 20 3d 20    );..    res = 
f3e0: 72 65 73 20 2a 20 6d 75 6c 3b 0a 20 20 20 20 69  res * mul;.    i
f3f0: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
f400: 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6b 65     /* The two ke
f410: 79 73 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ys are identical
f420: 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73  . Normally, this
f430: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
f440: 6b 65 79 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a  key from.      *
f450: 2a 20 74 68 65 20 6e 65 77 65 72 20 72 75 6e 20  * the newer run 
f460: 63 6c 6f 62 62 65 72 73 20 74 68 65 20 6f 6c 64  clobbers the old
f470: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
f480: 65 20 6e 65 77 65 72 20 6b 65 79 20 69 73 20 61  e newer key is a
f490: 0a 20 20 20 20 20 20 2a 2a 20 73 65 70 61 72 61  .      ** separa
f4a0: 74 6f 72 20 6b 65 79 2c 20 6f 72 20 61 20 72 61  tor key, or a ra
f4b0: 6e 67 65 2d 64 65 6c 65 74 65 2d 62 6f 75 6e 64  nge-delete-bound
f4c0: 61 72 79 20 6f 6e 6c 79 2c 20 64 6f 20 6e 6f 74  ary only, do not
f4d0: 20 61 6c 6c 6f 77 20 69 74 0a 20 20 20 20 20 20   allow it.      
f4e0: 2a 2a 20 74 6f 20 63 6c 6f 62 62 65 72 20 61 6e  ** to clobber an
f4f0: 20 6f 6c 64 65 72 20 65 6e 74 72 79 2e 20 20 2a   older entry.  *
f500: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 63 31 20  /.      int nc1 
f510: 3d 20 28 65 54 79 70 65 31 20 26 20 28 4c 53 4d  = (eType1 & (LSM
f520: 5f 49 4e 53 45 52 54 7c 4c 53 4d 5f 50 4f 49 4e  _INSERT|LSM_POIN
f530: 54 5f 44 45 4c 45 54 45 29 29 3d 3d 30 3b 0a 20  T_DELETE))==0;. 
f540: 20 20 20 20 20 69 6e 74 20 6e 63 32 20 3d 20 28       int nc2 = (
f550: 65 54 79 70 65 32 20 26 20 28 4c 53 4d 5f 49 4e  eType2 & (LSM_IN
f560: 53 45 52 54 7c 4c 53 4d 5f 50 4f 49 4e 54 5f 44  SERT|LSM_POINT_D
f570: 45 4c 45 54 45 29 29 3d 3d 30 3b 0a 20 20 20 20  ELETE))==0;.    
f580: 20 20 69 52 65 73 20 3d 20 28 6e 63 31 20 3e 20    iRes = (nc1 > 
f590: 6e 63 32 29 20 3f 20 69 32 20 3a 20 69 31 3b 0a  nc2) ? i2 : i1;.
f5a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
f5b0: 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65  s<0 ){.      iRe
f5c0: 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73  s = i1;.    }els
f5d0: 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20  e{.      iRes = 
f5e0: 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  i2;.    }.  }.. 
f5f0: 20 70 43 73 72 2d 3e 61 54 72 65 65 5b 69 4f 75   pCsr->aTree[iOu
f600: 74 5d 20 3d 20 69 52 65 73 3b 0a 7d 0a 0a 2f 2a  t] = iRes;.}../*
f610: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
f620: 6e 20 61 64 76 61 6e 63 65 73 20 73 65 67 6d 65  n advances segme
f630: 6e 74 20 70 6f 69 6e 74 65 72 20 69 50 74 72 20  nt pointer iPtr 
f640: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 6d 75 6c  belonging to mul
f650: 74 69 2d 63 75 72 73 6f 72 0a 2a 2a 20 70 43 73  ti-cursor.** pCs
f660: 72 20 66 6f 72 77 61 72 64 20 28 62 52 65 76 65  r forward (bReve
f670: 72 73 65 3d 3d 30 29 20 6f 72 20 62 61 63 6b 77  rse==0) or backw
f680: 61 72 64 20 28 62 52 65 76 65 72 73 65 21 3d 30  ard (bReverse!=0
f690: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
f6a0: 73 65 67 6d 65 6e 74 20 70 6f 69 6e 74 65 72 20  segment pointer 
f6b0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 65 67 6d  points to a segm
f6c0: 65 6e 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ent that is part
f6d0: 20 6f 66 20 61 20 63 6f 6d 70 6f 73 69 74 65 0a   of a composite.
f6e0: 2a 2a 20 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74  ** level, then t
f6f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 70 65  he following spe
f700: 63 69 61 6c 20 63 61 73 65 20 69 73 20 68 61 6e  cial case is han
f710: 64 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  dled..**.**   * 
f720: 49 66 20 69 50 74 72 20 69 73 20 74 68 65 20 6c  If iPtr is the l
f730: 68 73 20 6f 66 20 61 20 63 6f 6d 70 6f 73 69 74  hs of a composit
f740: 65 20 6c 65 76 65 6c 2c 20 61 6e 64 20 74 68 65  e level, and the
f750: 20 63 75 72 73 6f 72 20 69 73 20 62 65 69 6e 67   cursor is being
f760: 0a 2a 2a 20 20 20 20 20 61 64 76 61 6e 63 65 64  .**     advanced
f770: 20 66 6f 72 77 61 72 64 73 2c 20 61 6e 64 20 73   forwards, and s
f780: 65 67 6d 65 6e 74 20 69 50 74 72 20 69 73 20 61  egment iPtr is a
f790: 74 20 45 4f 46 2c 20 6d 6f 76 65 20 61 6c 6c 20  t EOF, move all 
f7a0: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 20 20 20 20  pointers.**     
f7b0: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
f7c0: 74 6f 20 72 68 73 20 73 65 67 6d 65 6e 74 73 20  to rhs segments 
f7d0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 65 76 65  of the same leve
f7e0: 6c 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  l to the first.*
f7f0: 2a 20 20 20 20 20 6b 65 79 20 69 6e 20 74 68 65  *     key in the
f800: 69 72 20 72 65 73 70 65 63 74 69 76 65 20 64 61  ir respective da
f810: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ta..*/.static in
f820: 74 20 73 65 67 6d 65 6e 74 43 75 72 73 6f 72 41  t segmentCursorA
f830: 64 76 61 6e 63 65 28 0a 20 20 4d 75 6c 74 69 43  dvance(.  MultiC
f840: 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20  ursor *pCsr, .  
f850: 69 6e 74 20 69 50 74 72 2c 0a 20 20 69 6e 74 20  int iPtr,.  int 
f860: 62 52 65 76 65 72 73 65 0a 29 7b 0a 20 20 69 6e  bReverse.){.  in
f870: 74 20 72 63 3b 0a 20 20 53 65 67 6d 65 6e 74 50  t rc;.  SegmentP
f880: 74 72 20 2a 70 50 74 72 20 3d 20 26 70 43 73 72  tr *pPtr = &pCsr
f890: 2d 3e 61 50 74 72 5b 69 50 74 72 5d 3b 0a 20 20  ->aPtr[iPtr];.  
f8a0: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 70 50  Level *pLvl = pP
f8b0: 74 72 2d 3e 70 4c 65 76 65 6c 3b 0a 20 20 69 6e  tr->pLevel;.  in
f8c0: 74 20 62 43 6f 6d 70 6f 73 69 74 65 3b 20 20 20  t bComposite;   
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f8e0: 20 54 72 75 65 20 69 66 20 70 50 74 72 20 69 73   True if pPtr is
f8f0: 20 70 61 72 74 20 6f 66 20 63 6f 6d 70 6f 73 69   part of composi
f900: 74 65 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 2f  te level */..  /
f910: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 73 65  * Advance the se
f920: 67 6d 65 6e 74 2d 70 6f 69 6e 74 65 72 20 6f 62  gment-pointer ob
f930: 6a 65 63 74 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ject. */.  rc = 
f940: 73 65 67 6d 65 6e 74 50 74 72 41 64 76 61 6e 63  segmentPtrAdvanc
f950: 65 28 70 43 73 72 2c 20 70 50 74 72 2c 20 62 52  e(pCsr, pPtr, bR
f960: 65 76 65 72 73 65 29 3b 0a 20 20 69 66 28 20 72  everse);.  if( r
f970: 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72 65 74 75  c!=LSM_OK ) retu
f980: 72 6e 20 72 63 3b 0a 0a 20 20 62 43 6f 6d 70 6f  rn rc;..  bCompo
f990: 73 69 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 52  site = (pLvl->nR
f9a0: 69 67 68 74 3e 30 20 26 26 20 70 43 73 72 2d 3e  ight>0 && pCsr->
f9b0: 6e 50 74 72 3e 70 4c 76 6c 2d 3e 6e 52 69 67 68  nPtr>pLvl->nRigh
f9c0: 74 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d 70 6f  t);.  if( bCompo
f9d0: 73 69 74 65 20 26 26 20 70 50 74 72 2d 3e 70 50  site && pPtr->pP
f9e0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  g==0 ){.    int 
f9f0: 62 46 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66  bFix = 0;.    if
fa00: 28 20 28 62 52 65 76 65 72 73 65 3d 3d 30 29 3d  ( (bReverse==0)=
fa10: 3d 28 70 50 74 72 2d 3e 70 53 65 67 3d 3d 26 70  =(pPtr->pSeg==&p
fa20: 4c 76 6c 2d 3e 6c 68 73 29 20 29 7b 0a 20 20 20  Lvl->lhs) ){.   
fa30: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
fa40: 69 66 28 20 62 52 65 76 65 72 73 65 20 29 7b 0a  if( bReverse ){.
fa50: 20 20 20 20 20 20 20 20 53 65 67 6d 65 6e 74 50          SegmentP
fa60: 74 72 20 2a 70 4c 68 73 20 3d 20 26 70 43 73 72  tr *pLhs = &pCsr
fa70: 2d 3e 61 50 74 72 5b 69 50 74 72 20 2d 20 31 20  ->aPtr[iPtr - 1 
fa80: 2d 20 28 70 50 74 72 2d 3e 70 53 65 67 20 2d 20  - (pPtr->pSeg - 
fa90: 70 4c 76 6c 2d 3e 61 52 68 73 29 5d 3b 0a 20 20  pLvl->aRhs)];.  
faa0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
fab0: 3c 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 3b 20 69  <pLvl->nRight; i
fac0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
fad0: 66 28 20 70 4c 68 73 5b 69 2b 31 5d 2e 70 50 67  f( pLhs[i+1].pPg
fae0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
faf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
fb00: 69 3d 3d 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 20  i==pLvl->nRight 
fb10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 46 69  ){.          bFi
fb20: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  x = 1;.         
fb30: 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72   rc = segmentPtr
fb40: 45 6e 64 28 70 43 73 72 2c 20 70 4c 68 73 2c 20  End(pCsr, pLhs, 
fb50: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
fb60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fb70: 20 20 20 62 46 69 78 20 3d 20 31 3b 0a 20 20 20     bFix = 1;.   
fb80: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63       for(i=0; rc
fb90: 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 69 3c 70 4c  ==LSM_OK && i<pL
fba0: 76 6c 2d 3e 6e 52 69 67 68 74 3b 20 69 2b 2b 29  vl->nRight; i++)
fbb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
fbc0: 20 73 6f 72 74 65 64 52 68 73 46 69 72 73 74 28   sortedRhsFirst(
fbd0: 70 43 73 72 2c 20 70 4c 76 6c 2c 20 26 70 43 73  pCsr, pLvl, &pCs
fbe0: 72 2d 3e 61 50 74 72 5b 69 50 74 72 2b 31 2b 69  r->aPtr[iPtr+1+i
fbf0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
fc00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
fc10: 20 69 66 28 20 62 46 69 78 20 29 7b 0a 20 20 20   if( bFix ){.   
fc20: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
fc30: 66 6f 72 28 69 3d 70 43 73 72 2d 3e 6e 54 72 65  for(i=pCsr->nTre
fc40: 65 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  e-1; i>0; i--){.
fc50: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 43 75 72          multiCur
fc60: 73 6f 72 44 6f 43 6f 6d 70 61 72 65 28 70 43 73  sorDoCompare(pCs
fc70: 72 2c 20 69 2c 20 62 52 65 76 65 72 73 65 29 3b  r, i, bReverse);
fc80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fc90: 20 7d 0a 0a 23 69 66 20 30 0a 20 20 69 66 28 20   }..#if 0.  if( 
fca0: 62 43 6f 6d 70 6f 73 69 74 65 20 26 26 20 70 50  bComposite && pP
fcb0: 74 72 2d 3e 70 53 65 67 3d 3d 26 70 4c 76 6c 2d  tr->pSeg==&pLvl-
fcc0: 3e 6c 68 73 20 20 20 20 20 20 20 2f 2a 20 6c 68  >lhs       /* lh
fcd0: 73 20 6f 66 20 63 6f 6d 70 6f 73 69 74 65 20 6c  s of composite l
fce0: 65 76 65 6c 20 2a 2f 0a 20 20 20 26 26 20 62 52  evel */.   && bR
fcf0: 65 76 65 72 73 65 3d 3d 30 20 20 20 20 20 20 20  everse==0       
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 73 72 20           /* csr 
fd20: 61 64 76 61 6e 63 65 64 20 66 6f 72 77 61 72 64  advanced forward
fd30: 73 20 2a 2f 0a 20 20 20 26 26 20 70 50 74 72 2d  s */.   && pPtr-
fd40: 3e 70 50 67 3d 3d 30 20 20 20 20 20 20 20 20 20  >pPg==0         
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd60: 20 20 20 20 20 20 2f 2a 20 73 65 67 6d 65 6e 74        /* segment
fd70: 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 29 7b 0a   at EOF */.  ){.
fd80: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
fd90: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 4c 53 4d 5f  or(i=0; rc==LSM_
fda0: 4f 4b 20 26 26 20 69 3c 70 4c 76 6c 2d 3e 6e 52  OK && i<pLvl->nR
fdb0: 69 67 68 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ight; i++){.    
fdc0: 20 20 72 63 20 3d 20 73 6f 72 74 65 64 52 68 73    rc = sortedRhs
fdd0: 46 69 72 73 74 28 70 43 73 72 2c 20 70 4c 76 6c  First(pCsr, pLvl
fde0: 2c 20 26 70 43 73 72 2d 3e 61 50 74 72 5b 69 50  , &pCsr->aPtr[iP
fdf0: 74 72 2b 31 2b 69 5d 29 3b 0a 20 20 20 20 7d 0a  tr+1+i]);.    }.
fe00: 20 20 20 20 66 6f 72 28 69 3d 70 43 73 72 2d 3e      for(i=pCsr->
fe10: 6e 54 72 65 65 2d 31 3b 20 69 3e 30 3b 20 69 2d  nTree-1; i>0; i-
fe20: 2d 29 7b 0a 20 20 20 20 20 20 6d 75 6c 74 69 43  -){.      multiC
fe30: 75 72 73 6f 72 44 6f 43 6f 6d 70 61 72 65 28 70  ursorDoCompare(p
fe40: 43 73 72 2c 20 69 2c 20 30 29 3b 0a 20 20 20 20  Csr, i, 0);.    
fe50: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
fe60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
fe70: 61 74 69 63 20 76 6f 69 64 20 6d 63 75 72 73 6f  atic void mcurso
fe80: 72 46 72 65 65 43 6f 6d 70 6f 6e 65 6e 74 73 28  rFreeComponents(
fe90: 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73  MultiCursor *pCs
fea0: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6c  r){.  int i;.  l
feb0: 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 20 3d 20 70  sm_env *pEnv = p
fec0: 43 73 72 2d 3e 70 44 62 2d 3e 70 45 6e 76 3b 0a  Csr->pDb->pEnv;.
fed0: 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20  .  /* Close the 
fee0: 74 72 65 65 20 63 75 72 73 6f 72 2c 20 69 66 20  tree cursor, if 
fef0: 61 6e 79 2e 20 2a 2f 0a 20 20 6c 73 6d 54 72 65  any. */.  lsmTre
ff00: 65 43 75 72 73 6f 72 44 65 73 74 72 6f 79 28 70  eCursorDestroy(p
ff10: 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72 5b 30  Csr->apTreeCsr[0
ff20: 5d 29 3b 0a 20 20 6c 73 6d 54 72 65 65 43 75 72  ]);.  lsmTreeCur
ff30: 73 6f 72 44 65 73 74 72 6f 79 28 70 43 73 72 2d  sorDestroy(pCsr-
ff40: 3e 61 70 54 72 65 65 43 73 72 5b 31 5d 29 3b 0a  >apTreeCsr[1]);.
ff50: 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20  .  /* Reset the 
ff60: 73 65 67 6d 65 6e 74 20 70 6f 69 6e 74 65 72 73  segment pointers
ff70: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
ff80: 3c 70 43 73 72 2d 3e 6e 50 74 72 3b 20 69 2b 2b  <pCsr->nPtr; i++
ff90: 29 7b 0a 20 20 20 20 73 65 67 6d 65 6e 74 50 74  ){.    segmentPt
ffa0: 72 52 65 73 65 74 28 26 70 43 73 72 2d 3e 61 50  rReset(&pCsr->aP
ffb0: 74 72 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a  tr[i], 0);.  }..
ffc0: 20 20 2f 2a 20 41 6e 64 20 74 68 65 20 62 2d 74    /* And the b-t
ffd0: 72 65 65 20 63 75 72 73 6f 72 2c 20 69 66 20 61  ree cursor, if a
ffe0: 6e 79 20 2a 2f 0a 20 20 62 74 72 65 65 43 75 72  ny */.  btreeCur
fff0: 73 6f 72 46 72 65 65 28 70 43 73 72 2d 3e 70 42  sorFree(pCsr->pB
10000 74 43 73 72 29 3b 0a 0a 20 20 2f 2a 20 46 72 65  tCsr);..  /* Fre
10010 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 2a 2f  e allocations */
10020 0a 20 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c  .  lsmFree(pEnv,
10030 20 70 43 73 72 2d 3e 61 50 74 72 29 3b 0a 20 20   pCsr->aPtr);.  
10040 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c 20 70 43  lsmFree(pEnv, pC
10050 73 72 2d 3e 61 54 72 65 65 29 3b 0a 20 20 6c 73  sr->aTree);.  ls
10060 6d 46 72 65 65 28 70 45 6e 76 2c 20 70 43 73 72  mFree(pEnv, pCsr
10070 2d 3e 70 53 79 73 74 65 6d 56 61 6c 29 3b 0a 0a  ->pSystemVal);..
10080 20 20 2f 2a 20 5a 65 72 6f 20 66 69 65 6c 64 73    /* Zero fields
10090 20 2a 2f 0a 20 20 70 43 73 72 2d 3e 6e 50 74 72   */.  pCsr->nPtr
100a0 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d 3e 61 50   = 0;.  pCsr->aP
100b0 74 72 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d 3e  tr = 0;.  pCsr->
100c0 6e 54 72 65 65 20 3d 20 30 3b 0a 20 20 70 43 73  nTree = 0;.  pCs
100d0 72 2d 3e 61 54 72 65 65 20 3d 20 30 3b 0a 20 20  r->aTree = 0;.  
100e0 70 43 73 72 2d 3e 70 53 79 73 74 65 6d 56 61 6c  pCsr->pSystemVal
100f0 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d 3e 61 70   = 0;.  pCsr->ap
10100 54 72 65 65 43 73 72 5b 30 5d 20 3d 20 30 3b 0a  TreeCsr[0] = 0;.
10110 20 20 70 43 73 72 2d 3e 61 70 54 72 65 65 43 73    pCsr->apTreeCs
10120 72 5b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 73 72  r[1] = 0;.  pCsr
10130 2d 3e 70 42 74 43 73 72 20 3d 20 30 3b 0a 7d 0a  ->pBtCsr = 0;.}.
10140 0a 76 6f 69 64 20 6c 73 6d 4d 43 75 72 73 6f 72  .void lsmMCursor
10150 46 72 65 65 43 61 63 68 65 28 6c 73 6d 5f 64 62  FreeCache(lsm_db
10160 20 2a 70 44 62 29 7b 0a 20 20 4d 75 6c 74 69 43   *pDb){.  MultiC
10170 75 72 73 6f 72 20 2a 70 3b 0a 20 20 4d 75 6c 74  ursor *p;.  Mult
10180 69 43 75 72 73 6f 72 20 2a 70 4e 65 78 74 3b 0a  iCursor *pNext;.
10190 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70 43 73    for(p=pDb->pCs
101a0 72 43 61 63 68 65 3b 20 70 3b 20 70 3d 70 4e 65  rCache; p; p=pNe
101b0 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
101c0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 6c   p->pNext;.    l
101d0 73 6d 4d 43 75 72 73 6f 72 43 6c 6f 73 65 28 70  smMCursorClose(p
101e0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 44 62 2d  , 0);.  }.  pDb-
101f0 3e 70 43 73 72 43 61 63 68 65 20 3d 20 30 3b 0a  >pCsrCache = 0;.
10200 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
10210 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
10220 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
10230 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
10240 20 74 68 65 20 62 43 61 63 68 65 20 70 61 72 61   the bCache para
10250 6d 65 74 65 72 20 69 73 20 74 72 75 65 2c 20 74  meter is true, t
10260 68 65 6e 20 73 68 69 66 74 20 74 68 65 20 63 75  hen shift the cu
10270 72 73 6f 72 20 74 6f 20 74 68 65 20 70 43 73 72  rsor to the pCsr
10280 43 61 63 68 65 0a 2a 2a 20 6c 69 73 74 20 66 6f  Cache.** list fo
10290 72 20 70 6f 73 73 69 62 6c 65 20 72 65 75 73 65  r possible reuse
102a0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 63 74 75   instead of actu
102b0 61 6c 6c 79 20 64 65 6c 65 74 69 6e 67 20 69 74  ally deleting it
102c0 2e 0a 2a 2f 0a 76 6f 69 64 20 6c 73 6d 4d 43 75  ..*/.void lsmMCu
102d0 72 73 6f 72 43 6c 6f 73 65 28 4d 75 6c 74 69 43  rsorClose(MultiC
102e0 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74  ursor *pCsr, int
102f0 20 62 43 61 63 68 65 29 7b 0a 20 20 69 66 28 20   bCache){.  if( 
10300 70 43 73 72 20 29 7b 0a 20 20 20 20 6c 73 6d 5f  pCsr ){.    lsm_
10310 64 62 20 2a 70 44 62 20 3d 20 70 43 73 72 2d 3e  db *pDb = pCsr->
10320 70 44 62 3b 0a 20 20 20 20 4d 75 6c 74 69 43 75  pDb;.    MultiCu
10330 72 73 6f 72 20 2a 2a 70 70 3b 20 20 20 20 20 20  rsor **pp;      
10340 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
10350 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a  or variable */..
10360 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
10370 72 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  r may or may not
10380 20 62 65 20 63 75 72 72 65 6e 74 6c 79 20 70 61   be currently pa
10390 72 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64  rt of the linked
103a0 20 6c 69 73 74 20 0a 20 20 20 20 2a 2a 20 73 74   list .    ** st
103b0 61 72 74 69 6e 67 20 61 74 20 6c 73 6d 5f 64 62  arting at lsm_db
103c0 2e 70 43 73 72 2e 20 49 66 20 69 74 20 69 73 2c  .pCsr. If it is,
103d0 20 65 78 74 72 61 63 74 20 69 74 2e 20 20 2a 2f   extract it.  */
103e0 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 70 44 62  .    for(pp=&pDb
103f0 2d 3e 70 43 73 72 3b 20 2a 70 70 3b 20 70 70 3d  ->pCsr; *pp; pp=
10400 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
10410 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 70 70 3d  {.      if( *pp=
10420 3d 70 43 73 72 20 29 7b 0a 20 20 20 20 20 20 20  =pCsr ){.       
10430 20 2a 70 70 20 3d 20 70 43 73 72 2d 3e 70 4e 65   *pp = pCsr->pNe
10440 78 74 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  xt;.        brea
10450 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
10460 0a 0a 20 20 20 20 69 66 28 20 62 43 61 63 68 65  ..    if( bCache
10470 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
104a0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
104b0 20 73 65 67 6d 65 6e 74 2d 70 6f 69 6e 74 65 72   segment-pointer
104c0 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 52  s */..      /* R
104d0 65 6c 65 61 73 65 20 61 6e 79 20 70 61 67 65 20  elease any page 
104e0 72 65 66 65 72 65 6e 63 65 73 20 68 65 6c 64 20  references held 
104f0 62 79 20 74 68 69 73 20 63 75 72 73 6f 72 2e 20  by this cursor. 
10500 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
10510 20 21 70 43 73 72 2d 3e 70 42 74 43 73 72 20 29   !pCsr->pBtCsr )
10520 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
10530 20 69 3c 70 43 73 72 2d 3e 6e 50 74 72 3b 20 69   i<pCsr->nPtr; i
10540 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 65 67  ++){.        Seg
10550 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 20 3d 20  mentPtr *pPtr = 
10560 26 70 43 73 72 2d 3e 61 50 74 72 5b 69 5d 3b 0a  &pCsr->aPtr[i];.
10570 20 20 20 20 20 20 20 20 6c 73 6d 46 73 50 61 67          lsmFsPag
10580 65 52 65 6c 65 61 73 65 28 70 50 74 72 2d 3e 70  eRelease(pPtr->p
10590 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70 50 74  Pg);.        pPt
105a0 72 2d 3e 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  r->pPg = 0;.    
105b0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65    }..      /* Re
105c0 73 65 74 20 74 68 65 20 74 72 65 65 20 63 75 72  set the tree cur
105d0 73 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 6c 73  sors */.      ls
105e0 6d 54 72 65 65 43 75 72 73 6f 72 52 65 73 65 74  mTreeCursorReset
105f0 28 70 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72  (pCsr->apTreeCsr
10600 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6c 73 6d 54  [0]);.      lsmT
10610 72 65 65 43 75 72 73 6f 72 52 65 73 65 74 28 70  reeCursorReset(p
10620 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72 5b 31  Csr->apTreeCsr[1
10630 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64  ]);..      /* Ad
10640 64 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  d the cursor to 
10650 74 68 65 20 70 43 73 72 43 61 63 68 65 20 6c 69  the pCsrCache li
10660 73 74 20 2a 2f 0a 20 20 20 20 20 20 70 43 73 72  st */.      pCsr
10670 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
10680 43 73 72 43 61 63 68 65 3b 0a 20 20 20 20 20 20  CsrCache;.      
10690 70 44 62 2d 3e 70 43 73 72 43 61 63 68 65 20 3d  pDb->pCsrCache =
106a0 20 70 43 73 72 3b 0a 20 20 20 20 7d 65 6c 73 65   pCsr;.    }else
106b0 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20  {.      /* Free 
106c0 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 75  the allocation u
106d0 73 65 64 20 74 6f 20 63 61 63 68 65 20 74 68 65  sed to cache the
106e0 20 63 75 72 72 65 6e 74 20 6b 65 79 2c 20 69 66   current key, if
106f0 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20 20 73   any. */.      s
10700 6f 72 74 65 64 42 6c 6f 62 46 72 65 65 28 26 70  ortedBlobFree(&p
10710 43 73 72 2d 3e 6b 65 79 29 3b 0a 20 20 20 20 20  Csr->key);.     
10720 20 73 6f 72 74 65 64 42 6c 6f 62 46 72 65 65 28   sortedBlobFree(
10730 26 70 43 73 72 2d 3e 76 61 6c 29 3b 0a 0a 20 20  &pCsr->val);..  
10740 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20      /* Free the 
10750 63 6f 6d 70 6f 6e 65 6e 74 20 63 75 72 73 6f 72  component cursor
10760 73 20 2a 2f 0a 20 20 20 20 20 20 6d 63 75 72 73  s */.      mcurs
10770 6f 72 46 72 65 65 43 6f 6d 70 6f 6e 65 6e 74 73  orFreeComponents
10780 28 70 43 73 72 29 3b 0a 0a 20 20 20 20 20 20 2f  (pCsr);..      /
10790 2a 20 46 72 65 65 20 74 68 65 20 63 75 72 73 6f  * Free the curso
107a0 72 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  r structure itse
107b0 6c 66 20 2a 2f 0a 20 20 20 20 20 20 6c 73 6d 46  lf */.      lsmF
107c0 72 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70  ree(pDb->pEnv, p
107d0 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Csr);.    }.  }.
107e0 7d 0a 0a 23 64 65 66 69 6e 65 20 54 52 45 45 5f  }..#define TREE_
107f0 4e 4f 4e 45 20 30 0a 23 64 65 66 69 6e 65 20 54  NONE 0.#define T
10800 52 45 45 5f 4f 4c 44 20 20 31 0a 23 64 65 66 69  REE_OLD  1.#defi
10810 6e 65 20 54 52 45 45 5f 42 4f 54 48 20 32 0a 0a  ne TREE_BOTH 2..
10820 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
10830 65 54 72 65 65 20 69 73 20 6f 6e 65 20 6f 66 20  eTree is one of 
10840 54 52 45 45 5f 4f 4c 44 20 6f 72 20 54 52 45 45  TREE_OLD or TREE
10850 5f 42 4f 54 48 2e 0a 2a 2f 0a 73 74 61 74 69 63  _BOTH..*/.static
10860 20 69 6e 74 20 6d 75 6c 74 69 43 75 72 73 6f 72   int multiCursor
10870 41 64 64 54 72 65 65 28 4d 75 6c 74 69 43 75 72  AddTree(MultiCur
10880 73 6f 72 20 2a 70 43 73 72 2c 20 53 6e 61 70 73  sor *pCsr, Snaps
10890 68 6f 74 20 2a 70 53 6e 61 70 2c 20 69 6e 74 20  hot *pSnap, int 
108a0 65 54 72 65 65 29 7b 0a 20 20 69 6e 74 20 72 63  eTree){.  int rc
108b0 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 6c 73 6d   = LSM_OK;.  lsm
108c0 5f 64 62 20 2a 64 62 20 3d 20 70 43 73 72 2d 3e  _db *db = pCsr->
108d0 70 44 62 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61  pDb;..  /* Add a
108e0 20 74 72 65 65 20 63 75 72 73 6f 72 20 6f 6e 20   tree cursor on 
108f0 74 68 65 20 27 6f 6c 64 27 20 74 72 65 65 2c 20  the 'old' tree, 
10900 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f  if it exists. */
10910 0a 20 20 69 66 28 20 65 54 72 65 65 21 3d 54 52  .  if( eTree!=TR
10920 45 45 5f 4e 4f 4e 45 20 0a 20 20 20 26 26 20 6c  EE_NONE .   && l
10930 73 6d 54 72 65 65 48 61 73 4f 6c 64 28 64 62 29  smTreeHasOld(db)
10940 20 0a 20 20 20 26 26 20 64 62 2d 3e 74 72 65 65   .   && db->tree
10950 68 64 72 2e 69 4f 6c 64 4c 6f 67 21 3d 70 53 6e  hdr.iOldLog!=pSn
10960 61 70 2d 3e 69 4c 6f 67 4f 66 66 20 0a 20 20 29  ap->iLogOff .  )
10970 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 54 72  {.    rc = lsmTr
10980 65 65 43 75 72 73 6f 72 4e 65 77 28 64 62 2c 20  eeCursorNew(db, 
10990 31 2c 20 26 70 43 73 72 2d 3e 61 70 54 72 65 65  1, &pCsr->apTree
109a0 43 73 72 5b 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20  Csr[1]);.  }..  
109b0 2f 2a 20 41 64 64 20 61 20 74 72 65 65 20 63 75  /* Add a tree cu
109c0 72 73 6f 72 20 6f 6e 20 74 68 65 20 27 63 75 72  rsor on the 'cur
109d0 72 65 6e 74 27 20 74 72 65 65 2c 20 69 66 20 72  rent' tree, if r
109e0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
109f0 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20  ( rc==LSM_OK && 
10a00 65 54 72 65 65 3d 3d 54 52 45 45 5f 42 4f 54 48  eTree==TREE_BOTH
10a10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d   ){.    rc = lsm
10a20 54 72 65 65 43 75 72 73 6f 72 4e 65 77 28 64 62  TreeCursorNew(db
10a30 2c 20 30 2c 20 26 70 43 73 72 2d 3e 61 70 54 72  , 0, &pCsr->apTr
10a40 65 65 43 73 72 5b 30 5d 29 3b 0a 20 20 7d 0a 0a  eeCsr[0]);.  }..
10a50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10a60 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
10a70 43 75 72 73 6f 72 41 64 64 52 68 73 28 4d 75 6c  CursorAddRhs(Mul
10a80 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  tiCursor *pCsr, 
10a90 4c 65 76 65 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20  Level *pLvl){.  
10aa0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52 68  int i;.  int nRh
10ab0 73 20 3d 20 70 4c 76 6c 2d 3e 6e 52 69 67 68 74  s = pLvl->nRight
10ac0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76  ;..  assert( pLv
10ad0 6c 2d 3e 6e 52 69 67 68 74 3e 30 20 29 3b 0a 20  l->nRight>0 );. 
10ae0 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 61   assert( pCsr->a
10af0 50 74 72 3d 3d 30 20 29 3b 0a 20 20 70 43 73 72  Ptr==0 );.  pCsr
10b00 2d 3e 61 50 74 72 20 3d 20 6c 73 6d 4d 61 6c 6c  ->aPtr = lsmMall
10b10 6f 63 5a 65 72 6f 28 70 43 73 72 2d 3e 70 44 62  ocZero(pCsr->pDb
10b20 2d 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28 53  ->pEnv, sizeof(S
10b30 65 67 6d 65 6e 74 50 74 72 29 20 2a 20 6e 52 68  egmentPtr) * nRh
10b40 73 29 3b 0a 20 20 69 66 28 20 21 70 43 73 72 2d  s);.  if( !pCsr-
10b50 3e 61 50 74 72 20 29 20 72 65 74 75 72 6e 20 4c  >aPtr ) return L
10b60 53 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  SM_NOMEM_BKPT;. 
10b70 20 70 43 73 72 2d 3e 6e 50 74 72 20 3d 20 6e 52   pCsr->nPtr = nR
10b80 68 73 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  hs;..  for(i=0; 
10b90 69 3c 6e 52 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  i<nRhs; i++){.  
10ba0 20 20 70 43 73 72 2d 3e 61 50 74 72 5b 69 5d 2e    pCsr->aPtr[i].
10bb0 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 52  pSeg = &pLvl->aR
10bc0 68 73 5b 69 5d 3b 0a 20 20 20 20 70 43 73 72 2d  hs[i];.    pCsr-
10bd0 3e 61 50 74 72 5b 69 5d 2e 70 4c 65 76 65 6c 20  >aPtr[i].pLevel 
10be0 3d 20 70 4c 76 6c 3b 0a 20 20 7d 0a 0a 20 20 72  = pLvl;.  }..  r
10bf0 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a  eturn LSM_OK;.}.
10c00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 75 6c  .static void mul
10c10 74 69 43 75 72 73 6f 72 41 64 64 4f 6e 65 28 4d  tiCursorAddOne(M
10c20 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72  ultiCursor *pCsr
10c30 2c 20 4c 65 76 65 6c 20 2a 70 4c 76 6c 2c 20 69  , Level *pLvl, i
10c40 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 66 28 20  nt *pRc){.  if( 
10c50 2a 70 52 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  *pRc==LSM_OK ){.
10c60 20 20 20 20 69 6e 74 20 69 50 74 72 20 3d 20 70      int iPtr = p
10c70 43 73 72 2d 3e 6e 50 74 72 3b 0a 20 20 20 20 69  Csr->nPtr;.    i
10c80 6e 74 20 69 3b 0a 20 20 20 20 70 43 73 72 2d 3e  nt i;.    pCsr->
10c90 61 50 74 72 5b 69 50 74 72 5d 2e 70 4c 65 76 65  aPtr[iPtr].pLeve
10ca0 6c 20 3d 20 70 4c 76 6c 3b 0a 20 20 20 20 70 43  l = pLvl;.    pC
10cb0 73 72 2d 3e 61 50 74 72 5b 69 50 74 72 5d 2e 70  sr->aPtr[iPtr].p
10cc0 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 6c 68 73  Seg = &pLvl->lhs
10cd0 3b 0a 20 20 20 20 69 50 74 72 2b 2b 3b 0a 20 20  ;.    iPtr++;.  
10ce0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 76    for(i=0; i<pLv
10cf0 6c 2d 3e 6e 52 69 67 68 74 3b 20 69 2b 2b 29 7b  l->nRight; i++){
10d00 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 61 50 74  .      pCsr->aPt
10d10 72 5b 69 50 74 72 5d 2e 70 4c 65 76 65 6c 20 3d  r[iPtr].pLevel =
10d20 20 70 4c 76 6c 3b 0a 20 20 20 20 20 20 70 43 73   pLvl;.      pCs
10d30 72 2d 3e 61 50 74 72 5b 69 50 74 72 5d 2e 70 53  r->aPtr[iPtr].pS
10d40 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 52 68 73  eg = &pLvl->aRhs
10d50 5b 69 5d 3b 0a 20 20 20 20 20 20 69 50 74 72 2b  [i];.      iPtr+
10d60 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
10d70 28 20 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 20 26  ( pLvl->nRight &
10d80 26 20 70 4c 76 6c 2d 3e 70 53 70 6c 69 74 4b 65  & pLvl->pSplitKe
10d90 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 6f  y==0 ){.      so
10da0 72 74 65 64 53 70 6c 69 74 6b 65 79 28 70 43 73  rtedSplitkey(pCs
10db0 72 2d 3e 70 44 62 2c 20 70 4c 76 6c 2c 20 70 52  r->pDb, pLvl, pR
10dc0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  c);.    }.    pC
10dd0 73 72 2d 3e 6e 50 74 72 20 3d 20 69 50 74 72 3b  sr->nPtr = iPtr;
10de0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69  .  }.}..static i
10df0 6e 74 20 6d 75 6c 74 69 43 75 72 73 6f 72 41 64  nt multiCursorAd
10e00 64 41 6c 6c 28 4d 75 6c 74 69 43 75 72 73 6f 72  dAll(MultiCursor
10e10 20 2a 70 43 73 72 2c 20 53 6e 61 70 73 68 6f 74   *pCsr, Snapshot
10e20 20 2a 70 53 6e 61 70 29 7b 0a 20 20 4c 65 76 65   *pSnap){.  Leve
10e30 6c 20 2a 70 4c 76 6c 3b 0a 20 20 69 6e 74 20 6e  l *pLvl;.  int n
10e40 50 74 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Ptr = 0;.  int r
10e50 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20 20 66  c = LSM_OK;..  f
10e60 6f 72 28 70 4c 76 6c 3d 70 53 6e 61 70 2d 3e 70  or(pLvl=pSnap->p
10e70 4c 65 76 65 6c 3b 20 70 4c 76 6c 3b 20 70 4c 76  Level; pLvl; pLv
10e80 6c 3d 70 4c 76 6c 2d 3e 70 4e 65 78 74 29 7b 0a  l=pLvl->pNext){.
10e90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4c 45      /* If the LE
10ea0 56 45 4c 5f 49 4e 43 4f 4d 50 4c 45 54 45 20 66  VEL_INCOMPLETE f
10eb0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
10ec0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
10ed0 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 63  s being.    ** c
10ee0 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c  alled (indirectl
10ef0 79 29 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  y) from within a
10f00 20 73 6f 72 74 65 64 4e 65 77 54 6f 70 6c 65 76   sortedNewToplev
10f10 65 6c 28 29 20 63 61 6c 6c 20 74 6f 0a 20 20 20  el() call to.   
10f20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 70 4c   ** construct pL
10f30 76 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  vl. In this case
10f40 20 69 67 6e 6f 72 65 20 70 4c 76 6c 20 2d 20 74   ignore pLvl - t
10f50 68 69 73 20 63 75 72 73 6f 72 20 69 73 20 67 6f  his cursor is go
10f60 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  ing to.    ** be
10f70 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
10f80 65 20 61 20 66 72 65 65 6c 69 73 74 20 65 6e 74  e a freelist ent
10f90 72 79 20 66 72 6f 6d 20 74 68 65 20 4c 53 4d 2c  ry from the LSM,
10fa0 20 61 6e 64 20 74 68 65 20 70 61 72 74 69 61 6c   and the partial
10fb0 6c 79 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65  ly.    ** comple
10fc0 74 65 20 6c 65 76 65 6c 20 6d 61 79 20 63 6f 6e  te level may con
10fd0 66 75 73 65 20 69 74 2e 20 20 2a 2f 0a 20 20 20  fuse it.  */.   
10fe0 20 69 66 28 20 70 4c 76 6c 2d 3e 66 6c 61 67 73   if( pLvl->flags
10ff0 20 26 20 4c 45 56 45 4c 5f 49 4e 43 4f 4d 50 4c   & LEVEL_INCOMPL
11000 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ETE ) continue;.
11010 20 20 20 20 6e 50 74 72 20 2b 3d 20 28 31 20 2b      nPtr += (1 +
11020 20 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 29 3b 0a   pLvl->nRight);.
11030 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
11040 43 73 72 2d 3e 61 50 74 72 3d 3d 30 20 29 3b 0a  Csr->aPtr==0 );.
11050 20 20 70 43 73 72 2d 3e 61 50 74 72 20 3d 20 6c    pCsr->aPtr = l
11060 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63 28 70  smMallocZeroRc(p
11070 43 73 72 2d 3e 70 44 62 2d 3e 70 45 6e 76 2c 20  Csr->pDb->pEnv, 
11080 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 50 74  sizeof(SegmentPt
11090 72 29 20 2a 20 6e 50 74 72 2c 20 26 72 63 29 3b  r) * nPtr, &rc);
110a0 0a 0a 20 20 66 6f 72 28 70 4c 76 6c 3d 70 53 6e  ..  for(pLvl=pSn
110b0 61 70 2d 3e 70 4c 65 76 65 6c 3b 20 70 4c 76 6c  ap->pLevel; pLvl
110c0 3b 20 70 4c 76 6c 3d 70 4c 76 6c 2d 3e 70 4e 65  ; pLvl=pLvl->pNe
110d0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4c  xt){.    if( (pL
110e0 76 6c 2d 3e 66 6c 61 67 73 20 26 20 4c 45 56 45  vl->flags & LEVE
110f0 4c 5f 49 4e 43 4f 4d 50 4c 45 54 45 29 3d 3d 30  L_INCOMPLETE)==0
11100 20 29 7b 0a 20 20 20 20 20 20 6d 75 6c 74 69 43   ){.      multiC
11110 75 72 73 6f 72 41 64 64 4f 6e 65 28 70 43 73 72  ursorAddOne(pCsr
11120 2c 20 70 4c 76 6c 2c 20 26 72 63 29 3b 0a 20 20  , pLvl, &rc);.  
11130 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
11140 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
11150 69 6e 74 20 6d 75 6c 74 69 43 75 72 73 6f 72 49  int multiCursorI
11160 6e 69 74 28 4d 75 6c 74 69 43 75 72 73 6f 72 20  nit(MultiCursor 
11170 2a 70 43 73 72 2c 20 53 6e 61 70 73 68 6f 74 20  *pCsr, Snapshot 
11180 2a 70 53 6e 61 70 29 7b 0a 20 20 69 6e 74 20 72  *pSnap){.  int r
11190 63 3b 0a 20 20 72 63 20 3d 20 6d 75 6c 74 69 43  c;.  rc = multiC
111a0 75 72 73 6f 72 41 64 64 41 6c 6c 28 70 43 73 72  ursorAddAll(pCsr
111b0 2c 20 70 53 6e 61 70 29 3b 0a 20 20 69 66 28 20  , pSnap);.  if( 
111c0 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
111d0 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72 73    rc = multiCurs
111e0 6f 72 41 64 64 54 72 65 65 28 70 43 73 72 2c 20  orAddTree(pCsr, 
111f0 70 53 6e 61 70 2c 20 54 52 45 45 5f 42 4f 54 48  pSnap, TREE_BOTH
11200 29 3b 0a 20 20 7d 0a 20 20 70 43 73 72 2d 3e 66  );.  }.  pCsr->f
11210 6c 61 67 73 20 7c 3d 20 28 43 55 52 53 4f 52 5f  lags |= (CURSOR_
11220 49 47 4e 4f 52 45 5f 53 59 53 54 45 4d 20 7c 20  IGNORE_SYSTEM | 
11230 43 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 44 45  CURSOR_IGNORE_DE
11240 4c 45 54 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  LETE);.  return 
11250 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 4d 75  rc;.}..static Mu
11260 6c 74 69 43 75 72 73 6f 72 20 2a 6d 75 6c 74 69  ltiCursor *multi
11270 43 75 72 73 6f 72 4e 65 77 28 6c 73 6d 5f 64 62  CursorNew(lsm_db
11280 20 2a 64 62 2c 20 69 6e 74 20 2a 70 52 63 29 7b   *db, int *pRc){
11290 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  .  MultiCursor *
112a0 70 43 73 72 3b 0a 20 20 70 43 73 72 20 3d 20 28  pCsr;.  pCsr = (
112b0 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 29 6c 73  MultiCursor *)ls
112c0 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63 28 64 62  mMallocZeroRc(db
112d0 2d 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28 4d  ->pEnv, sizeof(M
112e0 75 6c 74 69 43 75 72 73 6f 72 29 2c 20 70 52 63  ultiCursor), pRc
112f0 29 3b 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b  );.  if( pCsr ){
11300 0a 20 20 20 20 70 43 73 72 2d 3e 70 4e 65 78 74  .    pCsr->pNext
11310 20 3d 20 64 62 2d 3e 70 43 73 72 3b 0a 20 20 20   = db->pCsr;.   
11320 20 64 62 2d 3e 70 43 73 72 20 3d 20 70 43 73 72   db->pCsr = pCsr
11330 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 44 62 20  ;.    pCsr->pDb 
11340 3d 20 64 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = db;.  }.  retu
11350 72 6e 20 70 43 73 72 3b 0a 7d 0a 0a 0a 76 6f 69  rn pCsr;.}...voi
11360 64 20 6c 73 6d 53 6f 72 74 65 64 52 65 6d 61 70  d lsmSortedRemap
11370 28 6c 73 6d 5f 64 62 20 2a 70 44 62 29 7b 0a 20  (lsm_db *pDb){. 
11380 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43   MultiCursor *pC
11390 73 72 3b 0a 20 20 66 6f 72 28 70 43 73 72 3d 70  sr;.  for(pCsr=p
113a0 44 62 2d 3e 70 43 73 72 3b 20 70 43 73 72 3b 20  Db->pCsr; pCsr; 
113b0 70 43 73 72 3d 70 43 73 72 2d 3e 70 4e 65 78 74  pCsr=pCsr->pNext
113c0 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 74 72 3b  ){.    int iPtr;
113d0 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 70  .    if( pCsr->p
113e0 42 74 43 73 72 20 29 7b 0a 20 20 20 20 20 20 62  BtCsr ){.      b
113f0 74 72 65 65 43 75 72 73 6f 72 4c 6f 61 64 4b 65  treeCursorLoadKe
11400 79 28 70 43 73 72 2d 3e 70 42 74 43 73 72 29 3b  y(pCsr->pBtCsr);
11410 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
11420 50 74 72 3d 30 3b 20 69 50 74 72 3c 70 43 73 72  Ptr=0; iPtr<pCsr
11430 2d 3e 6e 50 74 72 3b 20 69 50 74 72 2b 2b 29 7b  ->nPtr; iPtr++){
11440 0a 20 20 20 20 20 20 73 65 67 6d 65 6e 74 50 74  .      segmentPt
11450 72 4c 6f 61 64 43 65 6c 6c 28 26 70 43 73 72 2d  rLoadCell(&pCsr-
11460 3e 61 50 74 72 5b 69 50 74 72 5d 2c 20 70 43 73  >aPtr[iPtr], pCs
11470 72 2d 3e 61 50 74 72 5b 69 50 74 72 5d 2e 69 43  r->aPtr[iPtr].iC
11480 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ell);.    }.  }.
11490 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  }..static void m
114a0 75 6c 74 69 43 75 72 73 6f 72 52 65 61 64 53 65  ultiCursorReadSe
114b0 70 61 72 61 74 6f 72 73 28 4d 75 6c 74 69 43 75  parators(MultiCu
114c0 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69  rsor *pCsr){.  i
114d0 66 28 20 70 43 73 72 2d 3e 6e 50 74 72 3e 30 20  f( pCsr->nPtr>0 
114e0 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 66 6c 61  ){.    pCsr->fla
114f0 67 73 20 7c 3d 20 43 55 52 53 4f 52 5f 52 45 41  gs |= CURSOR_REA
11500 44 5f 53 45 50 41 52 41 54 4f 52 53 3b 0a 20 20  D_SEPARATORS;.  
11510 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 76 65 20  }.}../*.** Have 
11520 74 68 69 73 20 63 75 72 73 6f 72 20 73 6b 69 70  this cursor skip
11530 20 6f 76 65 72 20 53 4f 52 54 45 44 5f 44 45 4c   over SORTED_DEL
11540 45 54 45 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  ETE entries..*/.
11550 73 74 61 74 69 63 20 76 6f 69 64 20 6d 75 6c 74  static void mult
11560 69 43 75 72 73 6f 72 49 67 6e 6f 72 65 44 65 6c  iCursorIgnoreDel
11570 65 74 65 28 4d 75 6c 74 69 43 75 72 73 6f 72 20  ete(MultiCursor 
11580 2a 70 43 73 72 29 7b 0a 20 20 69 66 28 20 70 43  *pCsr){.  if( pC
11590 73 72 20 29 20 70 43 73 72 2d 3e 66 6c 61 67 73  sr ) pCsr->flags
115a0 20 7c 3d 20 43 55 52 53 4f 52 5f 49 47 4e 4f 52   |= CURSOR_IGNOR
115b0 45 5f 44 45 4c 45 54 45 3b 0a 7d 0a 0a 2f 2a 0a  E_DELETE;.}../*.
115c0 2a 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 62  ** If the free-b
115d0 6c 6f 63 6b 20 6c 69 73 74 20 69 73 20 6e 6f 74  lock list is not
115e0 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 68 61 76   empty, then hav
115f0 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 76 69  e this cursor vi
11600 73 69 74 20 61 20 6b 65 79 0a 2a 2a 20 77 69 74  sit a key.** wit
11610 68 20 28 61 29 20 74 68 65 20 73 79 73 74 65 6d  h (a) the system
11620 20 62 69 74 20 73 65 74 2c 20 61 6e 64 20 28 62   bit set, and (b
11630 29 20 74 68 65 20 6b 65 79 20 22 46 52 45 45 4c  ) the key "FREEL
11640 49 53 54 22 20 61 6e 64 20 28 63 29 20 61 20 76  IST" and (c) a v
11650 61 6c 75 65 20 0a 2a 2a 20 62 6c 6f 62 20 63 6f  alue .** blob co
11660 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 65 72  ntaining the ser
11670 69 61 6c 69 7a 65 64 20 66 72 65 65 2d 62 6c 6f  ialized free-blo
11680 63 6b 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ck list..*/.stat
11690 69 63 20 69 6e 74 20 6d 75 6c 74 69 43 75 72 73  ic int multiCurs
116a0 6f 72 56 69 73 69 74 46 72 65 65 6c 69 73 74 28  orVisitFreelist(
116b0 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73  MultiCursor *pCs
116c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c  r){.  int rc = L
116d0 53 4d 5f 4f 4b 3b 0a 20 20 70 43 73 72 2d 3e 66  SM_OK;.  pCsr->f
116e0 6c 61 67 73 20 7c 3d 20 43 55 52 53 4f 52 5f 46  lags |= CURSOR_F
116f0 4c 55 53 48 5f 46 52 45 45 4c 49 53 54 3b 0a 20  LUSH_FREELIST;. 
11700 20 70 43 73 72 2d 3e 70 53 79 73 74 65 6d 56 61   pCsr->pSystemVa
11710 6c 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 52 63 28  l = lsmMallocRc(
11720 70 43 73 72 2d 3e 70 44 62 2d 3e 70 45 6e 76 2c  pCsr->pDb->pEnv,
11730 20 34 20 2b 20 38 2c 20 26 72 63 29 3b 0a 20 20   4 + 8, &rc);.  
11740 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11750 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
11760 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20 64 61   return a new da
11770 74 61 62 61 73 65 20 63 75 72 73 6f 72 2e 0a 2a  tabase cursor..*
11780 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 74 68 6f 64  *.** This method
11790 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
117a0 63 61 6c 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61  called to alloca
117b0 74 65 20 75 73 65 72 20 63 75 72 73 6f 72 73 2e  te user cursors.
117c0 20 41 73 20 69 74 20 6d 61 79 0a 2a 2a 20 72 65   As it may.** re
117d0 63 79 63 6c 65 20 61 20 63 75 72 73 6f 72 20 66  cycle a cursor f
117e0 72 6f 6d 20 6c 73 6d 5f 64 62 2e 70 43 73 72 43  rom lsm_db.pCsrC
117f0 61 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d  ache..*/.int lsm
11800 4d 43 75 72 73 6f 72 4e 65 77 28 0a 20 20 6c 73  MCursorNew(.  ls
11810 6d 5f 64 62 20 2a 70 44 62 2c 20 20 20 20 20 20  m_db *pDb,      
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11830 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
11840 20 2a 2f 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f   */.  MultiCurso
11850 72 20 2a 2a 70 70 43 73 72 20 20 20 20 20 20 20  r **ppCsr       
11860 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 6c        /* OUT: Al
11870 6c 6f 63 61 74 65 64 20 63 75 72 73 6f 72 20 2a  located cursor *
11880 2f 0a 29 7b 0a 20 20 4d 75 6c 74 69 43 75 72 73  /.){.  MultiCurs
11890 6f 72 20 2a 70 43 73 72 20 3d 20 30 3b 0a 20 20  or *pCsr = 0;.  
118a0 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b  int rc = LSM_OK;
118b0 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 43 73  ..  if( pDb->pCs
118c0 72 43 61 63 68 65 20 29 7b 0a 20 20 20 20 69 6e  rCache ){.    in
118d0 74 20 62 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  t bOld;         
118e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
118f0 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20  rue if there is 
11900 61 6e 20 6f 6c 64 20 69 6e 2d 6d 65 6d 6f 72 79  an old in-memory
11910 20 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   tree */..    /*
11920 20 52 65 6d 6f 76 65 20 61 20 63 75 72 73 6f 72   Remove a cursor
11930 20 66 72 6f 6d 20 74 68 65 20 70 43 73 72 43 61   from the pCsrCa
11940 63 68 65 20 6c 69 73 74 20 61 6e 64 20 61 64 64  che list and add
11950 20 69 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 20   it to the open 
11960 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 70 43 73  list. */.    pCs
11970 72 20 3d 20 70 44 62 2d 3e 70 43 73 72 43 61 63  r = pDb->pCsrCac
11980 68 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 73  he;.    pDb->pCs
11990 72 43 61 63 68 65 20 3d 20 70 43 73 72 2d 3e 70  rCache = pCsr->p
119a0 4e 65 78 74 3b 0a 20 20 20 20 70 43 73 72 2d 3e  Next;.    pCsr->
119b0 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70 43 73  pNext = pDb->pCs
119c0 72 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43 73 72  r;.    pDb->pCsr
119d0 20 3d 20 70 43 73 72 3b 0a 0a 20 20 20 20 2f 2a   = pCsr;..    /*
119e0 20 54 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   The cursor can 
119f0 61 6c 6d 6f 73 74 20 62 65 20 75 73 65 64 20 61  almost be used a
11a00 73 20 69 73 2c 20 65 78 63 65 70 74 20 74 68 61  s is, except tha
11a10 74 20 74 68 65 20 6f 6c 64 20 69 6e 2d 6d 65 6d  t the old in-mem
11a20 6f 72 79 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ory.    ** tree 
11a30 63 75 72 73 6f 72 20 6d 61 79 20 62 65 20 70 72  cursor may be pr
11a40 65 73 65 6e 74 20 61 6e 64 20 6e 6f 74 20 72 65  esent and not re
11a50 71 75 69 72 65 64 2c 20 6f 72 20 72 65 71 75 69  quired, or requi
11a60 72 65 64 20 61 6e 64 20 6e 6f 74 0a 20 20 20 20  red and not.    
11a70 2a 2a 20 70 72 65 73 65 6e 74 2e 20 46 69 78 20  ** present. Fix 
11a80 74 68 69 73 20 69 66 20 72 65 71 75 69 72 65 64  this if required
11a90 2e 20 20 2a 2f 0a 20 20 20 20 62 4f 6c 64 20 3d  .  */.    bOld =
11aa0 20 28 6c 73 6d 54 72 65 65 48 61 73 4f 6c 64 28   (lsmTreeHasOld(
11ab0 70 44 62 29 20 26 26 20 70 44 62 2d 3e 74 72 65  pDb) && pDb->tre
11ac0 65 68 64 72 2e 69 4f 6c 64 4c 6f 67 21 3d 70 44  ehdr.iOldLog!=pD
11ad0 62 2d 3e 70 43 6c 69 65 6e 74 2d 3e 69 4c 6f 67  b->pClient->iLog
11ae0 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 21 62  Off);.    if( !b
11af0 4f 6c 64 20 26 26 20 70 43 73 72 2d 3e 61 70 54  Old && pCsr->apT
11b00 72 65 65 43 73 72 5b 31 5d 20 29 7b 0a 20 20 20  reeCsr[1] ){.   
11b10 20 20 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72     lsmTreeCursor
11b20 44 65 73 74 72 6f 79 28 70 43 73 72 2d 3e 61 70  Destroy(pCsr->ap
11b30 54 72 65 65 43 73 72 5b 31 5d 29 3b 0a 20 20 20  TreeCsr[1]);.   
11b40 20 20 20 70 43 73 72 2d 3e 61 70 54 72 65 65 43     pCsr->apTreeC
11b50 73 72 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  sr[1] = 0;.    }
11b60 65 6c 73 65 20 69 66 28 20 62 4f 6c 64 20 26 26  else if( bOld &&
11b70 20 21 70 43 73 72 2d 3e 61 70 54 72 65 65 43 73   !pCsr->apTreeCs
11b80 72 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 72 63  r[1] ){.      rc
11b90 20 3d 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72   = lsmTreeCursor
11ba0 4e 65 77 28 70 44 62 2c 20 31 2c 20 26 70 43 73  New(pDb, 1, &pCs
11bb0 72 2d 3e 61 70 54 72 65 65 43 73 72 5b 31 5d 29  r->apTreeCsr[1])
11bc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 43 73  ;.    }..    pCs
11bd0 72 2d 3e 66 6c 61 67 73 20 3d 20 28 43 55 52 53  r->flags = (CURS
11be0 4f 52 5f 49 47 4e 4f 52 45 5f 53 59 53 54 45 4d  OR_IGNORE_SYSTEM
11bf0 20 7c 20 43 55 52 53 4f 52 5f 49 47 4e 4f 52 45   | CURSOR_IGNORE
11c00 5f 44 45 4c 45 54 45 29 3b 0a 0a 20 20 7d 65 6c  _DELETE);..  }el
11c10 73 65 7b 0a 20 20 20 20 70 43 73 72 20 3d 20 6d  se{.    pCsr = m
11c20 75 6c 74 69 43 75 72 73 6f 72 4e 65 77 28 70 44  ultiCursorNew(pD
11c30 62 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  b, &rc);.    if(
11c40 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 72 63   rc==LSM_OK ) rc
11c50 20 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72 49 6e   = multiCursorIn
11c60 69 74 28 70 43 73 72 2c 20 70 44 62 2d 3e 70 43  it(pCsr, pDb->pC
11c70 6c 69 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69  lient);.  }..  i
11c80 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc!=LSM_OK ){
11c90 0a 20 20 20 20 6c 73 6d 4d 43 75 72 73 6f 72 43  .    lsmMCursorC
11ca0 6c 6f 73 65 28 70 43 73 72 2c 20 30 29 3b 0a 20  lose(pCsr, 0);. 
11cb0 20 20 20 70 43 73 72 20 3d 20 30 3b 0a 20 20 7d     pCsr = 0;.  }
11cc0 0a 20 20 61 73 73 65 72 74 28 20 28 72 63 3d 3d  .  assert( (rc==
11cd0 4c 53 4d 5f 4f 4b 29 3d 3d 28 70 43 73 72 21 3d  LSM_OK)==(pCsr!=
11ce0 30 29 20 29 3b 0a 20 20 2a 70 70 43 73 72 20 3d  0) );.  *ppCsr =
11cf0 20 70 43 73 72 3b 0a 20 20 72 65 74 75 72 6e 20   pCsr;.  return 
11d00 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
11d10 74 20 6d 75 6c 74 69 43 75 72 73 6f 72 47 65 74  t multiCursorGet
11d20 56 61 6c 28 0a 20 20 4d 75 6c 74 69 43 75 72 73  Val(.  MultiCurs
11d30 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20 69 6e 74  or *pCsr, .  int
11d40 20 69 56 61 6c 2c 20 0a 20 20 76 6f 69 64 20 2a   iVal, .  void *
11d50 2a 70 70 56 61 6c 2c 20 0a 20 20 69 6e 74 20 2a  *ppVal, .  int *
11d60 70 6e 56 61 6c 0a 29 7b 0a 20 20 69 6e 74 20 72  pnVal.){.  int r
11d70 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20 20 2a  c = LSM_OK;..  *
11d80 70 70 56 61 6c 20 3d 20 30 3b 0a 20 20 2a 70 6e  ppVal = 0;.  *pn
11d90 56 61 6c 20 3d 20 30 3b 0a 0a 20 20 73 77 69 74  Val = 0;..  swit
11da0 63 68 28 20 69 56 61 6c 20 29 7b 0a 20 20 20 20  ch( iVal ){.    
11db0 63 61 73 65 20 43 55 52 53 4f 52 5f 44 41 54 41  case CURSOR_DATA
11dc0 5f 54 52 45 45 30 3a 0a 20 20 20 20 63 61 73 65  _TREE0:.    case
11dd0 20 43 55 52 53 4f 52 5f 44 41 54 41 5f 54 52 45   CURSOR_DATA_TRE
11de0 45 31 3a 20 7b 0a 20 20 20 20 20 20 54 72 65 65  E1: {.      Tree
11df0 43 75 72 73 6f 72 20 2a 70 54 72 65 65 43 73 72  Cursor *pTreeCsr
11e00 20 3d 20 70 43 73 72 2d 3e 61 70 54 72 65 65 43   = pCsr->apTreeC
11e10 73 72 5b 69 56 61 6c 2d 43 55 52 53 4f 52 5f 44  sr[iVal-CURSOR_D
11e20 41 54 41 5f 54 52 45 45 30 5d 3b 0a 20 20 20 20  ATA_TREE0];.    
11e30 20 20 69 66 28 20 6c 73 6d 54 72 65 65 43 75 72    if( lsmTreeCur
11e40 73 6f 72 56 61 6c 69 64 28 70 54 72 65 65 43 73  sorValid(pTreeCs
11e50 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 73  r) ){.        ls
11e60 6d 54 72 65 65 43 75 72 73 6f 72 56 61 6c 75 65  mTreeCursorValue
11e70 28 70 54 72 65 65 43 73 72 2c 20 70 70 56 61 6c  (pTreeCsr, ppVal
11e80 2c 20 70 6e 56 61 6c 29 3b 0a 20 20 20 20 20 20  , pnVal);.      
11e90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
11ea0 70 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  ppVal = 0;.     
11eb0 20 20 20 2a 70 6e 56 61 6c 20 3d 20 30 3b 0a 20     *pnVal = 0;. 
11ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
11ed0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
11ee0 61 73 65 20 43 55 52 53 4f 52 5f 44 41 54 41 5f  ase CURSOR_DATA_
11ef0 53 59 53 54 45 4d 3a 20 7b 0a 20 20 20 20 20 20  SYSTEM: {.      
11f00 53 6e 61 70 73 68 6f 74 20 2a 70 57 6f 72 6b 65  Snapshot *pWorke
11f10 72 20 3d 20 70 43 73 72 2d 3e 70 44 62 2d 3e 70  r = pCsr->pDb->p
11f20 57 6f 72 6b 65 72 3b 0a 20 20 20 20 20 20 69 66  Worker;.      if
11f30 28 20 70 57 6f 72 6b 65 72 20 0a 20 20 20 20 20  ( pWorker .     
11f40 20 20 26 26 20 28 70 43 73 72 2d 3e 69 46 72 65    && (pCsr->iFre
11f50 65 20 25 20 32 29 3d 3d 30 0a 20 20 20 20 20 20  e % 2)==0.      
11f60 20 26 26 20 70 43 73 72 2d 3e 69 46 72 65 65 20   && pCsr->iFree 
11f70 3c 20 28 70 57 6f 72 6b 65 72 2d 3e 66 72 65 65  < (pWorker->free
11f80 6c 69 73 74 2e 6e 45 6e 74 72 79 2a 32 29 0a 20  list.nEntry*2). 
11f90 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
11fa0 69 6e 74 20 69 45 6e 74 72 79 20 3d 20 70 57 6f  int iEntry = pWo
11fb0 72 6b 65 72 2d 3e 66 72 65 65 6c 69 73 74 2e 6e  rker->freelist.n
11fc0 45 6e 74 72 79 20 2d 20 31 20 2d 20 28 70 43 73  Entry - 1 - (pCs
11fd0 72 2d 3e 69 46 72 65 65 20 2f 20 32 29 3b 0a 20  r->iFree / 2);. 
11fe0 20 20 20 20 20 20 20 75 38 20 2a 61 56 61 6c 20         u8 *aVal 
11ff0 3d 20 26 28 28 75 38 20 2a 29 28 70 43 73 72 2d  = &((u8 *)(pCsr-
12000 3e 70 53 79 73 74 65 6d 56 61 6c 29 29 5b 34 5d  >pSystemVal))[4]
12010 3b 0a 20 20 20 20 20 20 20 20 6c 73 6d 50 75 74  ;.        lsmPut
12020 55 36 34 28 61 56 61 6c 2c 20 70 57 6f 72 6b 65  U64(aVal, pWorke
12030 72 2d 3e 66 72 65 65 6c 69 73 74 2e 61 45 6e 74  r->freelist.aEnt
12040 72 79 5b 69 45 6e 74 72 79 5d 2e 69 49 64 29 3b  ry[iEntry].iId);
12050 0a 20 20 20 20 20 20 20 20 2a 70 70 56 61 6c 20  .        *ppVal 
12060 3d 20 61 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  = aVal;.        
12070 2a 70 6e 56 61 6c 20 3d 20 38 3b 0a 20 20 20 20  *pnVal = 8;.    
12080 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
12090 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
120a0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ult: {.      int
120b0 20 69 50 74 72 20 3d 20 69 56 61 6c 2d 43 55 52   iPtr = iVal-CUR
120c0 53 4f 52 5f 44 41 54 41 5f 53 45 47 4d 45 4e 54  SOR_DATA_SEGMENT
120d0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 74 72  ;.      if( iPtr
120e0 3c 70 43 73 72 2d 3e 6e 50 74 72 20 29 7b 0a 20  <pCsr->nPtr ){. 
120f0 20 20 20 20 20 20 20 53 65 67 6d 65 6e 74 50 74         SegmentPt
12100 72 20 2a 70 50 74 72 20 3d 20 26 70 43 73 72 2d  r *pPtr = &pCsr-
12110 3e 61 50 74 72 5b 69 50 74 72 5d 3b 0a 20 20 20  >aPtr[iPtr];.   
12120 20 20 20 20 20 69 66 28 20 70 50 74 72 2d 3e 70       if( pPtr->p
12130 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Pg ){.          
12140 2a 70 70 56 61 6c 20 3d 20 70 50 74 72 2d 3e 70  *ppVal = pPtr->p
12150 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  Val;.          *
12160 70 6e 56 61 6c 20 3d 20 70 50 74 72 2d 3e 6e 56  pnVal = pPtr->nV
12170 61 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  al;.        }.  
12180 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12190 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 4c  .  assert( rc==L
121a0 53 4d 5f 4f 4b 20 7c 7c 20 28 2a 70 70 56 61 6c  SM_OK || (*ppVal
121b0 3d 3d 30 20 26 26 20 2a 70 6e 56 61 6c 3d 3d 30  ==0 && *pnVal==0
121c0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
121d0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
121e0 6d 75 6c 74 69 43 75 72 73 6f 72 41 64 76 61 6e  multiCursorAdvan
121f0 63 65 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  ce(MultiCursor *
12200 70 43 73 72 2c 20 69 6e 74 20 62 52 65 76 65 72  pCsr, int bRever
12210 73 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  se);../*.** This
12220 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12230 6c 65 64 20 62 79 20 77 6f 72 6b 65 72 20 63 6f  led by worker co
12240 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 77 61 6c  nnections to wal
12250 6b 20 74 68 65 20 70 61 72 74 20 6f 66 20 74 68  k the part of th
12260 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 73  e.** free-list s
12270 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  tored within the
12280 20 4c 53 4d 20 64 61 74 61 20 73 74 72 75 63 74   LSM data struct
12290 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 53  ure..*/.int lsmS
122a0 6f 72 74 65 64 57 61 6c 6b 46 72 65 65 6c 69 73  ortedWalkFreelis
122b0 74 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62  t(.  lsm_db *pDb
122c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
122d0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
122e0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
122f0 20 62 52 65 76 65 72 73 65 2c 20 20 20 20 20 20   bReverse,      
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12310 54 72 75 65 20 74 6f 20 69 74 65 72 61 74 65 20  True to iterate 
12320 66 72 6f 6d 20 6c 61 72 67 65 73 74 20 74 6f 20  from largest to 
12330 73 6d 61 6c 6c 65 73 74 20 2a 2f 0a 20 20 69 6e  smallest */.  in
12340 74 20 28 2a 78 29 28 76 6f 69 64 20 2a 2c 20 69  t (*x)(void *, i
12350 6e 74 2c 20 69 36 34 29 2c 20 20 20 20 20 2f 2a  nt, i64),     /*
12360 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
12370 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  on */.  void *pC
12380 74 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  tx              
12390 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
123a0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   argument to pas
123b0 73 20 74 6f 20 63 61 6c 6c 62 61 63 6b 20 2a 2f  s to callback */
123c0 0a 29 7b 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f  .){.  MultiCurso
123d0 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20  r *pCsr;        
123e0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
123f0 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 62 20  used to read db 
12400 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  */.  int rc = LS
12410 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  M_OK;           
12420 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
12430 6f 64 65 20 2a 2f 0a 20 20 53 6e 61 70 73 68 6f  ode */.  Snapsho
12440 74 20 2a 70 53 6e 61 70 20 3d 20 30 3b 0a 0a 20  t *pSnap = 0;.. 
12450 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 57   assert( pDb->pW
12460 6f 72 6b 65 72 20 29 3b 0a 20 20 69 66 28 20 70  orker );.  if( p
12470 44 62 2d 3e 62 49 6e 63 72 4d 65 72 67 65 20 29  Db->bIncrMerge )
12480 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 43 68  {.    rc = lsmCh
12490 65 63 6b 70 6f 69 6e 74 44 65 73 65 72 69 61 6c  eckpointDeserial
124a0 69 7a 65 28 70 44 62 2c 20 30 2c 20 70 44 62 2d  ize(pDb, 0, pDb-
124b0 3e 70 53 68 6d 68 64 72 2d 3e 61 53 6e 61 70 31  >pShmhdr->aSnap1
124c0 2c 20 26 70 53 6e 61 70 29 3b 0a 20 20 20 20 69  , &pSnap);.    i
124d0 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20  f( rc!=LSM_OK ) 
124e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c  return rc;.  }el
124f0 73 65 7b 0a 20 20 20 20 70 53 6e 61 70 20 3d 20  se{.    pSnap = 
12500 70 44 62 2d 3e 70 57 6f 72 6b 65 72 3b 0a 20 20  pDb->pWorker;.  
12510 7d 0a 0a 20 20 70 43 73 72 20 3d 20 6d 75 6c 74  }..  pCsr = mult
12520 69 43 75 72 73 6f 72 4e 65 77 28 70 44 62 2c 20  iCursorNew(pDb, 
12530 26 72 63 29 3b 0a 20 20 69 66 28 20 70 43 73 72  &rc);.  if( pCsr
12540 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
12550 74 69 43 75 72 73 6f 72 41 64 64 41 6c 6c 28 70  tiCursorAddAll(p
12560 43 73 72 2c 20 70 53 6e 61 70 29 3b 0a 20 20 20  Csr, pSnap);.   
12570 20 70 43 73 72 2d 3e 66 6c 61 67 73 20 7c 3d 20   pCsr->flags |= 
12580 43 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 44 45  CURSOR_IGNORE_DE
12590 4c 45 54 45 3b 0a 20 20 7d 0a 20 20 0a 20 20 69  LETE;.  }.  .  i
125a0 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc==LSM_OK ){
125b0 0a 20 20 20 20 69 66 28 20 62 52 65 76 65 72 73  .    if( bRevers
125c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
125d0 20 3d 20 6c 73 6d 4d 43 75 72 73 6f 72 4c 61 73   = lsmMCursorLas
125e0 74 28 70 43 73 72 29 3b 0a 20 20 20 20 7d 65 6c  t(pCsr);.    }el
125f0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  se{.      rc = l
12600 73 6d 4d 43 75 72 73 6f 72 53 65 65 6b 28 70 43  smMCursorSeek(pC
12610 73 72 2c 20 31 2c 20 22 22 2c 20 30 2c 20 4c 53  sr, 1, "", 0, LS
12620 4d 5f 53 45 45 4b 5f 47 45 29 3b 0a 20 20 20 20  M_SEEK_GE);.    
12630 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  }..    while( rc
12640 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 6c 73 6d 4d  ==LSM_OK && lsmM
12650 43 75 72 73 6f 72 56 61 6c 69 64 28 70 43 73 72  CursorValid(pCsr
12660 29 20 26 26 20 72 74 49 73 53 79 73 74 65 6d 28  ) && rtIsSystem(
12670 70 43 73 72 2d 3e 65 54 79 70 65 29 20 29 7b 0a  pCsr->eType) ){.
12680 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79        void *pKey
12690 3b 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20  ; int nKey;.    
126a0 20 20 76 6f 69 64 20 2a 70 56 61 6c 20 3d 20 30    void *pVal = 0
126b0 3b 20 69 6e 74 20 6e 56 61 6c 20 3d 20 30 3b 0a  ; int nVal = 0;.
126c0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 4d  .      rc = lsmM
126d0 43 75 72 73 6f 72 4b 65 79 28 70 43 73 72 2c 20  CursorKey(pCsr, 
126e0 26 70 4b 65 79 2c 20 26 6e 4b 65 79 29 3b 0a 20  &pKey, &nKey);. 
126f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d       if( rc==LSM
12700 5f 4f 4b 20 29 20 72 63 20 3d 20 6c 73 6d 4d 43  _OK ) rc = lsmMC
12710 75 72 73 6f 72 56 61 6c 75 65 28 70 43 73 72 2c  ursorValue(pCsr,
12720 20 26 70 56 61 6c 2c 20 26 6e 56 61 6c 29 3b 0a   &pVal, &nVal);.
12730 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53        if( rc==LS
12740 4d 5f 4f 4b 20 26 26 20 28 6e 4b 65 79 21 3d 34  M_OK && (nKey!=4
12750 20 7c 7c 20 6e 56 61 6c 21 3d 38 29 20 29 20 72   || nVal!=8) ) r
12760 63 20 3d 20 4c 53 4d 5f 43 4f 52 52 55 50 54 5f  c = LSM_CORRUPT_
12770 42 4b 50 54 3b 0a 0a 20 20 20 20 20 20 69 66 28  BKPT;..      if(
12780 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
12790 20 20 20 20 20 20 20 69 6e 74 20 69 42 6c 6b 3b         int iBlk;
127a0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 53 6e  .        i64 iSn
127b0 61 70 3b 0a 20 20 20 20 20 20 20 20 69 42 6c 6b  ap;.        iBlk
127c0 20 3d 20 28 69 6e 74 29 28 7e 28 6c 73 6d 47 65   = (int)(~(lsmGe
127d0 74 55 33 32 28 28 75 38 20 2a 29 70 4b 65 79 29  tU32((u8 *)pKey)
127e0 29 29 3b 0a 20 20 20 20 20 20 20 20 69 53 6e 61  ));.        iSna
127f0 70 20 3d 20 28 69 36 34 29 6c 73 6d 47 65 74 55  p = (i64)lsmGetU
12800 36 34 28 28 75 38 20 2a 29 70 56 61 6c 29 3b 0a  64((u8 *)pVal);.
12810 20 20 20 20 20 20 20 20 69 66 28 20 78 28 70 43          if( x(pC
12820 74 78 2c 20 69 42 6c 6b 2c 20 69 53 6e 61 70 29  tx, iBlk, iSnap)
12830 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
12840 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72 73    rc = multiCurs
12850 6f 72 41 64 76 61 6e 63 65 28 70 43 73 72 2c 20  orAdvance(pCsr, 
12860 21 62 52 65 76 65 72 73 65 29 3b 0a 20 20 20 20  !bReverse);.    
12870 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
12880 20 6c 73 6d 4d 43 75 72 73 6f 72 43 6c 6f 73 65   lsmMCursorClose
12890 28 70 43 73 72 2c 20 30 29 3b 0a 20 20 69 66 28  (pCsr, 0);.  if(
128a0 20 70 53 6e 61 70 21 3d 70 44 62 2d 3e 70 57 6f   pSnap!=pDb->pWo
128b0 72 6b 65 72 20 29 7b 0a 20 20 20 20 6c 73 6d 46  rker ){.    lsmF
128c0 72 65 65 53 6e 61 70 73 68 6f 74 28 70 44 62 2d  reeSnapshot(pDb-
128d0 3e 70 45 6e 76 2c 20 70 53 6e 61 70 29 3b 0a 20  >pEnv, pSnap);. 
128e0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
128f0 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 53 6f 72 74 65  .}..int lsmSorte
12900 64 4c 6f 61 64 46 72 65 65 6c 69 73 74 28 0a 20  dLoadFreelist(. 
12910 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 20 20   lsm_db *pDb,   
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12930 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
12940 64 6c 65 20 28 6d 75 73 74 20 62 65 20 77 6f 72  dle (must be wor
12950 6b 65 72 29 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ker) */.  void *
12960 2a 70 70 56 61 6c 2c 20 20 20 20 20 20 20 20 20  *ppVal,         
12970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
12980 3a 20 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e  : Blob containin
12990 67 20 4c 53 4d 20 66 72 65 65 2d 6c 69 73 74 20  g LSM free-list 
129a0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 56 61 6c 20  */.  int *pnVal 
129b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129c0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
129d0 65 20 6f 66 20 2a 70 70 56 61 6c 20 62 6c 6f 62  e of *ppVal blob
129e0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
129f0 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70    MultiCursor *p
12a00 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Csr;            
12a10 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73 65 64    /* Cursor used
12a20 20 74 6f 20 72 65 74 72 65 69 76 65 20 66 72 65   to retreive fre
12a30 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
12a40 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20  rc = LSM_OK;    
12a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12a60 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20  eturn Code */.. 
12a70 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70 57   assert( pDb->pW
12a80 6f 72 6b 65 72 20 29 3b 0a 20 20 61 73 73 65 72  orker );.  asser
12a90 74 28 20 2a 70 70 56 61 6c 3d 3d 30 20 26 26 20  t( *ppVal==0 && 
12aa0 2a 70 6e 56 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20  *pnVal==0 );..  
12ab0 70 43 73 72 20 3d 20 6d 75 6c 74 69 43 75 72 73  pCsr = multiCurs
12ac0 6f 72 4e 65 77 28 70 44 62 2c 20 26 72 63 29 3b  orNew(pDb, &rc);
12ad0 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20  .  if( pCsr ){. 
12ae0 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72     rc = multiCur
12af0 73 6f 72 41 64 64 41 6c 6c 28 70 43 73 72 2c 20  sorAddAll(pCsr, 
12b00 70 44 62 2d 3e 70 57 6f 72 6b 65 72 29 3b 0a 20  pDb->pWorker);. 
12b10 20 20 20 70 43 73 72 2d 3e 66 6c 61 67 73 20 7c     pCsr->flags |
12b20 3d 20 43 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f  = CURSOR_IGNORE_
12b30 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 20 20 0a 20  DELETE;.  }.  . 
12b40 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
12b50 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 4d  ){.    rc = lsmM
12b60 43 75 72 73 6f 72 4c 61 73 74 28 70 43 73 72 29  CursorLast(pCsr)
12b70 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53  ;.    if( rc==LS
12b80 4d 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20 72 74  M_OK .     && rt
12b90 49 73 57 72 69 74 65 28 70 43 73 72 2d 3e 65 54  IsWrite(pCsr->eT
12ba0 79 70 65 29 20 26 26 20 72 74 49 73 53 79 73 74  ype) && rtIsSyst
12bb0 65 6d 28 70 43 73 72 2d 3e 65 54 79 70 65 29 0a  em(pCsr->eType).
12bc0 20 20 20 20 20 26 26 20 70 43 73 72 2d 3e 6b 65       && pCsr->ke
12bd0 79 2e 6e 44 61 74 61 3d 3d 38 20 0a 20 20 20 20  y.nData==8 .    
12be0 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43   && 0==memcmp(pC
12bf0 73 72 2d 3e 6b 65 79 2e 70 44 61 74 61 2c 20 22  sr->key.pData, "
12c00 46 52 45 45 4c 49 53 54 22 2c 20 38 29 0a 20 20  FREELIST", 8).  
12c10 20 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20    ){.      void 
12c20 2a 70 56 61 6c 3b 20 69 6e 74 20 6e 56 61 6c 3b  *pVal; int nVal;
12c30 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
12c40 65 20 72 65 61 64 20 66 72 6f 6d 20 64 61 74 61  e read from data
12c50 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 63  base */.      rc
12c60 20 3d 20 6c 73 6d 4d 43 75 72 73 6f 72 56 61 6c   = lsmMCursorVal
12c70 75 65 28 70 43 73 72 2c 20 26 70 56 61 6c 2c 20  ue(pCsr, &pVal, 
12c80 26 6e 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66  &nVal);.      if
12c90 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
12ca0 20 20 20 20 20 20 20 20 2a 70 70 56 61 6c 20 3d          *ppVal =
12cb0 20 6c 73 6d 4d 61 6c 6c 6f 63 52 63 28 70 44 62   lsmMallocRc(pDb
12cc0 2d 3e 70 45 6e 76 2c 20 6e 56 61 6c 2c 20 26 72  ->pEnv, nVal, &r
12cd0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
12ce0 2a 70 70 56 61 6c 20 29 7b 0a 20 20 20 20 20 20  *ppVal ){.      
12cf0 20 20 20 20 6d 65 6d 63 70 79 28 2a 70 70 56 61      memcpy(*ppVa
12d00 6c 2c 20 70 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a  l, pVal, nVal);.
12d10 20 20 20 20 20 20 20 20 20 20 2a 70 6e 56 61 6c            *pnVal
12d20 20 3d 20 6e 56 61 6c 3b 0a 20 20 20 20 20 20 20   = nVal;.       
12d30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
12d40 0a 0a 20 20 20 20 6c 73 6d 4d 43 75 72 73 6f 72  ..    lsmMCursor
12d50 43 6c 6f 73 65 28 70 43 73 72 2c 20 30 29 3b 0a  Close(pCsr, 0);.
12d60 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
12d70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
12d80 6d 75 6c 74 69 43 75 72 73 6f 72 41 6c 6c 6f 63  multiCursorAlloc
12d90 54 72 65 65 28 4d 75 6c 74 69 43 75 72 73 6f 72  Tree(MultiCursor
12da0 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 72   *pCsr){.  int r
12db0 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 66  c = LSM_OK;.  if
12dc0 28 20 70 43 73 72 2d 3e 61 54 72 65 65 3d 3d 30  ( pCsr->aTree==0
12dd0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   ){.    int nByt
12de0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12df0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
12e00 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
12e10 61 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ate */.    int n
12e20 4d 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Min;            
12e30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
12e40 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  l number of curs
12e50 6f 72 73 20 62 65 69 6e 67 20 6d 65 72 67 65 64  ors being merged
12e60 20 2a 2f 0a 0a 20 20 20 20 6e 4d 69 6e 20 3d 20   */..    nMin = 
12e70 43 55 52 53 4f 52 5f 44 41 54 41 5f 53 45 47 4d  CURSOR_DATA_SEGM
12e80 45 4e 54 20 2b 20 70 43 73 72 2d 3e 6e 50 74 72  ENT + pCsr->nPtr
12e90 20 2b 20 28 70 43 73 72 2d 3e 70 42 74 43 73 72   + (pCsr->pBtCsr
12ea0 21 3d 30 29 3b 0a 20 20 20 20 70 43 73 72 2d 3e  !=0);.    pCsr->
12eb0 6e 54 72 65 65 20 3d 20 32 3b 0a 20 20 20 20 77  nTree = 2;.    w
12ec0 68 69 6c 65 28 20 70 43 73 72 2d 3e 6e 54 72 65  hile( pCsr->nTre
12ed0 65 3c 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20  e<nMin ){.      
12ee0 70 43 73 72 2d 3e 6e 54 72 65 65 20 3d 20 70 43  pCsr->nTree = pC
12ef0 73 72 2d 3e 6e 54 72 65 65 2a 32 3b 0a 20 20 20  sr->nTree*2;.   
12f00 20 7d 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   }..    nByte = 
12f10 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70 43 73 72  sizeof(int)*pCsr
12f20 2d 3e 6e 54 72 65 65 2a 32 3b 0a 20 20 20 20 70  ->nTree*2;.    p
12f30 43 73 72 2d 3e 61 54 72 65 65 20 3d 20 28 69 6e  Csr->aTree = (in
12f40 74 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72  t *)lsmMallocZer
12f50 6f 52 63 28 70 43 73 72 2d 3e 70 44 62 2d 3e 70  oRc(pCsr->pDb->p
12f60 45 6e 76 2c 20 6e 42 79 74 65 2c 20 26 72 63 29  Env, nByte, &rc)
12f70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12f80 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  c;.}..static voi
12f90 64 20 6d 75 6c 74 69 43 75 72 73 6f 72 43 61 63  d multiCursorCac
12fa0 68 65 4b 65 79 28 4d 75 6c 74 69 43 75 72 73 6f  heKey(MultiCurso
12fb0 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 2a 70 52  r *pCsr, int *pR
12fc0 63 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  c){.  if( *pRc==
12fd0 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 6f  LSM_OK ){.    vo
12fe0 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69 6e  id *pKey;.    in
12ff0 74 20 6e 4b 65 79 3b 0a 20 20 20 20 6d 75 6c 74  t nKey;.    mult
13000 69 43 75 72 73 6f 72 47 65 74 4b 65 79 28 70 43  iCursorGetKey(pC
13010 73 72 2c 20 70 43 73 72 2d 3e 61 54 72 65 65 5b  sr, pCsr->aTree[
13020 31 5d 2c 20 26 70 43 73 72 2d 3e 65 54 79 70 65  1], &pCsr->eType
13030 2c 20 26 70 4b 65 79 2c 20 26 6e 4b 65 79 29 3b  , &pKey, &nKey);
13040 0a 20 20 20 20 2a 70 52 63 20 3d 20 73 6f 72 74  .    *pRc = sort
13050 65 64 42 6c 6f 62 53 65 74 28 70 43 73 72 2d 3e  edBlobSet(pCsr->
13060 70 44 62 2d 3e 70 45 6e 76 2c 20 26 70 43 73 72  pDb->pEnv, &pCsr
13070 2d 3e 6b 65 79 2c 20 70 4b 65 79 2c 20 6e 4b 65  ->key, pKey, nKe
13080 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65  y);.  }.}..#ifde
13090 66 20 4c 53 4d 5f 44 45 42 55 47 5f 45 58 50 45  f LSM_DEBUG_EXPE
130a0 4e 53 49 56 45 0a 73 74 61 74 69 63 20 76 6f 69  NSIVE.static voi
130b0 64 20 61 73 73 65 72 74 43 75 72 73 6f 72 54 72  d assertCursorTr
130c0 65 65 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  ee(MultiCursor *
130d0 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 62 52 65  pCsr){.  int bRe
130e0 76 20 3d 20 21 21 28 70 43 73 72 2d 3e 66 6c 61  v = !!(pCsr->fla
130f0 67 73 20 26 20 43 55 52 53 4f 52 5f 50 52 45 56  gs & CURSOR_PREV
13100 5f 4f 4b 29 3b 0a 20 20 69 6e 74 20 2a 61 53 61  _OK);.  int *aSa
13110 76 65 20 3d 20 70 43 73 72 2d 3e 61 54 72 65 65  ve = pCsr->aTree
13120 3b 0a 20 20 69 6e 74 20 6e 53 61 76 65 20 3d 20  ;.  int nSave = 
13130 70 43 73 72 2d 3e 6e 54 72 65 65 3b 0a 20 20 69  pCsr->nTree;.  i
13140 6e 74 20 72 63 3b 0a 0a 20 20 70 43 73 72 2d 3e  nt rc;..  pCsr->
13150 61 54 72 65 65 20 3d 20 30 3b 0a 20 20 70 43 73  aTree = 0;.  pCs
13160 72 2d 3e 6e 54 72 65 65 20 3d 20 30 3b 0a 20 20  r->nTree = 0;.  
13170 72 63 20 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72  rc = multiCursor
13180 41 6c 6c 6f 63 54 72 65 65 28 70 43 73 72 29 3b  AllocTree(pCsr);
13190 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f  .  if( rc==LSM_O
131a0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  K ){.    int i;.
131b0 20 20 20 20 66 6f 72 28 69 3d 70 43 73 72 2d 3e      for(i=pCsr->
131c0 6e 54 72 65 65 2d 31 3b 20 69 3e 30 3b 20 69 2d  nTree-1; i>0; i-
131d0 2d 29 7b 0a 20 20 20 20 20 20 6d 75 6c 74 69 43  -){.      multiC
131e0 75 72 73 6f 72 44 6f 43 6f 6d 70 61 72 65 28 70  ursorDoCompare(p
131f0 43 73 72 2c 20 69 2c 20 62 52 65 76 29 3b 0a 20  Csr, i, bRev);. 
13200 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
13210 28 20 6e 53 61 76 65 3d 3d 70 43 73 72 2d 3e 6e  ( nSave==pCsr->n
13220 54 72 65 65 20 0a 20 20 20 20 20 20 20 20 26 26  Tree .        &&
13230 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 53 61 76 65   0==memcmp(aSave
13240 2c 20 70 43 73 72 2d 3e 61 54 72 65 65 2c 20 73  , pCsr->aTree, s
13250 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 53 61 76 65  izeof(int)*nSave
13260 29 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 6c 73  ).    );..    ls
13270 6d 46 72 65 65 28 70 43 73 72 2d 3e 70 44 62 2d  mFree(pCsr->pDb-
13280 3e 70 45 6e 76 2c 20 70 43 73 72 2d 3e 61 54 72  >pEnv, pCsr->aTr
13290 65 65 29 3b 0a 20 20 7d 0a 0a 20 20 70 43 73 72  ee);.  }..  pCsr
132a0 2d 3e 61 54 72 65 65 20 3d 20 61 53 61 76 65 3b  ->aTree = aSave;
132b0 0a 20 20 70 43 73 72 2d 3e 6e 54 72 65 65 20 3d  .  pCsr->nTree =
132c0 20 6e 53 61 76 65 3b 0a 7d 0a 23 65 6c 73 65 0a   nSave;.}.#else.
132d0 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 43  # define assertC
132e0 75 72 73 6f 72 54 72 65 65 28 78 29 0a 23 65 6e  ursorTree(x).#en
132f0 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  dif..static int 
13300 6d 63 75 72 73 6f 72 4c 6f 63 61 74 69 6f 6e 4f  mcursorLocationO
13310 6b 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70  k(MultiCursor *p
13320 43 73 72 2c 20 69 6e 74 20 62 44 65 6c 65 74 65  Csr, int bDelete
13330 4f 6b 29 7b 0a 20 20 69 6e 74 20 65 54 79 70 65  Ok){.  int eType
13340 20 3d 20 70 43 73 72 2d 3e 65 54 79 70 65 3b 0a   = pCsr->eType;.
13350 20 20 69 6e 74 20 69 4b 65 79 3b 0a 20 20 69 6e    int iKey;.  in
13360 74 20 69 3b 0a 20 20 69 6e 74 20 72 64 6d 61 73  t i;.  int rdmas
13370 6b 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  k;.  .  assert( 
13380 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 28 43  pCsr->flags & (C
13390 55 52 53 4f 52 5f 4e 45 58 54 5f 4f 4b 7c 43 55  URSOR_NEXT_OK|CU
133a0 52 53 4f 52 5f 50 52 45 56 5f 4f 4b 29 20 29 3b  RSOR_PREV_OK) );
133b0 0a 20 20 61 73 73 65 72 74 43 75 72 73 6f 72 54  .  assertCursorT
133c0 72 65 65 28 70 43 73 72 29 3b 0a 0a 20 20 72 64  ree(pCsr);..  rd
133d0 6d 61 73 6b 20 3d 20 28 70 43 73 72 2d 3e 66 6c  mask = (pCsr->fl
133e0 61 67 73 20 26 20 43 55 52 53 4f 52 5f 4e 45 58  ags & CURSOR_NEX
133f0 54 5f 4f 4b 29 20 3f 20 4c 53 4d 5f 45 4e 44 5f  T_OK) ? LSM_END_
13400 44 45 4c 45 54 45 20 3a 20 4c 53 4d 5f 53 54 41  DELETE : LSM_STA
13410 52 54 5f 44 45 4c 45 54 45 3b 0a 0a 20 20 2f 2a  RT_DELETE;..  /*
13420 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 64   If the cursor d
13430 6f 65 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  oes not currentl
13440 79 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 61 63  y point to an ac
13450 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 6b 65  tual database ke
13460 79 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 74 20  y (i.e..  ** it 
13470 70 6f 69 6e 74 73 20 74 6f 20 61 20 64 65 6c 65  points to a dele
13480 74 65 20 6b 65 79 2c 20 6f 72 20 74 68 65 20 73  te key, or the s
13490 74 61 72 74 20 6f 72 20 65 6e 64 20 6f 66 20 61  tart or end of a
134a0 20 72 61 6e 67 65 2d 64 65 6c 65 74 65 29 2c 20   range-delete), 
134b0 61 6e 64 0a 20 20 2a 2a 20 74 68 65 20 43 55 52  and.  ** the CUR
134c0 53 4f 52 5f 49 47 4e 4f 52 45 5f 44 45 4c 45 54  SOR_IGNORE_DELET
134d0 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 73  E flag is set, s
134e0 6b 69 70 20 70 61 73 74 20 74 68 69 73 20 65 6e  kip past this en
134f0 74 72 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28  try.  */.  if( (
13500 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 43 55  pCsr->flags & CU
13510 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 44 45 4c 45  RSOR_IGNORE_DELE
13520 54 45 29 20 26 26 20 62 44 65 6c 65 74 65 4f 6b  TE) && bDeleteOk
13530 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ==0 ){.    if( (
13540 65 54 79 70 65 20 26 20 4c 53 4d 5f 49 4e 53 45  eType & LSM_INSE
13550 52 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  RT)==0 ) return 
13560 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
13570 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
13580 73 20 74 6f 20 61 20 73 79 73 74 65 6d 20 6b 65  s to a system ke
13590 79 20 28 66 72 65 65 2d 6c 69 73 74 20 65 6e 74  y (free-list ent
135a0 72 79 29 2c 20 61 6e 64 20 74 68 65 0a 20 20 2a  ry), and the.  *
135b0 2a 20 43 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f  * CURSOR_IGNORE_
135c0 53 59 53 54 45 4d 20 66 6c 61 67 20 69 73 20 73  SYSTEM flag is s
135d0 65 74 2c 20 73 6b 69 70 20 74 68 69 65 20 65 6e  et, skip thie en
135e0 74 72 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28  try.  */.  if( (
135f0 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 43 55  pCsr->flags & CU
13600 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 53 59 53 54  RSOR_IGNORE_SYST
13610 45 4d 29 20 26 26 20 72 74 54 6f 70 69 63 28 65  EM) && rtTopic(e
13620 54 79 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Type)!=0 ){.    
13630 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 23  return 0;.  }..#
13640 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
13650 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 66 69  /* This block fi
13660 72 65 73 20 61 73 73 65 72 74 28 29 20 73 74 61  res assert() sta
13670 74 65 6d 65 6e 74 73 20 74 6f 20 63 68 65 63 6b  tements to check
13680 20 6f 6e 65 20 6f 66 20 74 68 65 20 61 73 73 75   one of the assu
13690 6d 70 74 69 6f 6e 73 0a 20 20 2a 2a 20 69 6e 20  mptions.  ** in 
136a0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  the comment belo
136b0 77 20 2d 20 74 68 61 74 20 69 66 20 74 68 65 20  w - that if the 
136c0 6c 68 73 20 73 75 62 2d 63 75 72 73 6f 72 20 6f  lhs sub-cursor o
136d0 66 20 61 20 6c 65 76 65 6c 20 75 6e 64 65 72 67  f a level underg
136e0 6f 69 6e 67 0a 20 20 2a 2a 20 61 20 6d 65 72 67  oing.  ** a merg
136f0 65 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 6e  e is valid, then
13700 20 61 6c 6c 20 74 68 65 20 72 68 73 20 73 75 62   all the rhs sub
13710 2d 63 75 72 73 6f 72 73 20 6d 75 73 74 20 62 65  -cursors must be
13720 20 61 74 20 45 4f 46 2e 20 0a 20 20 2a 2a 0a 20   at EOF. .  **. 
13730 20 2a 2a 20 41 6c 73 6f 20 61 73 73 65 72 74 20   ** Also assert 
13740 74 68 61 74 20 61 6c 6c 20 72 68 73 20 73 75 62  that all rhs sub
13750 2d 63 75 72 73 6f 72 73 20 61 72 65 20 65 69 74  -cursors are eit
13760 68 65 72 20 61 74 20 45 4f 46 20 6f 72 20 70 6f  her at EOF or po
13770 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 61 20 6b 65  int to.  ** a ke
13780 79 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6c 65  y that is not le
13790 73 73 20 74 68 61 6e 20 74 68 65 20 6c 65 76 65  ss than the leve
137a0 6c 20 73 70 6c 69 74 2d 6b 65 79 2e 20 20 2a 2f  l split-key.  */
137b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43  .  for(i=0; i<pC
137c0 73 72 2d 3e 6e 50 74 72 3b 20 69 2b 2b 29 7b 0a  sr->nPtr; i++){.
137d0 20 20 20 20 53 65 67 6d 65 6e 74 50 74 72 20 2a      SegmentPtr *
137e0 70 50 74 72 20 3d 20 26 70 43 73 72 2d 3e 61 50  pPtr = &pCsr->aP
137f0 74 72 5b 69 5d 3b 0a 20 20 20 20 4c 65 76 65 6c  tr[i];.    Level
13800 20 2a 70 4c 76 6c 20 3d 20 70 50 74 72 2d 3e 70   *pLvl = pPtr->p
13810 4c 65 76 65 6c 3b 0a 20 20 20 20 69 66 28 20 70  Level;.    if( p
13820 4c 76 6c 2d 3e 6e 52 69 67 68 74 20 26 26 20 70  Lvl->nRight && p
13830 50 74 72 2d 3e 70 50 67 20 29 7b 0a 20 20 20 20  Ptr->pPg ){.    
13840 20 20 69 66 28 20 70 50 74 72 2d 3e 70 53 65 67    if( pPtr->pSeg
13850 3d 3d 26 70 4c 76 6c 2d 3e 6c 68 73 20 29 7b 0a  ==&pLvl->lhs ){.
13860 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
13870 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
13880 6a 3c 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 3b 20  j<pLvl->nRight; 
13890 6a 2b 2b 29 20 61 73 73 65 72 74 28 20 70 50 74  j++) assert( pPt
138a0 72 5b 6a 2b 31 5d 2e 70 50 67 3d 3d 30 20 29 3b  r[j+1].pPg==0 );
138b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
138c0 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20        int res = 
138d0 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65  sortedKeyCompare
138e0 28 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70  (pCsr->pDb->xCmp
138f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  , .            r
13900 74 54 6f 70 69 63 28 70 50 74 72 2d 3e 65 54 79  tTopic(pPtr->eTy
13910 70 65 29 2c 20 70 50 74 72 2d 3e 70 4b 65 79 2c  pe), pPtr->pKey,
13920 20 70 50 74 72 2d 3e 6e 4b 65 79 2c 0a 20 20 20   pPtr->nKey,.   
13930 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69           pLvl->i
13940 53 70 6c 69 74 54 6f 70 69 63 2c 20 70 4c 76 6c  SplitTopic, pLvl
13950 2d 3e 70 53 70 6c 69 74 4b 65 79 2c 20 70 4c 76  ->pSplitKey, pLv
13960 6c 2d 3e 6e 53 70 6c 69 74 4b 65 79 0a 20 20 20  l->nSplitKey.   
13970 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
13980 61 73 73 65 72 74 28 20 72 65 73 3e 3d 30 20 29  assert( res>=0 )
13990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
139a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
139b0 20 4e 6f 77 20 63 68 65 63 6b 20 69 66 20 74 68   Now check if th
139c0 69 73 20 6b 65 79 20 68 61 73 20 61 6c 72 65 61  is key has alrea
139d0 64 79 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  dy been deleted 
139e0 62 79 20 61 20 72 61 6e 67 65 2d 64 65 6c 65 74  by a range-delet
139f0 65 2e 20 49 66 20 0a 20 20 2a 2a 20 73 6f 2c 20  e. If .  ** so, 
13a00 73 6b 69 70 20 70 61 73 74 20 69 74 2e 0a 20 20  skip past it..  
13a10 2a 2a 0a 20 20 2a 2a 20 41 73 73 75 6d 65 2c 20  **.  ** Assume, 
13a20 66 6f 72 20 74 68 65 20 6d 6f 6d 65 6e 74 2c 20  for the moment, 
13a30 74 68 61 74 20 74 68 65 20 74 72 65 65 20 63 6f  that the tree co
13a40 6e 74 61 69 6e 73 20 6e 6f 20 6c 65 76 65 6c 73  ntains no levels
13a50 20 63 75 72 72 65 6e 74 6c 79 20 0a 20 20 2a 2a   currently .  **
13a60 20 75 6e 64 65 72 67 6f 69 6e 67 20 69 6e 63 72   undergoing incr
13a70 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 2c 20 61  emental merge, a
13a80 6e 64 20 74 68 61 74 20 74 68 69 73 20 63 75 72  nd that this cur
13a90 73 6f 72 20 69 73 20 69 74 65 72 61 74 69 6e 67  sor is iterating
13aa0 20 66 6f 72 77 61 72 64 73 0a 20 20 2a 2a 20 74   forwards.  ** t
13ab0 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
13ac0 61 73 65 20 6b 65 79 73 2e 20 54 68 65 20 63 75  ase keys. The cu
13ad0 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
13ae0 6f 69 6e 74 73 20 74 6f 20 61 20 6b 65 79 20 69  oints to a key i
13af0 6e 0a 20 20 2a 2a 20 6c 65 76 65 6c 20 4c 2e 20  n.  ** level L. 
13b00 54 68 69 73 20 6b 65 79 20 68 61 73 20 61 6c 72  This key has alr
13b10 65 61 64 79 20 62 65 65 6e 20 64 65 6c 65 74 65  eady been delete
13b20 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  d if any of the 
13b30 73 75 62 2d 63 75 72 73 6f 72 73 0a 20 20 2a 2a  sub-cursors.  **
13b40 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6c   that point to l
13b50 65 76 65 6c 73 20 6e 65 77 65 72 20 74 68 61 6e  evels newer than
13b60 20 4c 20 28 6f 72 20 74 6f 20 74 68 65 20 69 6e   L (or to the in
13b70 2d 6d 65 6d 6f 72 79 20 74 72 65 65 29 20 70 6f  -memory tree) po
13b80 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 61 20 6b 65  int to.  ** a ke
13b90 79 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  y greater than t
13ba0 68 65 20 63 75 72 72 65 6e 74 20 6b 65 79 20 77  he current key w
13bb0 69 74 68 20 74 68 65 20 4c 53 4d 5f 45 4e 44 5f  ith the LSM_END_
13bc0 44 45 4c 45 54 45 20 66 6c 61 67 20 73 65 74 2e  DELETE flag set.
13bd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69  .  **.  ** Or, i
13be0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
13bf0 69 74 65 72 61 74 69 6e 67 20 62 61 63 6b 77 61  iterating backwa
13c00 72 64 73 20 74 68 72 6f 75 67 68 20 64 61 74 61  rds through data
13c10 20 6b 65 79 73 2c 20 69 66 20 61 6e 79 0a 20 20   keys, if any.  
13c20 2a 2a 20 73 75 63 68 20 73 75 62 2d 63 75 72 73  ** such sub-curs
13c30 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6b  or points to a k
13c40 65 79 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ey smaller than 
13c50 74 68 65 20 63 75 72 72 65 6e 74 20 6b 65 79 20  the current key 
13c60 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 4c 53  with the.  ** LS
13c70 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54 45 20 66  M_START_DELETE f
13c80 6c 61 67 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20  lag set..  **.  
13c90 2a 2a 20 57 68 79 20 69 74 20 77 6f 72 6b 73 20  ** Why it works 
13ca0 77 69 74 68 20 6c 65 76 65 6c 73 20 75 6e 64 65  with levels unde
13cb0 72 67 6f 69 6e 67 20 61 20 6d 65 72 67 65 20 74  rgoing a merge t
13cc0 6f 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  oo:.  **.  ** Wh
13cd0 65 6e 20 61 20 63 75 72 73 6f 72 20 69 74 65 72  en a cursor iter
13ce0 61 74 65 73 20 66 6f 72 77 61 72 64 73 2c 20 74  ates forwards, t
13cf0 68 65 20 73 75 62 2d 63 75 72 73 6f 72 73 20 66  he sub-cursors f
13d00 6f 72 20 74 68 65 20 72 68 73 20 6f 66 20 61 20  or the rhs of a 
13d10 0a 20 20 2a 2a 20 6c 65 76 65 6c 20 61 72 65 20  .  ** level are 
13d20 6f 6e 6c 79 20 61 63 74 69 76 61 74 65 64 20 6f  only activated o
13d30 6e 63 65 20 74 68 65 20 6c 68 73 20 72 65 61 63  nce the lhs reac
13d40 68 65 73 20 45 4f 46 2e 20 53 6f 20 77 68 65 6e  hes EOF. So when
13d50 20 69 74 65 72 61 74 69 6e 67 0a 20 20 2a 2a 20   iterating.  ** 
13d60 66 6f 72 77 61 72 64 73 2c 20 74 68 65 20 6b 65  forwards, the ke
13d70 79 73 20 76 69 73 69 74 65 64 20 61 72 65 20 74  ys visited are t
13d80 68 65 20 73 61 6d 65 20 61 73 20 69 66 20 74 68  he same as if th
13d90 65 20 6c 65 76 65 6c 20 77 61 73 20 63 6f 6d 70  e level was comp
13da0 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 6d 65 72 67  letely.  ** merg
13db0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
13dc0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
13dd0 74 65 72 61 74 69 6e 67 20 62 61 63 6b 77 61 72  terating backwar
13de0 64 73 2c 20 74 68 65 6e 20 74 68 65 20 6c 68 73  ds, then the lhs
13df0 20 73 75 62 2d 63 75 72 73 6f 72 20 69 73 20 6e   sub-cursor is n
13e00 6f 74 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  ot .  ** initial
13e10 69 7a 65 64 20 75 6e 74 69 6c 20 74 68 65 20 6c  ized until the l
13e20 61 73 74 20 6f 66 20 74 68 65 20 72 68 73 20 73  ast of the rhs s
13e30 75 62 2d 63 75 72 73 6f 72 73 20 68 61 73 20 72  ub-cursors has r
13e40 65 61 63 68 65 64 20 45 4f 46 2e 0a 20 20 2a 2a  eached EOF..  **
13e50 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
13e60 66 20 74 68 65 20 53 54 41 52 54 5f 44 45 4c 45  f the START_DELE
13e70 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  TE flag is set o
13e80 6e 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  n the last entry
13e90 20 28 69 6e 0a 20 20 2a 2a 20 72 65 76 65 72 73   (in.  ** revers
13ea0 65 20 6f 72 64 65 72 20 2d 20 73 6f 20 74 68 65  e order - so the
13eb0 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
13ec0 73 6d 61 6c 6c 65 73 74 20 6b 65 79 29 20 6f 66  smallest key) of
13ed0 20 61 20 72 68 73 20 73 75 62 2d 63 75 72 73 6f   a rhs sub-curso
13ee0 72 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 61 20 70  r,.  ** then a p
13ef0 73 65 75 64 6f 2d 6b 65 79 20 65 71 75 61 6c 20  seudo-key equal 
13f00 74 6f 20 74 68 65 20 6c 65 76 65 6c 73 20 73 70  to the levels sp
13f10 6c 69 74 2d 6b 65 79 20 77 69 74 68 20 74 68 65  lit-key with the
13f20 20 45 4e 44 5f 44 45 4c 45 54 45 0a 20 20 2a 2a   END_DELETE.  **
13f30 20 66 6c 61 67 20 73 65 74 20 69 73 20 76 69 73   flag set is vis
13f40 69 74 65 64 20 62 79 20 74 68 65 20 73 75 62 2d  ited by the sub-
13f50 63 75 72 73 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20  cursor..  */ .  
13f60 69 4b 65 79 20 3d 20 70 43 73 72 2d 3e 61 54 72  iKey = pCsr->aTr
13f70 65 65 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ee[1];.  for(i=0
13f80 3b 20 69 3c 69 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<iKey; i++){.
13f90 20 20 20 20 69 6e 74 20 63 73 72 66 6c 61 67 73      int csrflags
13fa0 3b 0a 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f  ;.    multiCurso
13fb0 72 47 65 74 4b 65 79 28 70 43 73 72 2c 20 69 2c  rGetKey(pCsr, i,
13fc0 20 26 63 73 72 66 6c 61 67 73 2c 20 30 2c 20 30   &csrflags, 0, 0
13fd0 29 3b 0a 20 20 20 20 69 66 28 20 28 72 64 6d 61  );.    if( (rdma
13fe0 73 6b 20 26 20 63 73 72 66 6c 61 67 73 29 20 29  sk & csrflags) )
13ff0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
14000 74 20 53 44 5f 45 44 20 3d 20 28 4c 53 4d 5f 53  t SD_ED = (LSM_S
14010 54 41 52 54 5f 44 45 4c 45 54 45 7c 4c 53 4d 5f  TART_DELETE|LSM_
14020 45 4e 44 5f 44 45 4c 45 54 45 29 3b 0a 20 20 20  END_DELETE);.   
14030 20 20 20 69 66 28 20 28 63 73 72 66 6c 61 67 73     if( (csrflags
14040 20 26 20 53 44 5f 45 44 29 3d 3d 53 44 5f 45 44   & SD_ED)==SD_ED
14050 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73   .       || (pCs
14060 72 2d 3e 66 6c 61 67 73 20 26 20 43 55 52 53 4f  r->flags & CURSO
14070 52 5f 49 47 4e 4f 52 45 5f 44 45 4c 45 54 45 29  R_IGNORE_DELETE)
14080 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
14090 20 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b       void *pKey;
140a0 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
140b0 20 20 20 6d 75 6c 74 69 43 75 72 73 6f 72 47 65     multiCursorGe
140c0 74 4b 65 79 28 70 43 73 72 2c 20 69 2c 20 30 2c  tKey(pCsr, i, 0,
140d0 20 26 70 4b 65 79 2c 20 26 6e 4b 65 79 29 3b 0a   &pKey, &nKey);.
140e0 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
140f0 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65 28  ortedKeyCompare(
14100 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70 2c  pCsr->pDb->xCmp,
14110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
14120 74 54 6f 70 69 63 28 65 54 79 70 65 29 2c 20 70  tTopic(eType), p
14130 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74 61 2c 20  Csr->key.pData, 
14140 70 43 73 72 2d 3e 6b 65 79 2e 6e 44 61 74 61 2c  pCsr->key.nData,
14150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
14160 74 54 6f 70 69 63 28 63 73 72 66 6c 61 67 73 29  tTopic(csrflags)
14170 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 0a 20 20 20  , pKey, nKey.   
14180 20 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 20       )){.       
14190 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
141a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
141b0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
141c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
141d0 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
141e0 72 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 6f 6e  r position is on
141f0 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 73 68  e this cursor sh
14200 6f 75 6c 64 20 76 69 73 69 74 2e 20 52 65 74 75  ould visit. Retu
14210 72 6e 20 31 2e 20 2a 2f 0a 20 20 72 65 74 75 72  rn 1. */.  retur
14220 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  n 1;.}..static i
14230 6e 74 20 6d 75 6c 74 69 43 75 72 73 6f 72 53 65  nt multiCursorSe
14240 74 75 70 54 72 65 65 28 4d 75 6c 74 69 43 75 72  tupTree(MultiCur
14250 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 62  sor *pCsr, int b
14260 52 65 76 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Rev){.  int rc;.
14270 0a 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72  .  rc = multiCur
14280 73 6f 72 41 6c 6c 6f 63 54 72 65 65 28 70 43 73  sorAllocTree(pCs
14290 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53  r);.  if( rc==LS
142a0 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  M_OK ){.    int 
142b0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 43 73  i;.    for(i=pCs
142c0 72 2d 3e 6e 54 72 65 65 2d 31 3b 20 69 3e 30 3b  r->nTree-1; i>0;
142d0 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6d 75 6c   i--){.      mul
142e0 74 69 43 75 72 73 6f 72 44 6f 43 6f 6d 70 61 72  tiCursorDoCompar
142f0 65 28 70 43 73 72 2c 20 69 2c 20 62 52 65 76 29  e(pCsr, i, bRev)
14300 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
14310 73 73 65 72 74 43 75 72 73 6f 72 54 72 65 65 28  ssertCursorTree(
14320 70 43 73 72 29 3b 0a 20 20 6d 75 6c 74 69 43 75  pCsr);.  multiCu
14330 72 73 6f 72 43 61 63 68 65 4b 65 79 28 70 43 73  rsorCacheKey(pCs
14340 72 2c 20 26 72 63 29 3b 0a 0a 20 20 69 66 28 20  r, &rc);..  if( 
14350 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 6d 63  rc==LSM_OK && mc
14360 75 72 73 6f 72 4c 6f 63 61 74 69 6f 6e 4f 6b 28  ursorLocationOk(
14370 70 43 73 72 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  pCsr, 0)==0 ){. 
14380 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72     rc = multiCur
14390 73 6f 72 41 64 76 61 6e 63 65 28 70 43 73 72 2c  sorAdvance(pCsr,
143a0 20 62 52 65 76 29 3b 0a 20 20 7d 0a 20 20 72 65   bRev);.  }.  re
143b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61  turn rc;.}...sta
143c0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 43 75 72  tic int multiCur
143d0 73 6f 72 45 6e 64 28 4d 75 6c 74 69 43 75 72 73  sorEnd(MultiCurs
143e0 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 62 4c  or *pCsr, int bL
143f0 61 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ast){.  int rc =
14400 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69   LSM_OK;.  int i
14410 3b 0a 0a 20 20 70 43 73 72 2d 3e 66 6c 61 67 73  ;..  pCsr->flags
14420 20 26 3d 20 7e 28 43 55 52 53 4f 52 5f 4e 45 58   &= ~(CURSOR_NEX
14430 54 5f 4f 4b 20 7c 20 43 55 52 53 4f 52 5f 50 52  T_OK | CURSOR_PR
14440 45 56 5f 4f 4b 29 3b 0a 20 20 70 43 73 72 2d 3e  EV_OK);.  pCsr->
14450 66 6c 61 67 73 20 7c 3d 20 28 62 4c 61 73 74 20  flags |= (bLast 
14460 3f 20 43 55 52 53 4f 52 5f 50 52 45 56 5f 4f 4b  ? CURSOR_PREV_OK
14470 20 3a 20 43 55 52 53 4f 52 5f 4e 45 58 54 5f 4f   : CURSOR_NEXT_O
14480 4b 29 3b 0a 20 20 70 43 73 72 2d 3e 69 46 72 65  K);.  pCsr->iFre
14490 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 6f 73  e = 0;..  /* Pos
144a0 69 74 69 6f 6e 20 74 68 65 20 74 77 6f 20 69 6e  ition the two in
144b0 2d 6d 65 6d 6f 72 79 20 74 72 65 65 20 63 75 72  -memory tree cur
144c0 73 6f 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  sors */.  for(i=
144d0 30 3b 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  0; rc==LSM_OK &&
144e0 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
144f0 69 66 28 20 70 43 73 72 2d 3e 61 70 54 72 65 65  if( pCsr->apTree
14500 43 73 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  Csr[i] ){.      
14510 72 63 20 3d 20 6c 73 6d 54 72 65 65 43 75 72 73  rc = lsmTreeCurs
14520 6f 72 45 6e 64 28 70 43 73 72 2d 3e 61 70 54 72  orEnd(pCsr->apTr
14530 65 65 43 73 72 5b 69 5d 2c 20 62 4c 61 73 74 29  eeCsr[i], bLast)
14540 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66  ;.    }.  }..  f
14550 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 4c 53 4d 5f  or(i=0; rc==LSM_
14560 4f 4b 20 26 26 20 69 3c 70 43 73 72 2d 3e 6e 50  OK && i<pCsr->nP
14570 74 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53 65  tr; i++){.    Se
14580 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 20 3d  gmentPtr *pPtr =
14590 20 26 70 43 73 72 2d 3e 61 50 74 72 5b 69 5d 3b   &pCsr->aPtr[i];
145a0 0a 20 20 20 20 4c 65 76 65 6c 20 2a 70 4c 76 6c  .    Level *pLvl
145b0 20 3d 20 70 50 74 72 2d 3e 70 4c 65 76 65 6c 3b   = pPtr->pLevel;
145c0 0a 20 20 20 20 69 6e 74 20 69 52 68 73 3b 0a 20  .    int iRhs;. 
145d0 20 20 20 69 6e 74 20 62 48 69 74 20 3d 20 30 3b     int bHit = 0;
145e0 0a 0a 20 20 20 20 69 66 28 20 62 4c 61 73 74 20  ..    if( bLast 
145f0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 52 68  ){.      for(iRh
14600 73 3d 30 3b 20 69 52 68 73 3c 70 4c 76 6c 2d 3e  s=0; iRhs<pLvl->
14610 6e 52 69 67 68 74 20 26 26 20 72 63 3d 3d 4c 53  nRight && rc==LS
14620 4d 5f 4f 4b 3b 20 69 52 68 73 2b 2b 29 7b 0a 20  M_OK; iRhs++){. 
14630 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 67 6d         rc = segm
14640 65 6e 74 50 74 72 45 6e 64 28 70 43 73 72 2c 20  entPtrEnd(pCsr, 
14650 26 70 50 74 72 5b 69 52 68 73 2b 31 5d 2c 20 31  &pPtr[iRhs+1], 1
14660 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
14670 50 74 72 5b 69 52 68 73 2b 31 5d 2e 70 50 67 20  Ptr[iRhs+1].pPg 
14680 29 20 62 48 69 74 20 3d 20 31 3b 0a 20 20 20 20  ) bHit = 1;.    
14690 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 48    }.      if( bH
146a0 69 74 3d 3d 30 20 26 26 20 72 63 3d 3d 4c 53 4d  it==0 && rc==LSM
146b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
146c0 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 45 6e  c = segmentPtrEn
146d0 64 28 70 43 73 72 2c 20 70 50 74 72 2c 20 31 29  d(pCsr, pPtr, 1)
146e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
146f0 20 20 20 20 20 20 20 73 65 67 6d 65 6e 74 50 74         segmentPt
14700 72 52 65 73 65 74 28 70 50 74 72 2c 20 4c 53 4d  rReset(pPtr, LSM
14710 5f 53 45 47 4d 45 4e 54 50 54 52 5f 46 52 45 45  _SEGMENTPTR_FREE
14720 5f 54 48 52 45 53 48 4f 4c 44 29 3b 0a 20 20 20  _THRESHOLD);.   
14730 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
14740 20 20 20 20 20 20 69 6e 74 20 62 4c 68 73 20 3d        int bLhs =
14750 20 28 70 50 74 72 2d 3e 70 53 65 67 3d 3d 26 70   (pPtr->pSeg==&p
14760 4c 76 6c 2d 3e 6c 68 73 29 3b 0a 20 20 20 20 20  Lvl->lhs);.     
14770 20 61 73 73 65 72 74 28 20 70 50 74 72 2d 3e 70   assert( pPtr->p
14780 53 65 67 3d 3d 26 70 4c 76 6c 2d 3e 6c 68 73 20  Seg==&pLvl->lhs 
14790 7c 7c 20 70 50 74 72 2d 3e 70 53 65 67 3d 3d 26  || pPtr->pSeg==&
147a0 70 4c 76 6c 2d 3e 61 52 68 73 5b 30 5d 20 29 3b  pLvl->aRhs[0] );
147b0 0a 0a 20 20 20 20 20 20 69 66 28 20 62 4c 68 73  ..      if( bLhs
147c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
147d0 20 73 65 67 6d 65 6e 74 50 74 72 45 6e 64 28 70   segmentPtrEnd(p
147e0 43 73 72 2c 20 70 50 74 72 2c 20 30 29 3b 0a 20  Csr, pPtr, 0);. 
147f0 20 20 20 20 20 20 20 69 66 28 20 70 50 74 72 2d         if( pPtr-
14800 3e 70 4b 65 79 20 29 20 62 48 69 74 20 3d 20 31  >pKey ) bHit = 1
14810 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14820 66 6f 72 28 69 52 68 73 3d 30 3b 20 69 52 68 73  for(iRhs=0; iRhs
14830 3c 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 20 26 26  <pLvl->nRight &&
14840 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 3b 20 69 52 68   rc==LSM_OK; iRh
14850 73 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  s++){.        if
14860 28 20 62 48 69 74 20 29 7b 0a 20 20 20 20 20 20  ( bHit ){.      
14870 20 20 20 20 73 65 67 6d 65 6e 74 50 74 72 52 65      segmentPtrRe
14880 73 65 74 28 26 70 50 74 72 5b 69 52 68 73 2b 31  set(&pPtr[iRhs+1
14890 5d 2c 20 4c 53 4d 5f 53 45 47 4d 45 4e 54 50 54  ], LSM_SEGMENTPT
148a0 52 5f 46 52 45 45 5f 54 48 52 45 53 48 4f 4c 44  R_FREE_THRESHOLD
148b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
148c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
148d0 20 73 6f 72 74 65 64 52 68 73 46 69 72 73 74 28   sortedRhsFirst(
148e0 70 43 73 72 2c 20 70 4c 76 6c 2c 20 26 70 50 74  pCsr, pLvl, &pPt
148f0 72 5b 69 52 68 73 2b 62 4c 68 73 5d 29 3b 0a 20  r[iRhs+bLhs]);. 
14900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14910 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 2b 3d 20  .    }.    i += 
14920 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 3b 0a 20 20  pLvl->nRight;.  
14930 7d 0a 0a 20 20 2f 2a 20 41 6e 64 20 74 68 65 20  }..  /* And the 
14940 62 2d 74 72 65 65 20 63 75 72 73 6f 72 2c 20 69  b-tree cursor, i
14950 66 20 61 70 70 6c 69 63 61 62 6c 65 20 2a 2f 0a  f applicable */.
14960 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b    if( rc==LSM_OK
14970 20 26 26 20 70 43 73 72 2d 3e 70 42 74 43 73 72   && pCsr->pBtCsr
14980 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14990 62 4c 61 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  bLast==0 );.    
149a0 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
149b0 46 69 72 73 74 28 70 43 73 72 2d 3e 70 42 74 43  First(pCsr->pBtC
149c0 73 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  sr);.  }..  if( 
149d0 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
149e0 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72 73    rc = multiCurs
149f0 6f 72 53 65 74 75 70 54 72 65 65 28 70 43 73 72  orSetupTree(pCsr
14a00 2c 20 62 4c 61 73 74 29 3b 0a 20 20 7d 0a 20 20  , bLast);.  }.  
14a10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14a20 0a 0a 69 6e 74 20 6d 63 75 72 73 6f 72 53 61 76  ..int mcursorSav
14a30 65 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70  e(MultiCursor *p
14a40 43 73 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Csr){.  int rc =
14a50 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 66 28 20 70   LSM_OK;.  if( p
14a60 43 73 72 2d 3e 61 54 72 65 65 20 29 7b 0a 20 20  Csr->aTree ){.  
14a70 20 20 69 6e 74 20 69 54 72 65 65 20 3d 20 70 43    int iTree = pC
14a80 73 72 2d 3e 61 54 72 65 65 5b 31 5d 3b 0a 20 20  sr->aTree[1];.  
14a90 20 20 69 66 28 20 69 54 72 65 65 3d 3d 43 55 52    if( iTree==CUR
14aa0 53 4f 52 5f 44 41 54 41 5f 54 52 45 45 30 20 7c  SOR_DATA_TREE0 |
14ab0 7c 20 69 54 72 65 65 3d 3d 43 55 52 53 4f 52 5f  | iTree==CURSOR_
14ac0 44 41 54 41 5f 54 52 45 45 31 20 29 7b 0a 20 20  DATA_TREE1 ){.  
14ad0 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f 72 43      multiCursorC
14ae0 61 63 68 65 4b 65 79 28 70 43 73 72 2c 20 26 72  acheKey(pCsr, &r
14af0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
14b00 6d 63 75 72 73 6f 72 46 72 65 65 43 6f 6d 70 6f  mcursorFreeCompo
14b10 6e 65 6e 74 73 28 70 43 73 72 29 3b 0a 20 20 72  nents(pCsr);.  r
14b20 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74  eturn rc;.}..int
14b30 20 6d 63 75 72 73 6f 72 52 65 73 74 6f 72 65 28   mcursorRestore(
14b40 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 4d 75 6c  lsm_db *pDb, Mul
14b50 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b  tiCursor *pCsr){
14b60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
14b70 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72 49 6e 69  = multiCursorIni
14b80 74 28 70 43 73 72 2c 20 70 44 62 2d 3e 70 43 6c  t(pCsr, pDb->pCl
14b90 69 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  ient);.  if( rc=
14ba0 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 43 73 72 2d  =LSM_OK && pCsr-
14bb0 3e 6b 65 79 2e 70 44 61 74 61 20 29 7b 0a 20 20  >key.pData ){.  
14bc0 20 20 72 63 20 3d 20 6c 73 6d 4d 43 75 72 73 6f    rc = lsmMCurso
14bd0 72 53 65 65 6b 28 70 43 73 72 2c 20 0a 20 20 20  rSeek(pCsr, .   
14be0 20 20 20 20 20 20 72 74 54 6f 70 69 63 28 70 43        rtTopic(pC
14bf0 73 72 2d 3e 65 54 79 70 65 29 2c 20 70 43 73 72  sr->eType), pCsr
14c00 2d 3e 6b 65 79 2e 70 44 61 74 61 2c 20 70 43 73  ->key.pData, pCs
14c10 72 2d 3e 6b 65 79 2e 6e 44 61 74 61 2c 20 2b 31  r->key.nData, +1
14c20 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65  .    );.  }.  re
14c30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20  turn rc;.}..int 
14c40 6c 73 6d 53 61 76 65 43 75 72 73 6f 72 73 28 6c  lsmSaveCursors(l
14c50 73 6d 5f 64 62 20 2a 70 44 62 29 7b 0a 20 20 69  sm_db *pDb){.  i
14c60 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a  nt rc = LSM_OK;.
14c70 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70    MultiCursor *p
14c80 43 73 72 3b 0a 0a 20 20 66 6f 72 28 70 43 73 72  Csr;..  for(pCsr
14c90 3d 70 44 62 2d 3e 70 43 73 72 3b 20 72 63 3d 3d  =pDb->pCsr; rc==
14ca0 4c 53 4d 5f 4f 4b 20 26 26 20 70 43 73 72 3b 20  LSM_OK && pCsr; 
14cb0 70 43 73 72 3d 70 43 73 72 2d 3e 70 4e 65 78 74  pCsr=pCsr->pNext
14cc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 63 75 72  ){.    rc = mcur
14cd0 73 6f 72 53 61 76 65 28 70 43 73 72 29 3b 0a 20  sorSave(pCsr);. 
14ce0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
14cf0 7d 0a 0a 69 6e 74 20 6c 73 6d 52 65 73 74 6f 72  }..int lsmRestor
14d00 65 43 75 72 73 6f 72 73 28 6c 73 6d 5f 64 62 20  eCursors(lsm_db 
14d10 2a 70 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pDb){.  int rc 
14d20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 4d 75 6c 74  = LSM_OK;.  Mult
14d30 69 43 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 0a  iCursor *pCsr;..
14d40 20 20 66 6f 72 28 70 43 73 72 3d 70 44 62 2d 3e    for(pCsr=pDb->
14d50 70 43 73 72 3b 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  pCsr; rc==LSM_OK
14d60 20 26 26 20 70 43 73 72 3b 20 70 43 73 72 3d 70   && pCsr; pCsr=p
14d70 43 73 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Csr->pNext){.   
14d80 20 72 63 20 3d 20 6d 63 75 72 73 6f 72 52 65 73   rc = mcursorRes
14d90 74 6f 72 65 28 70 44 62 2c 20 70 43 73 72 29 3b  tore(pDb, pCsr);
14da0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14db0 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 4d 43 75 72  ;.}..int lsmMCur
14dc0 73 6f 72 46 69 72 73 74 28 4d 75 6c 74 69 43 75  sorFirst(MultiCu
14dd0 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 72  rsor *pCsr){.  r
14de0 65 74 75 72 6e 20 6d 75 6c 74 69 43 75 72 73 6f  eturn multiCurso
14df0 72 45 6e 64 28 70 43 73 72 2c 20 30 29 3b 0a 7d  rEnd(pCsr, 0);.}
14e00 0a 0a 69 6e 74 20 6c 73 6d 4d 43 75 72 73 6f 72  ..int lsmMCursor
14e10 4c 61 73 74 28 4d 75 6c 74 69 43 75 72 73 6f 72  Last(MultiCursor
14e20 20 2a 70 43 73 72 29 7b 0a 20 20 72 65 74 75 72   *pCsr){.  retur
14e30 6e 20 6d 75 6c 74 69 43 75 72 73 6f 72 45 6e 64  n multiCursorEnd
14e40 28 70 43 73 72 2c 20 31 29 3b 0a 7d 0a 0a 6c 73  (pCsr, 1);.}..ls
14e50 6d 5f 64 62 20 2a 6c 73 6d 4d 43 75 72 73 6f 72  m_db *lsmMCursor
14e60 44 62 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  Db(MultiCursor *
14e70 70 43 73 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCsr){.  return 
14e80 70 43 73 72 2d 3e 70 44 62 3b 0a 7d 0a 0a 76 6f  pCsr->pDb;.}..vo
14e90 69 64 20 6c 73 6d 4d 43 75 72 73 6f 72 52 65 73  id lsmMCursorRes
14ea0 65 74 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  et(MultiCursor *
14eb0 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pCsr){.  int i;.
14ec0 20 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 52    lsmTreeCursorR
14ed0 65 73 65 74 28 70 43 73 72 2d 3e 61 70 54 72 65  eset(pCsr->apTre
14ee0 65 43 73 72 5b 30 5d 29 3b 0a 20 20 6c 73 6d 54  eCsr[0]);.  lsmT
14ef0 72 65 65 43 75 72 73 6f 72 52 65 73 65 74 28 70  reeCursorReset(p
14f00 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72 5b 31  Csr->apTreeCsr[1
14f10 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
14f20 3c 70 43 73 72 2d 3e 6e 50 74 72 3b 20 69 2b 2b  <pCsr->nPtr; i++
14f30 29 7b 0a 20 20 20 20 73 65 67 6d 65 6e 74 50 74  ){.    segmentPt
14f40 72 52 65 73 65 74 28 26 70 43 73 72 2d 3e 61 50  rReset(&pCsr->aP
14f50 74 72 5b 69 5d 2c 20 4c 53 4d 5f 53 45 47 4d 45  tr[i], LSM_SEGME
14f60 4e 54 50 54 52 5f 46 52 45 45 5f 54 48 52 45 53  NTPTR_FREE_THRES
14f70 48 4f 4c 44 29 3b 0a 20 20 7d 0a 20 20 70 43 73  HOLD);.  }.  pCs
14f80 72 2d 3e 6b 65 79 2e 6e 44 61 74 61 20 3d 20 30  r->key.nData = 0
14f90 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
14fa0 74 72 65 65 43 75 72 73 6f 72 53 65 65 6b 28 0a  treeCursorSeek(.
14fb0 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70    MultiCursor *p
14fc0 43 73 72 2c 0a 20 20 54 72 65 65 43 75 72 73 6f  Csr,.  TreeCurso
14fd0 72 20 2a 70 54 72 65 65 43 73 72 2c 20 0a 20 20  r *pTreeCsr, .  
14fe0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20  void *pKey, int 
14ff0 6e 4b 65 79 2c 20 0a 20 20 69 6e 74 20 65 53 65  nKey, .  int eSe
15000 65 6b 2c 0a 20 20 69 6e 74 20 2a 70 62 53 74 6f  ek,.  int *pbSto
15010 70 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  p.){.  int rc = 
15020 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 54  LSM_OK;.  if( pT
15030 72 65 65 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  reeCsr ){.    in
15040 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 6c  t res = 0;.    l
15050 73 6d 54 72 65 65 43 75 72 73 6f 72 53 65 65 6b  smTreeCursorSeek
15060 28 70 54 72 65 65 43 73 72 2c 20 70 4b 65 79 2c  (pTreeCsr, pKey,
15070 20 6e 4b 65 79 2c 20 26 72 65 73 29 3b 0a 20 20   nKey, &res);.  
15080 20 20 73 77 69 74 63 68 28 20 65 53 65 65 6b 20    switch( eSeek 
15090 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4c 53  ){.      case LS
150a0 4d 5f 53 45 45 4b 5f 45 51 3a 20 7b 0a 20 20 20  M_SEEK_EQ: {.   
150b0 20 20 20 20 20 69 6e 74 20 65 54 79 70 65 20 3d       int eType =
150c0 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 46 6c   lsmTreeCursorFl
150d0 61 67 73 28 70 54 72 65 65 43 73 72 29 3b 0a 20  ags(pTreeCsr);. 
150e0 20 20 20 20 20 20 20 69 66 28 20 28 72 65 73 3c         if( (res<
150f0 30 20 26 26 20 28 65 54 79 70 65 20 26 20 4c 53  0 && (eType & LS
15100 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54 45 29 29  M_START_DELETE))
15110 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 72 65  .         || (re
15120 73 3e 30 20 26 26 20 28 65 54 79 70 65 20 26 20  s>0 && (eType & 
15130 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45 54 45 29 29  LSM_END_DELETE))
15140 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 72 65  .         || (re
15150 73 3d 3d 30 20 26 26 20 28 65 54 79 70 65 20 26  s==0 && (eType &
15160 20 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c 45 54   LSM_POINT_DELET
15170 45 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  E)).        ){. 
15180 20 20 20 20 20 20 20 20 20 2a 70 62 53 74 6f 70           *pbStop
15190 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
151a0 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26  lse if( res==0 &
151b0 26 20 28 65 54 79 70 65 20 26 20 4c 53 4d 5f 49  & (eType & LSM_I
151c0 4e 53 45 52 54 29 20 29 7b 0a 20 20 20 20 20 20  NSERT) ){.      
151d0 20 20 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e      lsm_env *pEn
151e0 76 20 3d 20 70 43 73 72 2d 3e 70 44 62 2d 3e 70  v = pCsr->pDb->p
151f0 45 6e 76 3b 0a 20 20 20 20 20 20 20 20 20 20 76  Env;.          v
15200 6f 69 64 20 2a 70 3b 20 69 6e 74 20 6e 3b 20 20  oid *p; int n;  
15210 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 2f 76 61         /* Key/va
15220 6c 75 65 20 66 72 6f 6d 20 74 72 65 65 2d 63 75  lue from tree-cu
15230 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rsor */.        
15240 20 20 2a 70 62 53 74 6f 70 20 3d 20 31 3b 0a 20    *pbStop = 1;. 
15250 20 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 66           pCsr->f
15260 6c 61 67 73 20 7c 3d 20 43 55 52 53 4f 52 5f 53  lags |= CURSOR_S
15270 45 45 4b 5f 45 51 3b 0a 20 20 20 20 20 20 20 20  EEK_EQ;.        
15280 20 20 72 63 20 3d 20 6c 73 6d 54 72 65 65 43 75    rc = lsmTreeCu
15290 72 73 6f 72 4b 65 79 28 70 54 72 65 65 43 73 72  rsorKey(pTreeCsr
152a0 2c 20 26 70 43 73 72 2d 3e 65 54 79 70 65 2c 20  , &pCsr->eType, 
152b0 26 70 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &p, &n);.       
152c0 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
152d0 4b 20 29 20 72 63 20 3d 20 73 6f 72 74 65 64 42  K ) rc = sortedB
152e0 6c 6f 62 53 65 74 28 70 45 6e 76 2c 20 26 70 43  lobSet(pEnv, &pC
152f0 73 72 2d 3e 6b 65 79 2c 20 70 2c 20 6e 29 3b 0a  sr->key, p, n);.
15300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
15310 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 72 63 20 3d 20  ==LSM_OK ) rc = 
15320 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 56 61 6c  lsmTreeCursorVal
15330 75 65 28 70 54 72 65 65 43 73 72 2c 20 26 70 2c  ue(pTreeCsr, &p,
15340 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &n);.          
15350 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  if( rc==LSM_OK )
15360 20 72 63 20 3d 20 73 6f 72 74 65 64 42 6c 6f 62   rc = sortedBlob
15370 53 65 74 28 70 45 6e 76 2c 20 26 70 43 73 72 2d  Set(pEnv, &pCsr-
15380 3e 76 61 6c 2c 20 70 2c 20 6e 29 3b 0a 20 20 20  >val, p, n);.   
15390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
153a0 73 6d 54 72 65 65 43 75 72 73 6f 72 52 65 73 65  smTreeCursorRese
153b0 74 28 70 54 72 65 65 43 73 72 29 3b 0a 20 20 20  t(pTreeCsr);.   
153c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
153d0 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4c    }.      case L
153e0 53 4d 5f 53 45 45 4b 5f 47 45 3a 0a 20 20 20 20  SM_SEEK_GE:.    
153f0 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 26 26      if( res<0 &&
15400 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 56 61   lsmTreeCursorVa
15410 6c 69 64 28 70 54 72 65 65 43 73 72 29 20 29 7b  lid(pTreeCsr) ){
15420 0a 20 20 20 20 20 20 20 20 20 20 6c 73 6d 54 72  .          lsmTr
15430 65 65 43 75 72 73 6f 72 4e 65 78 74 28 70 54 72  eeCursorNext(pTr
15440 65 65 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20  eeCsr);.        
15450 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
15460 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
15470 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3e          if( res>
15480 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
15490 73 73 65 72 74 28 20 6c 73 6d 54 72 65 65 43 75  ssert( lsmTreeCu
154a0 72 73 6f 72 56 61 6c 69 64 28 70 54 72 65 65 43  rsorValid(pTreeC
154b0 73 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  sr) );.         
154c0 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 50 72   lsmTreeCursorPr
154d0 65 76 28 70 54 72 65 65 43 73 72 29 3b 0a 20 20  ev(pTreeCsr);.  
154e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
154f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
15500 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15510 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
15520 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 69 6e 74 20   cursor..*/.int 
15530 6c 73 6d 4d 43 75 72 73 6f 72 53 65 65 6b 28 0a  lsmMCursorSeek(.
15540 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70    MultiCursor *p
15550 43 73 72 2c 20 0a 20 20 69 6e 74 20 69 54 6f 70  Csr, .  int iTop
15560 69 63 2c 20 0a 20 20 76 6f 69 64 20 2a 70 4b 65  ic, .  void *pKe
15570 79 2c 20 69 6e 74 20 6e 4b 65 79 2c 20 0a 20 20  y, int nKey, .  
15580 69 6e 74 20 65 53 65 65 6b 0a 29 7b 0a 20 20 69  int eSeek.){.  i
15590 6e 74 20 65 45 53 65 65 6b 20 3d 20 65 53 65 65  nt eESeek = eSee
155a0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
155b0 2a 20 45 66 66 65 63 74 69 76 65 20 65 53 65 65  * Effective eSee
155c0 6b 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  k parameter */. 
155d0 20 69 6e 74 20 62 53 74 6f 70 20 3d 20 30 3b 20   int bStop = 0; 
155e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155f0 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
15600 74 6f 20 68 61 6c 74 20 73 65 61 72 63 68 20 6f  to halt search o
15610 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
15620 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20  t rc = LSM_OK;  
15630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15640 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
15650 20 20 69 6e 74 20 69 50 74 72 20 3d 20 30 3b 20    int iPtr = 0; 
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15670 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
15680 72 61 74 65 20 74 68 72 6f 75 67 68 20 70 43 73  rate through pCs
15690 72 2d 3e 61 50 74 72 5b 5d 20 2a 2f 0a 20 20 50  r->aPtr[] */.  P
156a0 67 6e 6f 20 69 50 67 6e 6f 20 3d 20 30 3b 20 20  gno iPgno = 0;  
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
156c0 2a 20 46 43 20 70 6f 69 6e 74 65 72 20 76 61 6c  * FC pointer val
156d0 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ue */..  assert(
156e0 20 70 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72   pCsr->apTreeCsr
156f0 5b 30 5d 3d 3d 30 20 7c 7c 20 69 54 6f 70 69 63  [0]==0 || iTopic
15700 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
15710 20 70 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72   pCsr->apTreeCsr
15720 5b 31 5d 3d 3d 30 20 7c 7c 20 69 54 6f 70 69 63  [1]==0 || iTopic
15730 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 65 45  ==0 );..  if( eE
15740 53 65 65 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 4c  Seek==LSM_SEEK_L
15750 45 46 41 53 54 20 29 20 65 45 53 65 65 6b 20 3d  EFAST ) eESeek =
15760 20 4c 53 4d 5f 53 45 45 4b 5f 4c 45 3b 0a 0a 20   LSM_SEEK_LE;.. 
15770 20 61 73 73 65 72 74 28 20 65 45 53 65 65 6b 3d   assert( eESeek=
15780 3d 4c 53 4d 5f 53 45 45 4b 5f 45 51 20 7c 7c 20  =LSM_SEEK_EQ || 
15790 65 45 53 65 65 6b 3d 3d 4c 53 4d 5f 53 45 45 4b  eESeek==LSM_SEEK
157a0 5f 4c 45 20 7c 7c 20 65 45 53 65 65 6b 3d 3d 4c  _LE || eESeek==L
157b0 53 4d 5f 53 45 45 4b 5f 47 45 20 29 3b 0a 20 20  SM_SEEK_GE );.  
157c0 61 73 73 65 72 74 28 20 28 70 43 73 72 2d 3e 66  assert( (pCsr->f
157d0 6c 61 67 73 20 26 20 43 55 52 53 4f 52 5f 46 4c  lags & CURSOR_FL
157e0 55 53 48 5f 46 52 45 45 4c 49 53 54 29 3d 3d 30  USH_FREELIST)==0
157f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
15800 73 72 2d 3e 6e 50 74 72 3d 3d 30 20 7c 7c 20 70  sr->nPtr==0 || p
15810 43 73 72 2d 3e 61 50 74 72 5b 30 5d 2e 70 4c 65  Csr->aPtr[0].pLe
15820 76 65 6c 20 29 3b 0a 0a 20 20 70 43 73 72 2d 3e  vel );..  pCsr->
15830 66 6c 61 67 73 20 26 3d 20 7e 28 43 55 52 53 4f  flags &= ~(CURSO
15840 52 5f 4e 45 58 54 5f 4f 4b 20 7c 20 43 55 52 53  R_NEXT_OK | CURS
15850 4f 52 5f 50 52 45 56 5f 4f 4b 20 7c 20 43 55 52  OR_PREV_OK | CUR
15860 53 4f 52 5f 53 45 45 4b 5f 45 51 29 3b 0a 20 20  SOR_SEEK_EQ);.  
15870 72 63 20 3d 20 74 72 65 65 43 75 72 73 6f 72 53  rc = treeCursorS
15880 65 65 6b 28 70 43 73 72 2c 20 70 43 73 72 2d 3e  eek(pCsr, pCsr->
15890 61 70 54 72 65 65 43 73 72 5b 30 5d 2c 20 70 4b  apTreeCsr[0], pK
158a0 65 79 2c 20 6e 4b 65 79 2c 20 65 45 53 65 65 6b  ey, nKey, eESeek
158b0 2c 20 26 62 53 74 6f 70 29 3b 0a 20 20 69 66 28  , &bStop);.  if(
158c0 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 62   rc==LSM_OK && b
158d0 53 74 6f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Stop==0 ){.    r
158e0 63 20 3d 20 74 72 65 65 43 75 72 73 6f 72 53 65  c = treeCursorSe
158f0 65 6b 28 70 43 73 72 2c 20 70 43 73 72 2d 3e 61  ek(pCsr, pCsr->a
15900 70 54 72 65 65 43 73 72 5b 31 5d 2c 20 70 4b 65  pTreeCsr[1], pKe
15910 79 2c 20 6e 4b 65 79 2c 20 65 45 53 65 65 6b 2c  y, nKey, eESeek,
15920 20 26 62 53 74 6f 70 29 3b 0a 20 20 7d 0a 0a 20   &bStop);.  }.. 
15930 20 2f 2a 20 53 65 65 6b 20 61 6c 6c 20 73 65 67   /* Seek all seg
15940 6d 65 6e 74 20 70 6f 69 6e 74 65 72 73 2e 20 2a  ment pointers. *
15950 2f 0a 20 20 66 6f 72 28 69 50 74 72 3d 30 3b 20  /.  for(iPtr=0; 
15960 69 50 74 72 3c 70 43 73 72 2d 3e 6e 50 74 72 20  iPtr<pCsr->nPtr 
15970 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  && rc==LSM_OK &&
15980 20 62 53 74 6f 70 3d 3d 30 3b 20 69 50 74 72 2b   bStop==0; iPtr+
15990 2b 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 50  +){.    SegmentP
159a0 74 72 20 2a 70 50 74 72 20 3d 20 26 70 43 73 72  tr *pPtr = &pCsr
159b0 2d 3e 61 50 74 72 5b 69 50 74 72 5d 3b 0a 20 20  ->aPtr[iPtr];.  
159c0 20 20 61 73 73 65 72 74 28 20 70 50 74 72 2d 3e    assert( pPtr->
159d0 70 53 65 67 3d 3d 26 70 50 74 72 2d 3e 70 4c 65  pSeg==&pPtr->pLe
159e0 76 65 6c 2d 3e 6c 68 73 20 29 3b 0a 20 20 20 20  vel->lhs );.    
159f0 72 63 20 3d 20 73 65 65 6b 49 6e 4c 65 76 65 6c  rc = seekInLevel
15a00 28 70 43 73 72 2c 20 70 50 74 72 2c 20 65 45 53  (pCsr, pPtr, eES
15a10 65 65 6b 2c 20 69 54 6f 70 69 63 2c 20 70 4b 65  eek, iTopic, pKe
15a20 79 2c 20 6e 4b 65 79 2c 20 26 69 50 67 6e 6f 2c  y, nKey, &iPgno,
15a30 20 26 62 53 74 6f 70 29 3b 0a 20 20 20 20 69 50   &bStop);.    iP
15a40 74 72 20 2b 3d 20 70 50 74 72 2d 3e 70 4c 65 76  tr += pPtr->pLev
15a50 65 6c 2d 3e 6e 52 69 67 68 74 3b 0a 20 20 7d 0a  el->nRight;.  }.
15a60 0a 20 20 69 66 28 20 65 53 65 65 6b 21 3d 4c 53  .  if( eSeek!=LS
15a70 4d 5f 53 45 45 4b 5f 45 51 20 29 7b 0a 20 20 20  M_SEEK_EQ ){.   
15a80 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
15a90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 75  ){.      rc = mu
15aa0 6c 74 69 43 75 72 73 6f 72 41 6c 6c 6f 63 54 72  ltiCursorAllocTr
15ab0 65 65 28 70 43 73 72 29 3b 0a 20 20 20 20 7d 0a  ee(pCsr);.    }.
15ac0 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f      if( rc==LSM_
15ad0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
15ae0 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  i;.      for(i=p
15af0 43 73 72 2d 3e 6e 54 72 65 65 2d 31 3b 20 69 3e  Csr->nTree-1; i>
15b00 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 20  0; i--){.       
15b10 20 6d 75 6c 74 69 43 75 72 73 6f 72 44 6f 43 6f   multiCursorDoCo
15b20 6d 70 61 72 65 28 70 43 73 72 2c 20 69 2c 20 65  mpare(pCsr, i, e
15b30 45 53 65 65 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f  ESeek==LSM_SEEK_
15b40 4c 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  LE);.      }.   
15b50 20 20 20 69 66 28 20 65 53 65 65 6b 3d 3d 4c 53     if( eSeek==LS
15b60 4d 5f 53 45 45 4b 5f 47 45 20 29 20 70 43 73 72  M_SEEK_GE ) pCsr
15b70 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 55 52 53 4f  ->flags |= CURSO
15b80 52 5f 4e 45 58 54 5f 4f 4b 3b 0a 20 20 20 20 20  R_NEXT_OK;.     
15b90 20 69 66 28 20 65 53 65 65 6b 3d 3d 4c 53 4d 5f   if( eSeek==LSM_
15ba0 53 45 45 4b 5f 4c 45 20 29 20 70 43 73 72 2d 3e  SEEK_LE ) pCsr->
15bb0 66 6c 61 67 73 20 7c 3d 20 43 55 52 53 4f 52 5f  flags |= CURSOR_
15bc0 50 52 45 56 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  PREV_OK;.    }..
15bd0 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f 72 43      multiCursorC
15be0 61 63 68 65 4b 65 79 28 70 43 73 72 2c 20 26 72  acheKey(pCsr, &r
15bf0 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  c);.    if( rc==
15c00 4c 53 4d 5f 4f 4b 20 26 26 20 65 53 65 65 6b 21  LSM_OK && eSeek!
15c10 3d 4c 53 4d 5f 53 45 45 4b 5f 4c 45 46 41 53 54  =LSM_SEEK_LEFAST
15c20 20 26 26 20 30 3d 3d 6d 63 75 72 73 6f 72 4c 6f   && 0==mcursorLo
15c30 63 61 74 69 6f 6e 4f 6b 28 70 43 73 72 2c 20 30  cationOk(pCsr, 0
15c40 29 20 29 7b 0a 20 20 20 20 20 20 73 77 69 74 63  ) ){.      switc
15c50 68 28 20 65 45 53 65 65 6b 20 29 7b 0a 20 20 20  h( eESeek ){.   
15c60 20 20 20 20 20 63 61 73 65 20 4c 53 4d 5f 53 45       case LSM_SE
15c70 45 4b 5f 45 51 3a 0a 20 20 20 20 20 20 20 20 20  EK_EQ:.         
15c80 20 6c 73 6d 4d 43 75 72 73 6f 72 52 65 73 65 74   lsmMCursorReset
15c90 28 70 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20  (pCsr);.        
15ca0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15cb0 20 63 61 73 65 20 4c 53 4d 5f 53 45 45 4b 5f 47   case LSM_SEEK_G
15cc0 45 3a 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  E:.          rc 
15cd0 3d 20 6c 73 6d 4d 43 75 72 73 6f 72 4e 65 78 74  = lsmMCursorNext
15ce0 28 70 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20  (pCsr);.        
15cf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15d00 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
15d10 20 20 20 20 72 63 20 3d 20 6c 73 6d 4d 43 75 72      rc = lsmMCur
15d20 73 6f 72 50 72 65 76 28 70 43 73 72 29 3b 0a 20  sorPrev(pCsr);. 
15d30 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15d40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15d50 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
15d60 7d 0a 0a 69 6e 74 20 6c 73 6d 4d 43 75 72 73 6f  }..int lsmMCurso
15d70 72 56 61 6c 69 64 28 4d 75 6c 74 69 43 75 72 73  rValid(MultiCurs
15d80 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74  or *pCsr){.  int
15d90 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20   res = 0;.  if( 
15da0 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 43 55  pCsr->flags & CU
15db0 52 53 4f 52 5f 53 45 45 4b 5f 45 51 20 29 7b 0a  RSOR_SEEK_EQ ){.
15dc0 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 7d      res = 1;.  }
15dd0 65 6c 73 65 20 69 66 28 20 70 43 73 72 2d 3e 61  else if( pCsr->a
15de0 54 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Tree ){.    int 
15df0 69 4b 65 79 20 3d 20 70 43 73 72 2d 3e 61 54 72  iKey = pCsr->aTr
15e00 65 65 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 69  ee[1];.    if( i
15e10 4b 65 79 3d 3d 43 55 52 53 4f 52 5f 44 41 54 41  Key==CURSOR_DATA
15e20 5f 54 52 45 45 30 20 7c 7c 20 69 4b 65 79 3d 3d  _TREE0 || iKey==
15e30 43 55 52 53 4f 52 5f 44 41 54 41 5f 54 52 45 45  CURSOR_DATA_TREE
15e40 31 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  1 ){.      res =
15e50 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 56 61   lsmTreeCursorVa
15e60 6c 69 64 28 70 43 73 72 2d 3e 61 70 54 72 65 65  lid(pCsr->apTree
15e70 43 73 72 5b 69 4b 65 79 2d 43 55 52 53 4f 52 5f  Csr[iKey-CURSOR_
15e80 44 41 54 41 5f 54 52 45 45 30 5d 29 3b 0a 20 20  DATA_TREE0]);.  
15e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
15ea0 6f 69 64 20 2a 70 4b 65 79 3b 20 0a 20 20 20 20  oid *pKey; .    
15eb0 20 20 6d 75 6c 74 69 43 75 72 73 6f 72 47 65 74    multiCursorGet
15ec0 4b 65 79 28 70 43 73 72 2c 20 69 4b 65 79 2c 20  Key(pCsr, iKey, 
15ed0 30 2c 20 26 70 4b 65 79 2c 20 30 29 3b 0a 20 20  0, &pKey, 0);.  
15ee0 20 20 20 20 72 65 73 20 3d 20 70 4b 65 79 21 3d      res = pKey!=
15ef0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
15f00 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 73 74  eturn res;.}..st
15f10 61 74 69 63 20 69 6e 74 20 6d 63 75 72 73 6f 72  atic int mcursor
15f20 41 64 76 61 6e 63 65 4f 6b 28 0a 20 20 4d 75 6c  AdvanceOk(.  Mul
15f30 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  tiCursor *pCsr, 
15f40 0a 20 20 69 6e 74 20 62 52 65 76 65 72 73 65 2c  .  int bReverse,
15f50 0a 20 20 69 6e 74 20 2a 70 52 63 0a 29 7b 0a 20  .  int *pRc.){. 
15f60 20 76 6f 69 64 20 2a 70 4e 65 77 3b 20 20 20 20   void *pNew;    
15f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f80 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
15f90 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
15fa0 20 6e 65 77 20 6b 65 79 20 2a 2f 0a 20 20 69 6e   new key */.  in
15fb0 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t nNew;         
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15fd0 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
15fe0 70 4e 65 77 20 69 6e 20 62 79 74 65 73 20 2a 2f  pNew in bytes */
15ff0 0a 20 20 69 6e 74 20 65 4e 65 77 54 79 70 65 3b  .  int eNewType;
16000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16010 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 6e 65     /* Type of ne
16020 77 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 69  w record */..  i
16030 66 28 20 2a 70 52 63 20 29 20 72 65 74 75 72 6e  f( *pRc ) return
16040 20 31 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   1;..  /* Check 
16050 74 68 65 20 63 75 72 72 65 6e 74 20 6b 65 79 20  the current key 
16060 76 61 6c 75 65 2e 20 49 66 20 69 74 20 69 73 20  value. If it is 
16070 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
16080 20 28 69 66 20 62 52 65 76 65 72 73 65 3d 3d 30   (if bReverse==0
16090 29 0a 20 20 2a 2a 20 6f 72 20 6c 65 73 73 20 74  ).  ** or less t
160a0 68 61 6e 20 28 69 66 20 62 52 65 76 65 72 73 65  han (if bReverse
160b0 21 3d 30 29 20 74 68 65 20 6b 65 79 20 63 75 72  !=0) the key cur
160c0 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e  rently cached in
160d0 20 70 43 73 72 2d 3e 6b 65 79 2c 20 0a 20 20 2a   pCsr->key, .  *
160e0 2a 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  * then the curso
160f0 72 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  r has not yet be
16100 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
16110 61 64 76 61 6e 63 65 64 2e 20 20 0a 20 20 2a 2f  advanced.  .  */
16120 0a 20 20 6d 75 6c 74 69 43 75 72 73 6f 72 47 65  .  multiCursorGe
16130 74 4b 65 79 28 70 43 73 72 2c 20 70 43 73 72 2d  tKey(pCsr, pCsr-
16140 3e 61 54 72 65 65 5b 31 5d 2c 20 26 65 4e 65 77  >aTree[1], &eNew
16150 54 79 70 65 2c 20 26 70 4e 65 77 2c 20 26 6e 4e  Type, &pNew, &nN
16160 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  ew);.  if( pNew 
16170 29 7b 0a 20 20 20 20 69 6e 74 20 74 79 70 65 6d  ){.    int typem
16180 61 73 6b 20 3d 20 28 70 43 73 72 2d 3e 66 6c 61  ask = (pCsr->fla
16190 67 73 20 26 20 43 55 52 53 4f 52 5f 49 47 4e 4f  gs & CURSOR_IGNO
161a0 52 45 5f 44 45 4c 45 54 45 29 20 3f 20 7e 28 30  RE_DELETE) ? ~(0
161b0 29 20 3a 20 4c 53 4d 5f 53 59 53 54 45 4d 4b 45  ) : LSM_SYSTEMKE
161c0 59 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d  Y;.    int res =
161d0 20 73 6f 72 74 65 64 44 62 4b 65 79 43 6f 6d 70   sortedDbKeyComp
161e0 61 72 65 28 70 43 73 72 2c 0a 20 20 20 20 20 20  are(pCsr,.      
161f0 65 4e 65 77 54 79 70 65 20 26 20 74 79 70 65 6d  eNewType & typem
16200 61 73 6b 2c 20 70 4e 65 77 2c 20 6e 4e 65 77 2c  ask, pNew, nNew,
16210 20 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 65 54   .      pCsr->eT
16220 79 70 65 20 26 20 74 79 70 65 6d 61 73 6b 2c 20  ype & typemask, 
16230 70 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74 61 2c  pCsr->key.pData,
16240 20 70 43 73 72 2d 3e 6b 65 79 2e 6e 44 61 74 61   pCsr->key.nData
16250 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28  .    );..    if(
16260 20 28 62 52 65 76 65 72 73 65 3d 3d 30 20 26 26   (bReverse==0 &&
16270 20 72 65 73 3c 3d 30 29 20 7c 7c 20 28 62 52 65   res<=0) || (bRe
16280 76 65 72 73 65 21 3d 30 20 26 26 20 72 65 73 3e  verse!=0 && res>
16290 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  =0) ){.      ret
162a0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
162b0 20 20 6d 75 6c 74 69 43 75 72 73 6f 72 43 61 63    multiCursorCac
162c0 68 65 4b 65 79 28 70 43 73 72 2c 20 70 52 63 29  heKey(pCsr, pRc)
162d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
162e0 73 72 2d 3e 65 54 79 70 65 3d 3d 65 4e 65 77 54  sr->eType==eNewT
162f0 79 70 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ype );..    /* I
16300 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 69 73  f this cursor is
16310 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 73   configured to s
16320 6b 69 70 20 64 65 6c 65 74 65 64 20 6b 65 79 73  kip deleted keys
16330 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
16340 74 0a 20 20 20 20 2a 2a 20 63 75 72 73 6f 72 20  t.    ** cursor 
16350 70 6f 69 6e 74 73 20 74 6f 20 61 20 53 4f 52 54  points to a SORT
16360 45 44 5f 44 45 4c 45 54 45 20 65 6e 74 72 79 2c  ED_DELETE entry,
16370 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
16380 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 0a 20   has not been . 
16390 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
163a0 6c 79 20 61 64 76 61 6e 63 65 64 2e 20 20 0a 20  ly advanced.  . 
163b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d     **.    ** Sim
163c0 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 63  ilarly, if the c
163d0 75 72 73 6f 72 20 69 73 20 63 6f 6e 66 69 67 75  ursor is configu
163e0 72 65 64 20 74 6f 20 73 6b 69 70 20 73 79 73 74  red to skip syst
163f0 65 6d 20 6b 65 79 73 20 61 6e 64 20 74 68 65 0a  em keys and the.
16400 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 63      ** current c
16410 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  ursor points to 
16420 61 20 73 79 73 74 65 6d 20 6b 65 79 2c 20 69 74  a system key, it
16430 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
16440 6e 20 61 64 76 61 6e 63 65 64 2e 0a 20 20 20 20  n advanced..    
16450 2a 2f 0a 20 20 20 20 69 66 28 20 2a 70 52 63 3d  */.    if( *pRc=
16460 3d 4c 53 4d 5f 4f 4b 20 26 26 20 30 3d 3d 6d 63  =LSM_OK && 0==mc
16470 75 72 73 6f 72 4c 6f 63 61 74 69 6f 6e 4f 6b 28  ursorLocationOk(
16480 70 43 73 72 2c 20 30 29 20 29 20 72 65 74 75 72  pCsr, 0) ) retur
16490 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
164a0 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  n 1;.}..static v
164b0 6f 69 64 20 66 6c 43 73 72 41 64 76 61 6e 63 65  oid flCsrAdvance
164c0 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43  (MultiCursor *pC
164d0 73 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  sr){.  assert( p
164e0 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 43 55 52  Csr->flags & CUR
164f0 53 4f 52 5f 46 4c 55 53 48 5f 46 52 45 45 4c 49  SOR_FLUSH_FREELI
16500 53 54 20 29 3b 0a 20 20 69 66 28 20 70 43 73 72  ST );.  if( pCsr
16510 2d 3e 69 46 72 65 65 20 25 20 32 20 29 7b 0a 20  ->iFree % 2 ){. 
16520 20 20 20 70 43 73 72 2d 3e 69 46 72 65 65 2b 2b     pCsr->iFree++
16530 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16540 6e 74 20 6e 45 6e 74 72 79 20 3d 20 70 43 73 72  nt nEntry = pCsr
16550 2d 3e 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2d 3e  ->pDb->pWorker->
16560 66 72 65 65 6c 69 73 74 2e 6e 45 6e 74 72 79 3b  freelist.nEntry;
16570 0a 20 20 20 20 46 72 65 65 6c 69 73 74 45 6e 74  .    FreelistEnt
16580 72 79 20 2a 61 45 6e 74 72 79 20 3d 20 70 43 73  ry *aEntry = pCs
16590 72 2d 3e 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2d  r->pDb->pWorker-
165a0 3e 66 72 65 65 6c 69 73 74 2e 61 45 6e 74 72 79  >freelist.aEntry
165b0 3b 0a 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 6e  ;..    int i = n
165c0 45 6e 74 72 79 20 2d 20 31 20 2d 20 28 70 43 73  Entry - 1 - (pCs
165d0 72 2d 3e 69 46 72 65 65 20 2f 20 32 29 3b 0a 0a  r->iFree / 2);..
165e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75      /* If the cu
165f0 72 72 65 6e 74 20 65 6e 74 72 79 20 69 73 20 61  rrent entry is a
16600 20 64 65 6c 65 74 65 20 61 6e 64 20 74 68 65 20   delete and the 
16610 22 65 6e 64 2d 64 65 6c 65 74 65 22 20 6b 65 79  "end-delete" key
16620 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a   will not.    **
16630 20 62 65 20 61 74 74 61 63 68 65 64 20 74 6f 20   be attached to 
16640 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2c 20  the next entry, 
16650 69 6e 63 72 65 6d 65 6e 74 20 69 46 72 65 65 20  increment iFree 
16660 62 79 20 31 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  by 1 only. */.  
16670 20 20 69 66 28 20 61 45 6e 74 72 79 5b 69 5d 2e    if( aEntry[i].
16680 69 49 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 77  iId<0 ){.      w
16690 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
166a0 20 20 20 69 66 28 20 69 3d 3d 30 20 7c 7c 20 61     if( i==0 || a
166b0 45 6e 74 72 79 5b 69 2d 31 5d 2e 69 42 6c 6b 21  Entry[i-1].iBlk!
166c0 3d 61 45 6e 74 72 79 5b 69 5d 2e 69 42 6c 6b 2d  =aEntry[i].iBlk-
166d0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  1 ){.          p
166e0 43 73 72 2d 3e 69 46 72 65 65 2d 2d 3b 0a 20 20  Csr->iFree--;.  
166f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16700 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16710 20 69 66 28 20 61 45 6e 74 72 79 5b 69 2d 31 5d   if( aEntry[i-1]
16720 2e 69 49 64 3e 3d 30 20 29 20 62 72 65 61 6b 3b  .iId>=0 ) break;
16730 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d 3e 69  .        pCsr->i
16740 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 20 20 20  Free += 2;.     
16750 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a     i--;.      }.
16760 20 20 20 20 7d 0a 20 20 20 20 70 43 73 72 2d 3e      }.    pCsr->
16770 69 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a  iFree += 2;.  }.
16780 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  }..static int mu
16790 6c 74 69 43 75 72 73 6f 72 41 64 76 61 6e 63 65  ltiCursorAdvance
167a0 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43  (MultiCursor *pC
167b0 73 72 2c 20 69 6e 74 20 62 52 65 76 65 72 73 65  sr, int bReverse
167c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  ){.  int rc = LS
167d0 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  M_OK;           
167e0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
167f0 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 6c 73 6d  ode */.  if( lsm
16800 4d 43 75 72 73 6f 72 56 61 6c 69 64 28 70 43 73  MCursorValid(pCs
16810 72 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  r) ){.    do {. 
16820 20 20 20 20 20 69 6e 74 20 69 4b 65 79 20 3d 20       int iKey = 
16830 70 43 73 72 2d 3e 61 54 72 65 65 5b 31 5d 3b 0a  pCsr->aTree[1];.
16840 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 75 72  .      assertCur
16850 73 6f 72 54 72 65 65 28 70 43 73 72 29 3b 0a 0a  sorTree(pCsr);..
16860 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
16870 20 6d 75 6c 74 69 2d 63 75 72 73 6f 72 20 69 73   multi-cursor is
16880 20 61 64 76 61 6e 63 69 6e 67 20 66 6f 72 77 61   advancing forwa
16890 72 64 73 2c 20 61 6e 64 20 74 68 65 20 73 75 62  rds, and the sub
168a0 2d 63 75 72 73 6f 72 0a 20 20 20 20 20 20 2a 2a  -cursor.      **
168b0 20 62 65 69 6e 67 20 61 64 76 61 6e 63 65 64 20   being advanced 
168c0 69 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  is the one that 
168d0 73 65 70 61 72 61 74 6f 72 20 6b 65 79 73 20 6d  separator keys m
168e0 61 79 20 62 65 20 62 65 69 6e 67 20 72 65 61 64  ay be being read
168f0 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 2c 20  .      ** from, 
16900 72 65 63 6f 72 64 20 74 68 65 20 63 75 72 72 65  record the curre
16910 6e 74 20 61 62 73 6f 6c 75 74 65 20 70 6f 69 6e  nt absolute poin
16920 74 65 72 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20  ter value.  */. 
16930 20 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 70       if( pCsr->p
16940 50 72 65 76 4d 65 72 67 65 50 74 72 20 29 7b 0a  PrevMergePtr ){.
16950 20 20 20 20 20 20 20 20 69 66 28 20 69 4b 65 79          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 20 20  r) ){.          
16990 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 70 42  assert( pCsr->pB
169a0 74 43 73 72 20 29 3b 0a 20 20 20 20 20 20 20 20  tCsr );.        
169b0 20 20 2a 70 43 73 72 2d 3e 70 50 72 65 76 4d 65    *pCsr->pPrevMe
169c0 72 67 65 50 74 72 20 3d 20 70 43 73 72 2d 3e 70  rgePtr = pCsr->p
169d0 42 74 43 73 72 2d 3e 69 50 74 72 3b 0a 20 20 20  BtCsr->iPtr;.   
169e0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
169f0 43 73 72 2d 3e 70 42 74 43 73 72 3d 3d 30 20 26  Csr->pBtCsr==0 &
16a00 26 20 70 43 73 72 2d 3e 6e 50 74 72 3e 30 0a 20  & pCsr->nPtr>0. 
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
16a20 20 69 4b 65 79 3d 3d 28 43 55 52 53 4f 52 5f 44   iKey==(CURSOR_D
16a30 41 54 41 5f 53 45 47 4d 45 4e 54 2b 70 43 73 72  ATA_SEGMENT+pCsr
16a40 2d 3e 6e 50 74 72 2d 31 29 20 0a 20 20 20 20 20  ->nPtr-1) .     
16a50 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
16a60 53 65 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72  SegmentPtr *pPtr
16a70 20 3d 20 26 70 43 73 72 2d 3e 61 50 74 72 5b 69   = &pCsr->aPtr[i
16a80 4b 65 79 2d 43 55 52 53 4f 52 5f 44 41 54 41 5f  Key-CURSOR_DATA_
16a90 53 45 47 4d 45 4e 54 5d 3b 0a 20 20 20 20 20 20  SEGMENT];.      
16aa0 20 20 20 20 2a 70 43 73 72 2d 3e 70 50 72 65 76      *pCsr->pPrev
16ab0 4d 65 72 67 65 50 74 72 20 3d 20 70 50 74 72 2d  MergePtr = pPtr-
16ac0 3e 69 50 74 72 2b 70 50 74 72 2d 3e 69 50 67 50  >iPtr+pPtr->iPgP
16ad0 74 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  tr;.        }.  
16ae0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
16af0 20 69 4b 65 79 3d 3d 43 55 52 53 4f 52 5f 44 41   iKey==CURSOR_DA
16b00 54 41 5f 54 52 45 45 30 20 7c 7c 20 69 4b 65 79  TA_TREE0 || iKey
16b10 3d 3d 43 55 52 53 4f 52 5f 44 41 54 41 5f 54 52  ==CURSOR_DATA_TR
16b20 45 45 31 20 29 7b 0a 20 20 20 20 20 20 20 20 54  EE1 ){.        T
16b30 72 65 65 43 75 72 73 6f 72 20 2a 70 54 72 65 65  reeCursor *pTree
16b40 43 73 72 20 3d 20 70 43 73 72 2d 3e 61 70 54 72  Csr = pCsr->apTr
16b50 65 65 43 73 72 5b 69 4b 65 79 2d 43 55 52 53 4f  eeCsr[iKey-CURSO
16b60 52 5f 44 41 54 41 5f 54 52 45 45 30 5d 3b 0a 20  R_DATA_TREE0];. 
16b70 20 20 20 20 20 20 20 69 66 28 20 62 52 65 76 65         if( bReve
16b80 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rse ){.         
16b90 20 72 63 20 3d 20 6c 73 6d 54 72 65 65 43 75 72   rc = lsmTreeCur
16ba0 73 6f 72 50 72 65 76 28 70 54 72 65 65 43 73 72  sorPrev(pTreeCsr
16bb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
16bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
16bd0 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 4e 65   lsmTreeCursorNe
16be0 78 74 28 70 54 72 65 65 43 73 72 29 3b 0a 20 20  xt(pTreeCsr);.  
16bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
16c00 6c 73 65 20 69 66 28 20 69 4b 65 79 3d 3d 43 55  lse if( iKey==CU
16c10 52 53 4f 52 5f 44 41 54 41 5f 53 59 53 54 45 4d  RSOR_DATA_SYSTEM
16c20 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
16c30 72 74 28 20 70 43 73 72 2d 3e 66 6c 61 67 73 20  rt( pCsr->flags 
16c40 26 20 43 55 52 53 4f 52 5f 46 4c 55 53 48 5f 46  & CURSOR_FLUSH_F
16c50 52 45 45 4c 49 53 54 20 29 3b 0a 20 20 20 20 20  REELIST );.     
16c60 20 20 20 61 73 73 65 72 74 28 20 62 52 65 76 65     assert( bReve
16c70 72 73 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rse==0 );.      
16c80 20 20 66 6c 43 73 72 41 64 76 61 6e 63 65 28 70    flCsrAdvance(p
16c90 43 73 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Csr);.      }els
16ca0 65 20 69 66 28 20 69 4b 65 79 3d 3d 28 43 55 52  e if( iKey==(CUR
16cb0 53 4f 52 5f 44 41 54 41 5f 53 45 47 4d 45 4e 54  SOR_DATA_SEGMENT
16cc0 2b 70 43 73 72 2d 3e 6e 50 74 72 29 20 29 7b 0a  +pCsr->nPtr) ){.
16cd0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16ce0 62 52 65 76 65 72 73 65 3d 3d 30 20 26 26 20 70  bReverse==0 && p
16cf0 43 73 72 2d 3e 70 42 74 43 73 72 20 29 3b 0a 20  Csr->pBtCsr );. 
16d00 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
16d10 65 43 75 72 73 6f 72 4e 65 78 74 28 70 43 73 72  eCursorNext(pCsr
16d20 2d 3e 70 42 74 43 73 72 29 3b 0a 20 20 20 20 20  ->pBtCsr);.     
16d30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16d40 72 63 20 3d 20 73 65 67 6d 65 6e 74 43 75 72 73  rc = segmentCurs
16d50 6f 72 41 64 76 61 6e 63 65 28 70 43 73 72 2c 20  orAdvance(pCsr, 
16d60 69 4b 65 79 2d 43 55 52 53 4f 52 5f 44 41 54 41  iKey-CURSOR_DATA
16d70 5f 53 45 47 4d 45 4e 54 2c 20 62 52 65 76 65 72  _SEGMENT, bRever
16d80 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  se);.      }.   
16d90 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
16da0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  K ){.        int
16db0 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
16dc0 69 3d 28 69 4b 65 79 2b 70 43 73 72 2d 3e 6e 54  i=(iKey+pCsr->nT
16dd0 72 65 65 29 2f 32 3b 20 69 3e 30 3b 20 69 3d 69  ree)/2; i>0; i=i
16de0 2f 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  /2){.          m
16df0 75 6c 74 69 43 75 72 73 6f 72 44 6f 43 6f 6d 70  ultiCursorDoComp
16e00 61 72 65 28 70 43 73 72 2c 20 69 2c 20 62 52 65  are(pCsr, i, bRe
16e10 76 65 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  verse);.        
16e20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
16e30 43 75 72 73 6f 72 54 72 65 65 28 70 43 73 72 29  CursorTree(pCsr)
16e40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  ;.      }.    }w
16e50 68 69 6c 65 28 20 6d 63 75 72 73 6f 72 41 64 76  hile( mcursorAdv
16e60 61 6e 63 65 4f 6b 28 70 43 73 72 2c 20 62 52 65  anceOk(pCsr, bRe
16e70 76 65 72 73 65 2c 20 26 72 63 29 3d 3d 30 20 29  verse, &rc)==0 )
16e80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
16e90 63 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 4d 43 75  c;.}..int lsmMCu
16ea0 72 73 6f 72 4e 65 78 74 28 4d 75 6c 74 69 43 75  rsorNext(MultiCu
16eb0 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69  rsor *pCsr){.  i
16ec0 66 28 20 28 70 43 73 72 2d 3e 66 6c 61 67 73 20  f( (pCsr->flags 
16ed0 26 20 43 55 52 53 4f 52 5f 4e 45 58 54 5f 4f 4b  & CURSOR_NEXT_OK
16ee0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 4c 53  )==0 ) return LS
16ef0 4d 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  M_MISUSE_BKPT;. 
16f00 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 43 75 72   return multiCur
16f10 73 6f 72 41 64 76 61 6e 63 65 28 70 43 73 72 2c  sorAdvance(pCsr,
16f20 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 4d   0);.}..int lsmM
16f30 43 75 72 73 6f 72 50 72 65 76 28 4d 75 6c 74 69  CursorPrev(Multi
16f40 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
16f50 20 69 66 28 20 28 70 43 73 72 2d 3e 66 6c 61 67   if( (pCsr->flag
16f60 73 20 26 20 43 55 52 53 4f 52 5f 50 52 45 56 5f  s & CURSOR_PREV_
16f70 4f 4b 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  OK)==0 ) return 
16f80 4c 53 4d 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  LSM_MISUSE_BKPT;
16f90 0a 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 43  .  return multiC
16fa0 75 72 73 6f 72 41 64 76 61 6e 63 65 28 70 43 73  ursorAdvance(pCs
16fb0 72 2c 20 31 29 3b 0a 7d 0a 0a 69 6e 74 20 6c 73  r, 1);.}..int ls
16fc0 6d 4d 43 75 72 73 6f 72 4b 65 79 28 4d 75 6c 74  mMCursorKey(Mult
16fd0 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 76  iCursor *pCsr, v
16fe0 6f 69 64 20 2a 2a 70 70 4b 65 79 2c 20 69 6e 74  oid **ppKey, int
16ff0 20 2a 70 6e 4b 65 79 29 7b 0a 20 20 69 66 28 20   *pnKey){.  if( 
17000 28 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 43  (pCsr->flags & C
17010 55 52 53 4f 52 5f 53 45 45 4b 5f 45 51 29 20 7c  URSOR_SEEK_EQ) |
17020 7c 20 70 43 73 72 2d 3e 61 54 72 65 65 3d 3d 30  | pCsr->aTree==0
17030 20 29 7b 0a 20 20 20 20 2a 70 6e 4b 65 79 20 3d   ){.    *pnKey =
17040 20 70 43 73 72 2d 3e 6b 65 79 2e 6e 44 61 74 61   pCsr->key.nData
17050 3b 0a 20 20 20 20 2a 70 70 4b 65 79 20 3d 20 70  ;.    *ppKey = p
17060 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74 61 3b 0a  Csr->key.pData;.
17070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
17080 20 69 4b 65 79 20 3d 20 70 43 73 72 2d 3e 61 54   iKey = pCsr->aT
17090 72 65 65 5b 31 5d 3b 0a 0a 20 20 20 20 69 66 28  ree[1];..    if(
170a0 20 69 4b 65 79 3d 3d 43 55 52 53 4f 52 5f 44 41   iKey==CURSOR_DA
170b0 54 41 5f 54 52 45 45 30 20 7c 7c 20 69 4b 65 79  TA_TREE0 || iKey
170c0 3d 3d 43 55 52 53 4f 52 5f 44 41 54 41 5f 54 52  ==CURSOR_DATA_TR
170d0 45 45 31 20 29 7b 0a 20 20 20 20 20 20 54 72 65  EE1 ){.      Tre
170e0 65 43 75 72 73 6f 72 20 2a 70 54 72 65 65 43 73  eCursor *pTreeCs
170f0 72 20 3d 20 70 43 73 72 2d 3e 61 70 54 72 65 65  r = pCsr->apTree
17100 43 73 72 5b 69 4b 65 79 2d 43 55 52 53 4f 52 5f  Csr[iKey-CURSOR_
17110 44 41 54 41 5f 54 52 45 45 30 5d 3b 0a 20 20 20  DATA_TREE0];.   
17120 20 20 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72     lsmTreeCursor
17130 4b 65 79 28 70 54 72 65 65 43 73 72 2c 20 30 2c  Key(pTreeCsr, 0,
17140 20 70 70 4b 65 79 2c 20 70 6e 4b 65 79 29 3b 0a   ppKey, pnKey);.
17150 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17160 20 69 6e 74 20 6e 4b 65 79 3b 0a 0a 23 69 66 6e   int nKey;..#ifn
17170 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20  def NDEBUG.     
17180 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20   void *pKey;.   
17190 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20     int eType;.  
171a0 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f 72 47      multiCursorG
171b0 65 74 4b 65 79 28 70 43 73 72 2c 20 69 4b 65 79  etKey(pCsr, iKey
171c0 2c 20 26 65 54 79 70 65 2c 20 26 70 4b 65 79 2c  , &eType, &pKey,
171d0 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 61   &nKey);.      a
171e0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 70 43  ssert( eType==pC
171f0 73 72 2d 3e 65 54 79 70 65 20 29 3b 0a 20 20 20  sr->eType );.   
17200 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
17210 3d 70 43 73 72 2d 3e 6b 65 79 2e 6e 44 61 74 61  =pCsr->key.nData
17220 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17230 28 20 6d 65 6d 63 6d 70 28 70 4b 65 79 2c 20 70  ( memcmp(pKey, p
17240 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74 61 2c 20  Csr->key.pData, 
17250 6e 4b 65 79 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  nKey)==0 );.#end
17260 69 66 0a 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d  if..      nKey =
17270 20 70 43 73 72 2d 3e 6b 65 79 2e 6e 44 61 74 61   pCsr->key.nData
17280 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4b 65 79  ;.      if( nKey
17290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
172a0 70 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 20  ppKey = 0;.     
172b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
172c0 2a 70 70 4b 65 79 20 3d 20 70 43 73 72 2d 3e 6b  *ppKey = pCsr->k
172d0 65 79 2e 70 44 61 74 61 3b 0a 20 20 20 20 20 20  ey.pData;.      
172e0 7d 0a 20 20 20 20 20 20 2a 70 6e 4b 65 79 20 3d  }.      *pnKey =
172f0 20 6e 4b 65 79 3b 20 0a 20 20 20 20 7d 0a 20 20   nKey; .    }.  
17300 7d 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f  }.  return LSM_O
17310 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  K;.}../*.** Comp
17320 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  are the current 
17330 6b 65 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  key that cursor 
17340 63 73 72 20 70 6f 69 6e 74 73 20 74 6f 20 77 69  csr points to wi
17350 74 68 20 70 4b 65 79 2f 6e 4b 65 79 2e 20 53 65  th pKey/nKey. Se
17360 74 0a 2a 2a 20 2a 70 69 52 65 73 20 74 6f 20 74  t.** *piRes to t
17370 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 72 65  he result and re
17380 74 75 72 6e 20 4c 53 4d 5f 4f 4b 2e 0a 2a 2f 0a  turn LSM_OK..*/.
17390 69 6e 74 20 6c 73 6d 5f 63 73 72 5f 63 6d 70 28  int lsm_csr_cmp(
173a0 6c 73 6d 5f 63 75 72 73 6f 72 20 2a 63 73 72 2c  lsm_cursor *csr,
173b0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
173c0 79 2c 20 69 6e 74 20 6e 4b 65 79 2c 20 69 6e 74  y, int nKey, int
173d0 20 2a 70 69 52 65 73 29 7b 0a 20 20 4d 75 6c 74   *piRes){.  Mult
173e0 69 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  iCursor *pCsr = 
173f0 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 29 63  (MultiCursor *)c
17400 73 72 3b 0a 20 20 76 6f 69 64 20 2a 70 43 73 72  sr;.  void *pCsr
17410 6b 65 79 3b 20 69 6e 74 20 6e 43 73 72 6b 65 79  key; int nCsrkey
17420 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  ;.  int rc;.  rc
17430 20 3d 20 6c 73 6d 4d 43 75 72 73 6f 72 4b 65 79   = lsmMCursorKey
17440 28 70 43 73 72 2c 20 26 70 43 73 72 6b 65 79 2c  (pCsr, &pCsrkey,
17450 20 26 6e 43 73 72 6b 65 79 29 3b 0a 20 20 69 66   &nCsrkey);.  if
17460 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
17470 20 20 20 20 69 6e 74 20 28 2a 78 43 6d 70 29 28      int (*xCmp)(
17480 76 6f 69 64 20 2a 2c 20 69 6e 74 2c 20 76 6f 69  void *, int, voi
17490 64 20 2a 2c 20 69 6e 74 29 20 3d 20 70 43 73 72  d *, int) = pCsr
174a0 2d 3e 70 44 62 2d 3e 78 43 6d 70 3b 0a 20 20 20  ->pDb->xCmp;.   
174b0 20 2a 70 69 52 65 73 20 3d 20 73 6f 72 74 65 64   *piRes = sorted
174c0 4b 65 79 43 6f 6d 70 61 72 65 28 78 43 6d 70 2c  KeyCompare(xCmp,
174d0 20 30 2c 20 70 43 73 72 6b 65 79 2c 20 6e 43 73   0, pCsrkey, nCs
174e0 72 6b 65 79 2c 20 30 2c 20 28 76 6f 69 64 20 2a  rkey, 0, (void *
174f0 29 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20  )pKey, nKey);.  
17500 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17510 0a 0a 69 6e 74 20 6c 73 6d 4d 43 75 72 73 6f 72  ..int lsmMCursor
17520 56 61 6c 75 65 28 4d 75 6c 74 69 43 75 72 73 6f  Value(MultiCurso
17530 72 20 2a 70 43 73 72 2c 20 76 6f 69 64 20 2a 2a  r *pCsr, void **
17540 70 70 56 61 6c 2c 20 69 6e 74 20 2a 70 6e 56 61  ppVal, int *pnVa
17550 6c 29 7b 0a 20 20 76 6f 69 64 20 2a 70 56 61 6c  l){.  void *pVal
17560 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 3b 0a 20 20  ;.  int nVal;.  
17570 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 28 70  int rc;.  if( (p
17580 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 43 55 52  Csr->flags & CUR
17590 53 4f 52 5f 53 45 45 4b 5f 45 51 29 20 7c 7c 20  SOR_SEEK_EQ) || 
175a0 70 43 73 72 2d 3e 61 54 72 65 65 3d 3d 30 20 29  pCsr->aTree==0 )
175b0 7b 0a 20 20 20 20 72 63 20 3d 20 4c 53 4d 5f 4f  {.    rc = LSM_O
175c0 4b 3b 0a 20 20 20 20 6e 56 61 6c 20 3d 20 70 43  K;.    nVal = pC
175d0 73 72 2d 3e 76 61 6c 2e 6e 44 61 74 61 3b 0a 20  sr->val.nData;. 
175e0 20 20 20 70 56 61 6c 20 3d 20 70 43 73 72 2d 3e     pVal = pCsr->
175f0 76 61 6c 2e 70 44 61 74 61 3b 0a 20 20 7d 65 6c  val.pData;.  }el
17600 73 65 7b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  se{..    assert(
17610 20 70 43 73 72 2d 3e 61 54 72 65 65 20 29 3b 0a   pCsr->aTree );.
17620 20 20 20 20 61 73 73 65 72 74 28 20 6d 63 75 72      assert( mcur
17630 73 6f 72 4c 6f 63 61 74 69 6f 6e 4f 6b 28 70 43  sorLocationOk(pC
17640 73 72 2c 20 28 70 43 73 72 2d 3e 66 6c 61 67 73  sr, (pCsr->flags
17650 20 26 20 43 55 52 53 4f 52 5f 49 47 4e 4f 52 45   & CURSOR_IGNORE
17660 5f 44 45 4c 45 54 45 29 29 20 29 3b 0a 0a 20 20  _DELETE)) );..  
17670 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72 73    rc = multiCurs
17680 6f 72 47 65 74 56 61 6c 28 70 43 73 72 2c 20 70  orGetVal(pCsr, p
17690 43 73 72 2d 3e 61 54 72 65 65 5b 31 5d 2c 20 26  Csr->aTree[1], &
176a0 70 56 61 6c 2c 20 26 6e 56 61 6c 29 3b 0a 20 20  pVal, &nVal);.  
176b0 20 20 69 66 28 20 70 56 61 6c 20 26 26 20 72 63    if( pVal && rc
176c0 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
176d0 20 20 72 63 20 3d 20 73 6f 72 74 65 64 42 6c 6f    rc = sortedBlo
176e0 62 53 65 74 28 70 43 73 72 2d 3e 70 44 62 2d 3e  bSet(pCsr->pDb->
176f0 70 45 6e 76 2c 20 26 70 43 73 72 2d 3e 76 61 6c  pEnv, &pCsr->val
17700 2c 20 70 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20  , pVal, nVal);. 
17710 20 20 20 20 20 70 56 61 6c 20 3d 20 70 43 73 72       pVal = pCsr
17720 2d 3e 76 61 6c 2e 70 44 61 74 61 3b 0a 20 20 20  ->val.pData;.   
17730 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d   }..    if( rc!=
17740 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  LSM_OK ){.      
17750 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  pVal = 0;.      
17760 6e 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nVal = 0;.    }.
17770 20 20 7d 0a 20 20 2a 70 70 56 61 6c 20 3d 20 70    }.  *ppVal = p
17780 56 61 6c 3b 0a 20 20 2a 70 6e 56 61 6c 20 3d 20  Val;.  *pnVal = 
17790 6e 56 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 72  nVal;.  return r
177a0 63 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 4d 43 75  c;.}..int lsmMCu
177b0 72 73 6f 72 54 79 70 65 28 4d 75 6c 74 69 43 75  rsorType(MultiCu
177c0 72 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20  rsor *pCsr, int 
177d0 2a 70 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65  *peType){.  asse
177e0 72 74 28 20 70 43 73 72 2d 3e 61 54 72 65 65 20  rt( pCsr->aTree 
177f0 29 3b 0a 20 20 6d 75 6c 74 69 43 75 72 73 6f 72  );.  multiCursor
17800 47 65 74 4b 65 79 28 70 43 73 72 2c 20 70 43 73  GetKey(pCsr, pCs
17810 72 2d 3e 61 54 72 65 65 5b 31 5d 2c 20 70 65 54  r->aTree[1], peT
17820 79 70 65 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  ype, 0, 0);.  re
17830 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a  turn LSM_OK;.}..
17840 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 44 61  /*.** Buffer aDa
17850 74 61 5b 5d 2c 20 73 69 7a 65 20 6e 44 61 74 61  ta[], size nData
17860 2c 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  , is assumed to 
17870 63 6f 6e 74 61 69 6e 20 61 20 76 61 6c 69 64 20  contain a valid 
17880 62 2d 74 72 65 65 20 0a 2a 2a 20 68 69 65 72 61  b-tree .** hiera
17890 72 63 68 79 20 70 61 67 65 20 69 6d 61 67 65 2e  rchy page image.
178a0 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
178b0 65 74 20 69 6e 20 61 44 61 74 61 5b 5d 20 6f 66  et in aData[] of
178c0 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 0a 2a   the next free.*
178d0 2a 20 62 79 74 65 20 69 6e 20 74 68 65 20 64 61  * byte in the da
178e0 74 61 20 61 72 65 61 20 28 77 68 65 72 65 20 61  ta area (where a
178f0 20 6e 65 77 20 63 65 6c 6c 20 6d 61 79 20 62 65   new cell may be
17900 20 77 72 69 74 74 65 6e 20 69 66 20 74 68 65 72   written if ther
17910 65 20 69 73 0a 2a 2a 20 73 70 61 63 65 29 2e 0a  e is.** space)..
17920 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  */.static int me
17930 72 67 65 57 6f 72 6b 65 72 50 61 67 65 4f 66 66  rgeWorkerPageOff
17940 73 65 74 28 75 38 20 2a 61 44 61 74 61 2c 20 69  set(u8 *aData, i
17950 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 69 6e 74  nt nData){.  int
17960 20 6e 52 65 63 3b 0a 20 20 69 6e 74 20 69 4f 66   nRec;.  int iOf
17970 66 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  f;.  int nKey;. 
17980 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20 20 6e   int eType;..  n
17990 52 65 63 20 3d 20 6c 73 6d 47 65 74 55 31 36 28  Rec = lsmGetU16(
179a0 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54 5f 4e  &aData[SEGMENT_N
179b0 52 45 43 4f 52 44 5f 4f 46 46 53 45 54 28 6e 44  RECORD_OFFSET(nD
179c0 61 74 61 29 5d 29 3b 0a 20 20 69 4f 66 66 20 3d  ata)]);.  iOff =
179d0 20 6c 73 6d 47 65 74 55 31 36 28 26 61 44 61 74   lsmGetU16(&aDat
179e0 61 5b 53 45 47 4d 45 4e 54 5f 43 45 4c 4c 50 54  a[SEGMENT_CELLPT
179f0 52 5f 4f 46 46 53 45 54 28 6e 44 61 74 61 2c 20  R_OFFSET(nData, 
17a00 6e 52 65 63 2d 31 29 5d 29 3b 0a 20 20 65 54 79  nRec-1)]);.  eTy
17a10 70 65 20 3d 20 61 44 61 74 61 5b 69 4f 66 66 2b  pe = aData[iOff+
17a20 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 65 54  +];.  assert( eT
17a30 79 70 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c  ype==0 .       |
17a40 7c 20 65 54 79 70 65 3d 3d 28 4c 53 4d 5f 53 59  | eType==(LSM_SY
17a50 53 54 45 4d 4b 45 59 7c 4c 53 4d 5f 53 45 50 41  STEMKEY|LSM_SEPA
17a60 52 41 54 4f 52 29 20 0a 20 20 20 20 20 20 20 7c  RATOR) .       |
17a70 7c 20 65 54 79 70 65 3d 3d 28 4c 53 4d 5f 53 45  | eType==(LSM_SE
17a80 50 41 52 41 54 4f 52 29 0a 20 20 29 3b 0a 0a 20  PARATOR).  );.. 
17a90 20 69 4f 66 66 20 2b 3d 20 6c 73 6d 56 61 72 69   iOff += lsmVari
17aa0 6e 74 47 65 74 33 32 28 26 61 44 61 74 61 5b 69  ntGet32(&aData[i
17ab0 4f 66 66 5d 2c 20 26 6e 4b 65 79 29 3b 0a 20 20  Off], &nKey);.  
17ac0 69 4f 66 66 20 2b 3d 20 6c 73 6d 56 61 72 69 6e  iOff += lsmVarin
17ad0 74 47 65 74 33 32 28 26 61 44 61 74 61 5b 69 4f  tGet32(&aData[iO
17ae0 66 66 5d 2c 20 26 6e 4b 65 79 29 3b 0a 0a 20 20  ff], &nKey);..  
17af0 72 65 74 75 72 6e 20 69 4f 66 66 20 2b 20 28 65  return iOff + (e
17b00 54 79 70 65 20 3f 20 6e 4b 65 79 20 3a 20 30 29  Type ? nKey : 0)
17b10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 6c 6c 6f  ;.}../*.** Follo
17b20 77 69 6e 67 20 61 20 63 68 65 63 6b 70 6f 69 6e  wing a checkpoin
17b30 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 64 61 74  t operation, dat
17b40 61 62 61 73 65 20 70 61 67 65 73 20 74 68 61 74  abase pages that
17b50 20 61 72 65 20 70 61 72 74 20 6f 66 20 74 68 65   are part of the
17b60 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
17b70 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 4c 53   state of the LS
17b80 4d 20 61 72 65 20 64 65 65 6d 65 64 20 72 65 61  M are deemed rea
17b90 64 2d 6f 6e 6c 79 2e 20 54 68 69 73 20 69 6e 63  d-only. This inc
17ba0 6c 75 64 65 73 20 74 68 65 0a 2a 2a 20 72 69 67  ludes the.** rig
17bb0 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 6f 66 20  ht-most page of 
17bc0 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
17bd0 72 63 68 79 20 6f 66 20 61 6e 79 20 73 65 70 61  rchy of any sepa
17be0 72 61 74 6f 72 73 20 61 72 72 61 79 20 75 6e 64  rators array und
17bf0 65 72 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69  er.** constructi
17c00 6f 6e 2c 20 61 6e 64 20 61 6c 6c 20 70 61 67 65  on, and all page
17c10 73 20 62 65 74 77 65 65 6e 20 69 74 20 61 6e 64  s between it and
17c20 20 74 68 65 20 62 2d 74 72 65 65 20 72 6f 6f 74   the b-tree root
17c30 2c 20 69 6e 63 6c 75 73 69 76 65 2e 0a 2a 2a 20  , inclusive..** 
17c40 54 68 69 73 20 69 73 20 61 20 70 72 6f 62 6c 65  This is a proble
17c50 6d 2c 20 61 73 20 77 68 65 6e 20 66 75 72 74 68  m, as when furth
17c60 65 72 20 70 61 67 65 73 20 61 72 65 20 61 70 70  er pages are app
17c70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73 65 70  ended to the sep
17c80 61 72 61 74 6f 72 73 0a 2a 2a 20 61 72 72 61 79  arators.** array
17c90 2c 20 65 6e 74 72 69 65 73 20 6d 75 73 74 20 62  , entries must b
17ca0 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
17cb0 6e 64 69 63 61 74 65 64 20 62 2d 74 72 65 65 20  ndicated b-tree 
17cc0 68 69 65 72 61 72 63 68 79 20 70 61 67 65 73 2e  hierarchy pages.
17cd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
17ce0 74 69 6f 6e 20 63 6f 70 69 65 73 20 61 6c 6c 20  tion copies all 
17cf0 73 75 63 68 20 62 2d 74 72 65 65 20 70 61 67 65  such b-tree page
17d00 73 20 74 6f 20 6e 65 77 20 6c 6f 63 61 74 69 6f  s to new locatio
17d10 6e 73 2c 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ns, so that.** t
17d20 68 65 79 20 63 61 6e 20 62 65 20 6d 6f 64 69 66  hey can be modif
17d30 69 65 64 20 61 73 20 72 65 71 75 69 72 65 64 2e  ied as required.
17d40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d 70 6c  .**.** The compl
17d50 69 63 61 74 69 6f 6e 20 69 73 20 74 68 61 74 20  ication is that 
17d60 6e 6f 74 20 61 6c 6c 20 64 61 74 61 62 61 73 65  not all database
17d70 20 70 61 67 65 73 20 61 72 65 20 74 68 65 20 73   pages are the s
17d80 61 6d 65 20 73 69 7a 65 20 2d 20 64 75 65 0a 2a  ame size - due.*
17d90 2a 20 74 6f 20 74 68 65 20 77 61 79 20 74 68 65  * to the way the
17da0 20 66 69 6c 65 2e 63 20 6d 6f 64 75 6c 65 20 77   file.c module w
17db0 6f 72 6b 73 20 73 6f 6d 65 20 28 74 68 65 20 66  orks some (the f
17dc0 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 69 6e  irst and last in
17dd0 20 65 61 63 68 20 62 6c 6f 63 6b 29 0a 2a 2a 20   each block).** 
17de0 61 72 65 20 34 20 62 79 74 65 73 20 73 6d 61 6c  are 4 bytes smal
17df0 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 74 68  ler than the oth
17e00 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
17e10 6e 74 20 6d 65 72 67 65 57 6f 72 6b 65 72 4d 6f  nt mergeWorkerMo
17e20 76 65 48 69 65 72 61 72 63 68 79 28 0a 20 20 4d  veHierarchy(.  M
17e30 65 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57 2c  ergeWorker *pMW,
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17e50 2a 20 4d 65 72 67 65 20 77 6f 72 6b 65 72 20 2a  * Merge worker *
17e60 2f 0a 20 20 69 6e 74 20 62 53 65 70 20 20 20 20  /.  int bSep    
17e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e80 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
17e90 73 65 70 61 72 61 74 6f 72 73 20 72 75 6e 20 2a  separators run *
17ea0 2f 0a 29 7b 0a 20 20 6c 73 6d 5f 64 62 20 2a 70  /.){.  lsm_db *p
17eb0 44 62 20 3d 20 70 4d 57 2d 3e 70 44 62 3b 20 20  Db = pMW->pDb;  
17ec0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
17ed0 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  se handle */.  i
17ee0 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20  nt rc = LSM_OK; 
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17f00 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
17f10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 50 61 67 65  .  int i;.  Page
17f20 20 2a 2a 61 70 48 69 65 72 20 3d 20 70 4d 57 2d   **apHier = pMW-
17f30 3e 68 69 65 72 2e 61 70 48 69 65 72 3b 0a 20 20  >hier.apHier;.  
17f40 69 6e 74 20 6e 48 69 65 72 20 3d 20 70 4d 57 2d  int nHier = pMW-
17f50 3e 68 69 65 72 2e 6e 48 69 65 72 3b 0a 0a 20 20  >hier.nHier;..  
17f60 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 4c 53 4d  for(i=0; rc==LSM
17f70 5f 4f 4b 20 26 26 20 69 3c 6e 48 69 65 72 3b 20  _OK && i<nHier; 
17f80 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 20 2a  i++){.    Page *
17f90 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 72 63  pNew = 0;.    rc
17fa0 20 3d 20 6c 73 6d 46 73 53 6f 72 74 65 64 41 70   = lsmFsSortedAp
17fb0 70 65 6e 64 28 70 44 62 2d 3e 70 46 53 2c 20 70  pend(pDb->pFS, p
17fc0 44 62 2d 3e 70 57 6f 72 6b 65 72 2c 20 70 4d 57  Db->pWorker, pMW
17fd0 2d 3e 70 4c 65 76 65 6c 2c 20 31 2c 20 26 70 4e  ->pLevel, 1, &pN
17fe0 65 77 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ew);.    assert(
17ff0 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 3b 0a 0a   rc==LSM_OK );..
18000 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f      if( rc==LSM_
18010 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  OK ){.      u8 *
18020 61 31 3b 20 69 6e 74 20 6e 31 3b 0a 20 20 20 20  a1; int n1;.    
18030 20 20 75 38 20 2a 61 32 3b 20 69 6e 74 20 6e 32    u8 *a2; int n2
18040 3b 0a 0a 20 20 20 20 20 20 61 31 20 3d 20 66 73  ;..      a1 = fs
18050 50 61 67 65 44 61 74 61 28 70 4e 65 77 2c 20 26  PageData(pNew, &
18060 6e 31 29 3b 0a 20 20 20 20 20 20 61 32 20 3d 20  n1);.      a2 = 
18070 66 73 50 61 67 65 44 61 74 61 28 61 70 48 69 65  fsPageData(apHie
18080 72 5b 69 5d 2c 20 26 6e 32 29 3b 0a 0a 20 20 20  r[i], &n2);..   
18090 20 20 20 61 73 73 65 72 74 28 20 6e 31 3d 3d 6e     assert( n1==n
180a0 32 20 7c 7c 20 6e 31 2b 34 3d 3d 6e 32 20 29 3b  2 || n1+4==n2 );
180b0 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 31 3d 3d  ..      if( n1==
180c0 6e 32 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  n2 ){.        me
180d0 6d 63 70 79 28 61 31 2c 20 61 32 2c 20 6e 32 29  mcpy(a1, a2, n2)
180e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
180f0 20 20 20 20 20 20 20 69 6e 74 20 6e 45 6e 74 72         int nEntr
18100 79 20 3d 20 70 61 67 65 47 65 74 4e 52 65 63 28  y = pageGetNRec(
18110 61 32 2c 20 6e 32 29 3b 0a 20 20 20 20 20 20 20  a2, n2);.       
18120 20 69 6e 74 20 69 45 6f 66 31 20 3d 20 53 45 47   int iEof1 = SEG
18130 4d 45 4e 54 5f 45 4f 46 28 6e 31 2c 20 6e 45 6e  MENT_EOF(n1, nEn
18140 74 72 79 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  try);.        in
18150 74 20 69 45 6f 66 32 20 3d 20 53 45 47 4d 45 4e  t iEof2 = SEGMEN
18160 54 5f 45 4f 46 28 6e 32 2c 20 6e 45 6e 74 72 79  T_EOF(n2, nEntry
18170 29 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  );..        memc
18180 70 79 28 61 31 2c 20 61 32 2c 20 69 45 6f 66 32  py(a1, a2, iEof2
18190 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6d   - 4);.        m
181a0 65 6d 63 70 79 28 26 61 31 5b 69 45 6f 66 31 5d  emcpy(&a1[iEof1]
181b0 2c 20 26 61 32 5b 69 45 6f 66 32 5d 2c 20 6e 32  , &a2[iEof2], n2
181c0 20 2d 20 69 45 6f 66 32 29 3b 0a 20 20 20 20 20   - iEof2);.     
181d0 20 7d 0a 0a 20 20 20 20 20 20 6c 73 6d 46 73 50   }..      lsmFsP
181e0 61 67 65 52 65 6c 65 61 73 65 28 61 70 48 69 65  ageRelease(apHie
181f0 72 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 70 48  r[i]);.      apH
18200 69 65 72 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 0a  ier[i] = pNew;..
18210 23 69 66 20 30 0a 20 20 20 20 20 20 61 73 73 65  #if 0.      asse
18220 72 74 28 20 6e 31 3d 3d 6e 32 20 7c 7c 20 6e 31  rt( n1==n2 || n1
18230 2b 34 3d 3d 6e 32 20 7c 7c 20 6e 32 2b 34 3d 3d  +4==n2 || n2+4==
18240 6e 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n1 );.      if( 
18250 6e 31 3e 3d 6e 32 20 29 7b 0a 20 20 20 20 20 20  n1>=n2 ){.      
18260 20 20 2f 2a 20 49 66 20 6e 31 20 28 73 69 7a 65    /* If n1 (size
18270 20 6f 66 20 74 68 65 20 6e 65 77 20 70 61 67 65   of the new page
18280 29 20 69 73 20 65 71 75 61 6c 20 74 6f 20 6f 72  ) is equal to or
18290 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 32   greater than n2
182a0 20 28 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a   (the.        **
182b0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 6c 64   size of the old
182c0 20 70 61 67 65 29 2c 20 74 68 65 6e 20 63 6f 70   page), then cop
182d0 79 20 74 68 65 20 64 61 74 61 20 69 6e 74 6f 20  y the data into 
182e0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 49 66  the new page. If
182f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 31 3d 3d  .        ** n1==
18300 6e 32 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62  n2, this could b
18310 65 20 64 6f 6e 65 20 77 69 74 68 20 61 20 73 69  e done with a si
18320 6e 67 6c 65 20 6d 65 6d 63 70 79 28 29 2e 20 48  ngle memcpy(). H
18330 6f 77 65 76 65 72 2c 20 0a 20 20 20 20 20 20 20  owever, .       
18340 20 2a 2a 20 73 69 6e 63 65 20 73 6f 6d 65 74 69   ** since someti
18350 6d 65 73 20 6e 31 3e 6e 32 2c 20 74 68 65 20 70  mes n1>n2, the p
18360 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  age content and 
18370 66 6f 6f 74 65 72 20 6d 75 73 74 20 62 65 20 63  footer must be c
18380 6f 70 69 65 64 20 0a 20 20 20 20 20 20 20 20 2a  opied .        *
18390 2a 20 73 65 70 61 72 61 74 65 6c 79 2e 20 2a 2f  * separately. */
183a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45 6e  .        int nEn
183b0 74 72 79 20 3d 20 70 61 67 65 47 65 74 4e 52 65  try = pageGetNRe
183c0 63 28 61 32 2c 20 6e 32 29 3b 0a 20 20 20 20 20  c(a2, n2);.     
183d0 20 20 20 69 6e 74 20 69 45 6f 66 31 20 3d 20 53     int iEof1 = S
183e0 45 47 4d 45 4e 54 5f 45 4f 46 28 6e 31 2c 20 6e  EGMENT_EOF(n1, n
183f0 45 6e 74 72 79 29 3b 0a 20 20 20 20 20 20 20 20  Entry);.        
18400 69 6e 74 20 69 45 6f 66 32 20 3d 20 53 45 47 4d  int iEof2 = SEGM
18410 45 4e 54 5f 45 4f 46 28 6e 32 2c 20 6e 45 6e 74  ENT_EOF(n2, nEnt
18420 72 79 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ry);.        mem
18430 63 70 79 28 61 31 2c 20 61 32 2c 20 69 45 6f 66  cpy(a1, a2, iEof
18440 32 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  2);.        memc
18450 70 79 28 26 61 31 5b 69 45 6f 66 31 5d 2c 20 26  py(&a1[iEof1], &
18460 61 32 5b 69 45 6f 66 32 5d 2c 20 6e 32 20 2d 20  a2[iEof2], n2 - 
18470 69 45 6f 66 32 29 3b 0a 20 20 20 20 20 20 20 20  iEof2);.        
18480 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65  lsmFsPageRelease
18490 28 61 70 48 69 65 72 5b 69 5d 29 3b 0a 20 20 20  (apHier[i]);.   
184a0 20 20 20 20 20 61 70 48 69 65 72 5b 69 5d 20 3d       apHier[i] =
184b0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 65 6c   pNew;.      }el
184c0 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 73 6d 50  se{.        lsmP
184d0 75 74 55 31 36 28 26 61 31 5b 53 45 47 4d 45 4e  utU16(&a1[SEGMEN
184e0 54 5f 46 4c 41 47 53 5f 4f 46 46 53 45 54 28 6e  T_FLAGS_OFFSET(n
184f0 31 29 5d 2c 20 53 45 47 4d 45 4e 54 5f 42 54 52  1)], SEGMENT_BTR
18500 45 45 5f 46 4c 41 47 29 3b 0a 20 20 20 20 20 20  EE_FLAG);.      
18510 20 20 6c 73 6d 50 75 74 55 31 36 28 26 61 31 5b    lsmPutU16(&a1[
18520 53 45 47 4d 45 4e 54 5f 4e 52 45 43 4f 52 44 5f  SEGMENT_NRECORD_
18530 4f 46 46 53 45 54 28 6e 31 29 5d 2c 20 30 29 3b  OFFSET(n1)], 0);
18540 0a 20 20 20 20 20 20 20 20 6c 73 6d 50 75 74 55  .        lsmPutU
18550 36 34 28 26 61 31 5b 53 45 47 4d 45 4e 54 5f 50  64(&a1[SEGMENT_P
18560 4f 49 4e 54 45 52 5f 4f 46 46 53 45 54 28 6e 31  OINTER_OFFSET(n1
18570 29 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  )], 0);.        
18580 69 20 3d 20 69 20 2d 20 31 3b 0a 20 20 20 20 20  i = i - 1;.     
18590 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65     lsmFsPageRele
185a0 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ase(pNew);.     
185b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
185c0 20 20 7d 0a 0a 23 69 66 64 65 66 20 4c 53 4d 5f    }..#ifdef LSM_
185d0 44 45 42 55 47 0a 20 20 69 66 28 20 72 63 3d 3d  DEBUG.  if( rc==
185e0 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f  LSM_OK ){.    fo
185f0 72 28 69 3d 30 3b 20 69 3c 6e 48 69 65 72 3b 20  r(i=0; i<nHier; 
18600 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6c 73 6d  i++) assert( lsm
18610 46 73 50 61 67 65 57 72 69 74 61 62 6c 65 28 61  FsPageWritable(a
18620 70 48 69 65 72 5b 69 5d 29 20 29 3b 0a 20 20 7d  pHier[i]) );.  }
18630 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
18640 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
18650 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75  llocate and popu
18660 6c 61 74 65 20 74 68 65 20 4d 65 72 67 65 57 6f  late the MergeWo
18670 72 6b 65 72 2e 61 70 48 69 65 72 5b 5d 20 61 72  rker.apHier[] ar
18680 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
18690 6e 74 20 6d 65 72 67 65 57 6f 72 6b 65 72 4c 6f  nt mergeWorkerLo
186a0 61 64 48 69 65 72 61 72 63 68 79 28 4d 65 72 67  adHierarchy(Merg
186b0 65 57 6f 72 6b 65 72 20 2a 70 4d 57 29 7b 0a 20  eWorker *pMW){. 
186c0 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b   int rc = LSM_OK
186d0 3b 0a 20 20 53 65 67 6d 65 6e 74 20 2a 70 53 65  ;.  Segment *pSe
186e0 67 3b 0a 20 20 48 69 65 72 61 72 63 68 79 20 2a  g;.  Hierarchy *
186f0 70 3b 0a 20 0a 20 20 70 53 65 67 20 3d 20 26 70  p;. .  pSeg = &p
18700 4d 57 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68 73 3b  MW->pLevel->lhs;
18710 0a 20 20 70 20 3d 20 26 70 4d 57 2d 3e 68 69 65  .  p = &pMW->hie
18720 72 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 48  r;..  if( p->apH
18730 69 65 72 3d 3d 30 20 26 26 20 70 53 65 67 2d 3e  ier==0 && pSeg->
18740 69 52 6f 6f 74 21 3d 30 20 29 7b 0a 20 20 20 20  iRoot!=0 ){.    
18750 46 69 6c 65 53 79 73 74 65 6d 20 2a 70 46 53 20  FileSystem *pFS 
18760 3d 20 70 4d 57 2d 3e 70 44 62 2d 3e 70 46 53 3b  = pMW->pDb->pFS;
18770 0a 20 20 20 20 6c 73 6d 5f 65 6e 76 20 2a 70 45  .    lsm_env *pE
18780 6e 76 20 3d 20 70 4d 57 2d 3e 70 44 62 2d 3e 70  nv = pMW->pDb->p
18790 45 6e 76 3b 0a 20 20 20 20 50 61 67 65 20 2a 2a  Env;.    Page **
187a0 61 70 48 69 65 72 20 3d 20 30 3b 0a 20 20 20 20  apHier = 0;.    
187b0 69 6e 74 20 6e 48 69 65 72 20 3d 20 30 3b 0a 20  int nHier = 0;. 
187c0 20 20 20 69 6e 74 20 69 50 67 20 3d 20 28 69 6e     int iPg = (in
187d0 74 29 70 53 65 67 2d 3e 69 52 6f 6f 74 3b 0a 0a  t)pSeg->iRoot;..
187e0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 50      do {.      P
187f0 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
18800 20 20 20 20 75 38 20 2a 61 44 61 74 61 3b 0a 20      u8 *aData;. 
18810 20 20 20 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a       int nData;.
18820 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b        int flags;
18830 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d  ..      rc = lsm
18840 46 73 44 62 50 61 67 65 47 65 74 28 70 46 53 2c  FsDbPageGet(pFS,
18850 20 70 53 65 67 2c 20 69 50 67 2c 20 26 70 50 67   pSeg, iPg, &pPg
18860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
18870 3d 4c 53 4d 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  =LSM_OK ) break;
18880 0a 0a 20 20 20 20 20 20 61 44 61 74 61 20 3d 20  ..      aData = 
18890 66 73 50 61 67 65 44 61 74 61 28 70 50 67 2c 20  fsPageData(pPg, 
188a0 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 66  &nData);.      f
188b0 6c 61 67 73 20 3d 20 70 61 67 65 47 65 74 46 6c  lags = pageGetFl
188c0 61 67 73 28 61 44 61 74 61 2c 20 6e 44 61 74 61  ags(aData, nData
188d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  );.      if( fla
188e0 67 73 26 53 45 47 4d 45 4e 54 5f 42 54 52 45 45  gs&SEGMENT_BTREE
188f0 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 20 20 20  _FLAG ){.       
18900 20 50 61 67 65 20 2a 2a 61 70 4e 65 77 20 3d 20   Page **apNew = 
18910 28 50 61 67 65 20 2a 2a 29 6c 73 6d 52 65 61 6c  (Page **)lsmReal
18920 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20  loc(.           
18930 20 70 45 6e 76 2c 20 61 70 48 69 65 72 2c 20 73   pEnv, apHier, s
18940 69 7a 65 6f 66 28 50 61 67 65 20 2a 29 2a 28 6e  izeof(Page *)*(n
18950 48 69 65 72 2b 31 29 0a 20 20 20 20 20 20 20 20  Hier+1).        
18960 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
18970 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
18980 20 20 20 20 20 72 63 20 3d 20 4c 53 4d 5f 4e 4f       rc = LSM_NO
18990 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
189a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
189b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 48     }.        apH
189c0 69 65 72 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20  ier = apNew;.   
189d0 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61 70       memmove(&ap
189e0 48 69 65 72 5b 31 5d 2c 20 26 61 70 48 69 65 72  Hier[1], &apHier
189f0 5b 30 5d 2c 20 73 69 7a 65 6f 66 28 50 61 67 65  [0], sizeof(Page
18a00 20 2a 29 20 2a 20 6e 48 69 65 72 29 3b 0a 20 20   *) * nHier);.  
18a10 20 20 20 20 20 20 6e 48 69 65 72 2b 2b 3b 0a 0a        nHier++;..
18a20 20 20 20 20 20 20 20 20 61 70 48 69 65 72 5b 30          apHier[0
18a30 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20  ] = pPg;.       
18a40 20 69 50 67 20 3d 20 28 69 6e 74 29 70 61 67 65   iPg = (int)page
18a50 47 65 74 50 74 72 28 61 44 61 74 61 2c 20 6e 44  GetPtr(aData, nD
18a60 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ata);.      }els
18a70 65 7b 0a 20 20 20 20 20 20 20 20 6c 73 6d 46 73  e{.        lsmFs
18a80 50 61 67 65 52 65 6c 65 61 73 65 28 70 50 67 29  PageRelease(pPg)
18a90 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
18ab0 69 6c 65 28 20 31 20 29 3b 0a 0a 20 20 20 20 69  ile( 1 );..    i
18ac0 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc==LSM_OK ){
18ad0 0a 20 20 20 20 20 20 75 38 20 2a 61 44 61 74 61  .      u8 *aData
18ae0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 61 74  ;.      int nDat
18af0 61 3b 0a 20 20 20 20 20 20 61 44 61 74 61 20 3d  a;.      aData =
18b00 20 66 73 50 61 67 65 44 61 74 61 28 61 70 48 69   fsPageData(apHi
18b10 65 72 5b 30 5d 2c 20 26 6e 44 61 74 61 29 3b 0a  er[0], &nData);.
18b20 20 20 20 20 20 20 70 4d 57 2d 3e 61 53 61 76 65        pMW->aSave
18b30 5b 30 5d 2e 69 50 67 6e 6f 20 3d 20 70 61 67 65  [0].iPgno = page
18b40 47 65 74 50 74 72 28 61 44 61 74 61 2c 20 6e 44  GetPtr(aData, nD
18b50 61 74 61 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ata);.      p->n
18b60 48 69 65 72 20 3d 20 6e 48 69 65 72 3b 0a 20 20  Hier = nHier;.  
18b70 20 20 20 20 70 2d 3e 61 70 48 69 65 72 20 3d 20      p->apHier = 
18b80 61 70 48 69 65 72 3b 0a 20 20 20 20 20 20 72 63  apHier;.      rc
18b90 20 3d 20 6d 65 72 67 65 57 6f 72 6b 65 72 4d 6f   = mergeWorkerMo
18ba0 76 65 48 69 65 72 61 72 63 68 79 28 70 4d 57 2c  veHierarchy(pMW,
18bb0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
18bc0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
18bd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 48     for(i=0; i<nH
18be0 69 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ier; i++){.     
18bf0 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65     lsmFsPageRele
18c00 61 73 65 28 61 70 48 69 65 72 5b 69 5d 29 3b 0a  ase(apHier[i]);.
18c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 73        }.      ls
18c20 6d 46 72 65 65 28 70 45 6e 76 2c 20 61 70 48 69  mFree(pEnv, apHi
18c30 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
18c40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18c50 2f 2a 0a 2a 2a 20 42 2d 74 72 65 65 20 70 61 67  /*.** B-tree pag
18c60 65 73 20 75 73 65 20 61 6c 6d 6f 73 74 20 74 68  es use almost th
18c70 65 20 73 61 6d 65 20 66 6f 72 6d 61 74 20 61 73  e same format as
18c80 20 72 65 67 75 6c 61 72 20 70 61 67 65 73 2e 20   regular pages. 
18c90 54 68 65 20 0a 2a 2a 20 64 69 66 66 65 72 65 6e  The .** differen
18ca0 63 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  ces are:.**.**  
18cb0 20 31 2e 20 54 68 65 20 72 65 63 6f 72 64 20 66   1. The record f
18cc0 6f 72 6d 61 74 20 69 73 20 28 75 73 75 61 6c 6c  ormat is (usuall
18cd0 79 2c 20 73 65 65 20 62 65 6c 6f 77 29 20 61 73  y, see below) as
18ce0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
18cf0 20 20 20 20 20 20 20 20 2b 20 54 79 70 65 20 62          + Type b
18d00 79 74 65 20 28 61 6c 77 61 79 73 20 53 4f 52 54  yte (always SORT
18d10 45 44 5f 53 45 50 41 52 41 54 4f 52 20 6f 72 20  ED_SEPARATOR or 
18d20 53 4f 52 54 45 44 5f 53 59 53 54 45 4d 5f 53 45  SORTED_SYSTEM_SE
18d30 50 41 52 41 54 4f 52 29 2c 0a 2a 2a 20 20 20 20  PARATOR),.**    
18d40 20 20 20 20 20 2b 20 41 62 73 6f 6c 75 74 65 20       + Absolute 
18d50 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 20 28 76  pointer value (v
18d60 61 72 69 6e 74 29 2c 0a 2a 2a 20 20 20 20 20 20  arint),.**      
18d70 20 20 20 2b 20 4e 75 6d 62 65 72 20 6f 66 20 62     + Number of b
18d80 79 74 65 73 20 69 6e 20 6b 65 79 20 28 76 61 72  ytes in key (var
18d90 69 6e 74 29 2c 0a 2a 2a 20 20 20 20 20 20 20 20  int),.**        
18da0 20 2b 20 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 69   + Blob containi
18db0 6e 67 20 6b 65 79 20 64 61 74 61 2e 0a 2a 2a 0a  ng key data..**.
18dc0 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 70 6f 69 6e  **   2. All poin
18dd0 74 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 73  ter values are s
18de0 74 6f 72 65 64 20 61 73 20 61 62 73 6f 6c 75 74  tored as absolut
18df0 65 20 76 61 6c 75 65 73 20 28 6e 6f 74 20 6f 66  e values (not of
18e00 66 73 65 74 73 20 0a 2a 2a 20 20 20 20 20 20 72  fsets .**      r
18e10 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 66  elative to the f
18e20 6f 6f 74 65 72 20 70 6f 69 6e 74 65 72 20 76 61  ooter pointer va
18e30 6c 75 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 2e  lue)..**.**   3.
18e40 20 45 61 63 68 20 70 6f 69 6e 74 65 72 20 74 68   Each pointer th
18e50 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  at is part of a 
18e60 72 65 63 6f 72 64 20 70 6f 69 6e 74 73 20 74 6f  record points to
18e70 20 61 20 70 61 67 65 20 74 68 61 74 20 0a 2a 2a   a page that .**
18e80 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73 20 6b        contains k
18e90 65 79 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  eys smaller than
18ea0 20 74 68 65 20 72 65 63 6f 72 64 73 20 6b 65 79   the records key
18eb0 20 28 6e 6f 74 65 3a 20 6e 6f 74 20 22 65 71 75   (note: not "equ
18ec0 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 20 20 20 20  al to or.**     
18ed0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d 20   smaller than - 
18ee0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 22 29 2e 0a  smaller than")..
18ef0 2a 2a 0a 2a 2a 20 20 20 34 2e 20 54 68 65 20 70  **.**   4. The p
18f00 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61  ointer in the pa
18f10 67 65 20 66 6f 6f 74 65 72 20 6f 66 20 61 20 62  ge footer of a b
18f20 2d 74 72 65 65 20 70 61 67 65 20 70 6f 69 6e 74  -tree page point
18f30 73 20 74 6f 20 61 20 70 61 67 65 0a 2a 2a 20 20  s to a page.**  
18f40 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e      that contain
18f50 73 20 6b 65 79 73 20 65 71 75 61 6c 20 74 6f 20  s keys equal to 
18f60 6f 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  or larger than t
18f70 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f  he largest key o
18f80 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 62 2d  n the.**      b-
18f90 74 72 65 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  tree page..**.**
18fa0 20 54 68 65 20 72 65 61 73 6f 6e 20 66 6f 72 20   The reason for 
18fb0 68 61 76 69 6e 67 20 74 68 65 20 70 61 67 65 20  having the page 
18fc0 66 6f 6f 74 65 72 20 70 6f 69 6e 74 65 72 20 70  footer pointer p
18fd0 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 69 67 68  oint to the righ
18fe0 74 2d 63 68 69 6c 64 0a 2a 2a 20 28 69 6e 73 74  t-child.** (inst
18ff0 65 61 64 20 6f 66 20 74 68 65 20 6c 65 66 74 29  ead of the left)
19000 20 69 73 20 74 68 61 74 20 64 6f 69 6e 67 20 74   is that doing t
19010 68 69 6e 67 73 20 74 68 69 73 20 77 61 79 20 6d  hings this way m
19020 61 6b 65 73 20 74 68 65 20 0a 2a 2a 20 6d 65 72  akes the .** mer
19030 67 65 57 6f 72 6b 65 72 4d 6f 76 65 48 69 65 72  geWorkerMoveHier
19040 61 72 63 68 79 28 29 20 6f 70 65 72 61 74 69 6f  archy() operatio
19050 6e 20 6c 65 73 73 20 63 6f 6d 70 6c 69 63 61 74  n less complicat
19060 65 64 20 28 73 69 6e 63 65 20 74 68 65 20 70 6f  ed (since the po
19070 69 6e 74 65 72 73 20 0a 2a 2a 20 74 68 61 74 20  inters .** that 
19080 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
19090 65 64 20 61 72 65 20 61 6c 6c 20 73 74 6f 72 65  ed are all store
190a0 64 20 61 73 20 66 69 78 65 64 2d 73 69 7a 65 20  d as fixed-size 
190b0 69 6e 74 65 67 65 72 73 20 77 69 74 68 69 6e 20  integers within 
190c0 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 66 6f 6f  the .** page foo
190d0 74 65 72 2c 20 6e 6f 74 20 76 61 72 69 6e 74 73  ter, not varints
190e0 20 69 6e 20 70 61 67 65 20 72 65 63 6f 72 64 73   in page records
190f0 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 63 6f 72 64 73  )..**.** Records
19100 20 6d 61 79 20 6e 6f 74 20 73 70 61 6e 20 62 2d   may not span b-
19110 74 72 65 65 20 70 61 67 65 73 2e 20 49 66 20 74  tree pages. If t
19120 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19130 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 61 0a  called to add a.
19140 2a 2a 20 72 65 63 6f 72 64 20 6c 61 72 67 65 72  ** record larger
19150 20 74 68 61 6e 20 28 70 61 67 65 2d 73 69 7a 65   than (page-size
19160 20 2f 20 34 29 20 62 79 74 65 73 2c 20 74 68 65   / 4) bytes, the
19170 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
19180 68 65 20 69 6e 64 65 78 65 64 0a 2a 2a 20 61 72  he indexed.** ar
19190 72 61 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ray page that co
191a0 6e 74 61 69 6e 73 20 74 68 65 20 6d 61 69 6e 20  ntains the main 
191b0 72 65 63 6f 72 64 20 69 73 20 61 64 64 65 64 20  record is added 
191c0 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 69 6e  to the b-tree in
191d0 73 74 65 61 64 2e 0a 2a 2a 20 49 6e 20 74 68 69  stead..** In thi
191e0 73 20 63 61 73 65 20 74 68 65 20 72 65 63 6f 72  s case the recor
191f0 64 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  d format is:.**.
19200 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 30 78 30  **         + 0x0
19210 30 20 62 79 74 65 20 28 31 20 62 79 74 65 29 20  0 byte (1 byte) 
19220 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 41 62  .**         + Ab
19230 73 6f 6c 75 74 65 20 70 6f 69 6e 74 65 72 20 76  solute pointer v
19240 61 6c 75 65 20 28 76 61 72 69 6e 74 29 2c 0a 2a  alue (varint),.*
19250 2a 20 20 20 20 20 20 20 20 20 2b 20 41 62 73 6f  *         + Abso
19260 6c 75 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  lute page number
19270 20 6f 66 20 70 61 67 65 20 63 6f 6e 74 61 69 6e   of page contain
19280 69 6e 67 20 6b 65 79 20 28 76 61 72 69 6e 74 29  ing key (varint)
19290 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 66 75 6e 63  ..**.** See func
192a0 74 69 6f 6e 20 73 65 65 6b 49 6e 42 74 72 65 65  tion seekInBtree
192b0 28 29 20 66 6f 72 20 74 68 65 20 63 6f 64 65 20  () for the code 
192c0 74 68 61 74 20 74 72 61 76 65 72 73 65 73 20 62  that traverses b
192d0 2d 74 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f 0a  -tree pages..*/.
192e0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 72 67  .static int merg
192f0 65 57 6f 72 6b 65 72 42 74 72 65 65 57 72 69 74  eWorkerBtreeWrit
19300 65 28 0a 20 20 4d 65 72 67 65 57 6f 72 6b 65 72  e(.  MergeWorker
19310 20 2a 70 4d 57 2c 0a 20 20 75 38 20 65 54 79 70   *pMW,.  u8 eTyp
19320 65 2c 0a 20 20 50 67 6e 6f 20 69 50 74 72 2c 0a  e,.  Pgno iPtr,.
19330 20 20 50 67 6e 6f 20 69 4b 65 79 50 67 2c 0a 20    Pgno iKeyPg,. 
19340 20 76 6f 69 64 20 2a 70 4b 65 79 2c 0a 20 20 69   void *pKey,.  i
19350 6e 74 20 6e 4b 65 79 0a 29 7b 0a 20 20 48 69 65  nt nKey.){.  Hie
19360 72 61 72 63 68 79 20 2a 70 20 3d 20 26 70 4d 57  rarchy *p = &pMW
19370 2d 3e 68 69 65 72 3b 0a 20 20 6c 73 6d 5f 64 62  ->hier;.  lsm_db
19380 20 2a 70 44 62 20 3d 20 70 4d 57 2d 3e 70 44 62   *pDb = pMW->pDb
19390 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
193a0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
193b0 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f    int rc = LSM_O
193c0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
193d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
193e0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
193f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19400 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f        /* Level o
19410 66 20 62 2d 74 72 65 65 20 68 69 65 72 61 63 68  f b-tree hierach
19420 79 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  y to write to */
19430 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 20 20 20  .  int nData;   
19440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19450 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 44     /* Size of aD
19460 61 74 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ata[] in bytes *
19470 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20  /.  u8 *aData;  
19480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19490 20 20 20 20 2f 2a 20 50 61 67 65 20 64 61 74 61      /* Page data
194a0 20 66 6f 72 20 6c 65 76 65 6c 20 69 4c 65 76 65   for level iLeve
194b0 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b  l */.  int iOff;
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194d0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
194e0 20 6f 6e 20 62 2d 74 72 65 65 20 70 61 67 65 20   on b-tree page 
194f0 74 6f 20 77 72 69 74 65 20 72 65 63 6f 72 64 20  to write record 
19500 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  to */.  int nRec
19510 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19520 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
19530 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  al number of rec
19540 6f 72 64 73 20 6f 6e 20 62 2d 74 72 65 65 20 70  ords on b-tree p
19550 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 69 4b 65  age */..  /* iKe
19560 79 50 67 20 73 68 6f 75 6c 64 20 62 65 20 7a 65  yPg should be ze
19570 72 6f 20 66 6f 72 20 61 6e 20 6f 72 64 69 6e 61  ro for an ordina
19580 72 79 20 62 2d 74 72 65 65 20 6b 65 79 2c 20 6f  ry b-tree key, o
19590 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61  r non-zero for a
195a0 6e 0a 20 20 2a 2a 20 69 6e 64 69 72 65 63 74 20  n.  ** indirect 
195b0 6b 65 79 2e 20 54 68 65 20 66 6c 61 67 73 20 62  key. The flags b
195c0 79 74 65 20 66 6f 72 20 61 6e 20 69 6e 64 69 72  yte for an indir
195d0 65 63 74 20 6b 65 79 20 69 73 20 30 78 30 30 2e  ect key is 0x00.
195e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
195f0 65 54 79 70 65 3d 3d 30 29 3d 3d 28 69 4b 65 79  eType==0)==(iKey
19600 50 67 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pg!=0) );..  /* 
19610 54 68 65 20 4d 65 72 67 65 57 6f 72 6b 65 72 2e  The MergeWorker.
19620 61 70 48 69 65 72 5b 5d 20 61 72 72 61 79 20 63  apHier[] array c
19630 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 69 67 68  ontains the righ
19640 74 2d 6d 6f 73 74 20 6c 65 61 66 20 6f 66 20 74  t-most leaf of t
19650 68 65 20 62 2d 74 72 65 65 0a 20 20 2a 2a 20 68  he b-tree.  ** h
19660 69 65 72 61 72 63 68 79 2c 20 74 68 65 20 72 6f  ierarchy, the ro
19670 6f 74 20 6e 6f 64 65 2c 20 61 6e 64 20 61 6c 6c  ot node, and all
19680 20 6e 6f 64 65 73 20 74 68 61 74 20 6c 69 65 20   nodes that lie 
19690 6f 6e 20 74 68 65 20 70 61 74 68 20 62 65 74 77  on the path betw
196a0 65 65 6e 2e 0a 20 20 2a 2a 20 61 70 48 69 65 72  een..  ** apHier
196b0 5b 30 5d 20 69 73 20 74 68 65 20 72 69 67 68 74  [0] is the right
196c0 2d 6d 6f 73 74 20 6c 65 61 66 20 61 6e 64 20 61  -most leaf and a
196d0 70 48 69 65 72 5b 70 4d 57 2d 3e 6e 48 69 65 72  pHier[pMW->nHier
196e0 2d 31 5d 20 69 73 20 74 68 65 20 63 75 72 72 65  -1] is the curre
196f0 6e 74 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67  nt.  ** root pag
19700 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
19710 73 20 6c 6f 6f 70 20 73 65 61 72 63 68 65 73 20  s loop searches 
19720 66 6f 72 20 61 20 6e 6f 64 65 20 77 69 74 68 20  for a node with 
19730 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
19740 73 74 6f 72 65 20 74 68 65 20 6b 65 79 20 6f 6e  store the key on
19750 2c 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20  ,.  ** starting 
19760 77 69 74 68 20 74 68 65 20 6c 65 61 66 20 61 6e  with the leaf an
19770 64 20 69 74 65 72 61 74 69 6e 67 20 75 70 20 74  d iterating up t
19780 6f 77 61 72 64 73 20 74 68 65 20 72 6f 6f 74 2e  owards the root.
19790 20 57 68 65 6e 20 74 68 65 20 6c 6f 6f 70 0a 20   When the loop. 
197a0 20 2a 2a 20 65 78 69 74 73 2c 20 74 68 65 20 6b   ** exits, the k
197b0 65 79 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ey may be writte
197c0 6e 20 74 6f 20 61 70 48 69 65 72 5b 69 4c 65 76  n to apHier[iLev
197d0 65 6c 5d 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 69  el].  */.  for(i
197e0 4c 65 76 65 6c 3d 30 3b 20 69 4c 65 76 65 6c 3c  Level=0; iLevel<
197f0 3d 70 2d 3e 6e 48 69 65 72 3b 20 69 4c 65 76 65  =p->nHier; iLeve
19800 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  l++){.    int nB
19810 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
19820 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19830 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
19840 72 65 71 75 69 72 65 64 20 2a 2f 0a 0a 20 20 20  required */..   
19850 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 70 2d 3e   if( iLevel==p->
19860 6e 48 69 65 72 20 29 7b 0a 20 20 20 20 20 20 2f  nHier ){.      /
19870 2a 20 45 78 74 65 6e 64 20 74 68 65 20 61 72 72  * Extend the arr
19880 61 79 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  ay and allocate 
19890 61 20 6e 65 77 20 72 6f 6f 74 20 70 61 67 65 2e  a new root page.
198a0 20 2a 2f 0a 20 20 20 20 20 20 50 61 67 65 20 2a   */.      Page *
198b0 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 61 4e 65  *aNew;.      aNe
198c0 77 20 3d 20 28 50 61 67 65 20 2a 2a 29 6c 73 6d  w = (Page **)lsm
198d0 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
198e0 20 20 20 70 4d 57 2d 3e 70 44 62 2d 3e 70 45 6e     pMW->pDb->pEn
198f0 76 2c 20 70 2d 3e 61 70 48 69 65 72 2c 20 73 69  v, p->apHier, si
19900 7a 65 6f 66 28 50 61 67 65 20 2a 29 2a 28 70 2d  zeof(Page *)*(p-
19910 3e 6e 48 69 65 72 2b 31 29 0a 20 20 20 20 20 20  >nHier+1).      
19920 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e  );.      if( !aN
19930 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ew ){.        re
19940 74 75 72 6e 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f 42  turn LSM_NOMEM_B
19950 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
19960 20 20 20 70 2d 3e 61 70 48 69 65 72 20 3d 20 61     p->apHier = a
19970 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  New;.    }else{.
19980 20 20 20 20 20 20 50 61 67 65 20 2a 70 4f 6c 64        Page *pOld
19990 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 72 65  ;.      int nFre
199a0 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  e;..      /* If 
199b0 74 68 65 20 6b 65 79 20 77 69 6c 6c 20 66 69 74  the key will fit
199c0 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 62   on this page, b
199d0 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
199e0 6c 6f 6f 70 20 68 65 72 65 2e 0a 20 20 20 20 20  loop here..     
199f0 20 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74 72   ** The new entr
19a00 79 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65  y will be writte
19a10 6e 20 74 6f 20 70 61 67 65 20 61 70 48 69 65 72  n to page apHier
19a20 5b 69 4c 65 76 65 6c 5d 2e 20 2a 2f 0a 20 20 20  [iLevel]. */.   
19a30 20 20 20 70 4f 6c 64 20 3d 20 70 2d 3e 61 70 48     pOld = p->apH
19a40 69 65 72 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20  ier[iLevel];.   
19a50 20 20 20 61 73 73 65 72 74 28 20 6c 73 6d 46 73     assert( lsmFs
19a60 50 61 67 65 57 72 69 74 61 62 6c 65 28 70 4f 6c  PageWritable(pOl
19a70 64 29 20 29 3b 0a 20 20 20 20 20 20 61 44 61 74  d) );.      aDat
19a80 61 20 3d 20 66 73 50 61 67 65 44 61 74 61 28 70  a = fsPageData(p
19a90 4f 6c 64 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20  Old, &nData);.  
19aa0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30      if( eType==0
19ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 42 79 74   ){.        nByt
19ac0 65 20 3d 20 32 20 2b 20 31 20 2b 20 6c 73 6d 56  e = 2 + 1 + lsmV
19ad0 61 72 69 6e 74 4c 65 6e 33 32 28 28 69 6e 74 29  arintLen32((int)
19ae0 69 50 74 72 29 20 2b 20 6c 73 6d 56 61 72 69 6e  iPtr) + lsmVarin
19af0 74 4c 65 6e 33 32 28 28 69 6e 74 29 69 4b 65 79  tLen32((int)iKey
19b00 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Pg);.      }else
19b10 7b 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65 20  {.        nByte 
19b20 3d 20 32 20 2b 20 31 20 2b 20 6c 73 6d 56 61 72  = 2 + 1 + lsmVar
19b30 69 6e 74 4c 65 6e 33 32 28 28 69 6e 74 29 69 50  intLen32((int)iP
19b40 74 72 29 20 2b 20 6c 73 6d 56 61 72 69 6e 74 4c  tr) + lsmVarintL
19b50 65 6e 33 32 28 6e 4b 65 79 29 20 2b 20 6e 4b 65  en32(nKey) + nKe
19b60 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
19b70 20 6e 52 65 63 20 3d 20 70 61 67 65 47 65 74 4e   nRec = pageGetN
19b80 52 65 63 28 61 44 61 74 61 2c 20 6e 44 61 74 61  Rec(aData, nData
19b90 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d  );.      nFree =
19ba0 20 53 45 47 4d 45 4e 54 5f 45 4f 46 28 6e 44 61   SEGMENT_EOF(nDa
19bb0 74 61 2c 20 6e 52 65 63 29 20 2d 20 6d 65 72 67  ta, nRec) - merg
19bc0 65 57 6f 72 6b 65 72 50 61 67 65 4f 66 66 73 65  eWorkerPageOffse
19bd0 74 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  t(aData, nData);
19be0 0a 20 20 20 20 20 20 69 66 28 20 6e 42 79 74 65  .      if( nByte
19bf0 3c 3d 6e 46 72 65 65 20 29 20 62 72 65 61 6b 3b  <=nFree ) break;
19c00 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72  ..      /* Other
19c10 77 69 73 65 2c 20 74 68 69 73 20 70 61 67 65 20  wise, this page 
19c20 69 73 20 66 75 6c 6c 2e 20 53 65 74 20 74 68 65  is full. Set the
19c30 20 72 69 67 68 74 2d 68 61 6e 64 2d 63 68 69 6c   right-hand-chil
19c40 64 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 20 20  d pointer.      
19c50 2a 2a 20 74 6f 20 69 50 74 72 20 61 6e 64 20 72  ** to iPtr and r
19c60 65 6c 65 61 73 65 20 69 74 2e 20 20 2a 2f 0a 20  elease it.  */. 
19c70 20 20 20 20 20 6c 73 6d 50 75 74 55 36 34 28 26       lsmPutU64(&
19c80 61 44 61 74 61 5b 53 45 47 4d 45 4e 54 5f 50 4f  aData[SEGMENT_PO
19c90 49 4e 54 45 52 5f 4f 46 46 53 45 54 28 6e 44 61  INTER_OFFSET(nDa
19ca0 74 61 29 5d 2c 20 69 50 74 72 29 3b 0a 20 20 20  ta)], iPtr);.   
19cb0 20 20 20 61 73 73 65 72 74 28 20 6c 73 6d 46 73     assert( lsmFs
19cc0 50 61 67 65 4e 75 6d 62 65 72 28 70 4f 6c 64 29  PageNumber(pOld)
19cd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
19ce0 3d 20 6c 73 6d 46 73 50 61 67 65 50 65 72 73 69  = lsmFsPagePersi
19cf0 73 74 28 70 4f 6c 64 29 3b 0a 20 20 20 20 20 20  st(pOld);.      
19d00 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  if( rc==LSM_OK )
19d10 7b 0a 20 20 20 20 20 20 20 20 69 50 74 72 20 3d  {.        iPtr =
19d20 20 6c 73 6d 46 73 50 61 67 65 4e 75 6d 62 65 72   lsmFsPageNumber
19d30 28 70 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  (pOld);.        
19d40 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65  lsmFsPageRelease
19d50 28 70 4f 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a  (pOld);.      }.
19d60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
19d70 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
19d80 65 20 66 6f 72 20 61 70 48 69 65 72 5b 69 4c 65  e for apHier[iLe
19d90 76 65 6c 5d 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e  vel]. */.    p->
19da0 61 70 48 69 65 72 5b 69 4c 65 76 65 6c 5d 20 3d  apHier[iLevel] =
19db0 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   0;.    if( rc==
19dc0 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  LSM_OK ){.      
19dd0 72 63 20 3d 20 6c 73 6d 46 73 53 6f 72 74 65 64  rc = lsmFsSorted
19de0 41 70 70 65 6e 64 28 0a 20 20 20 20 20 20 20 20  Append(.        
19df0 20 20 70 44 62 2d 3e 70 46 53 2c 20 70 44 62 2d    pDb->pFS, pDb-
19e00 3e 70 57 6f 72 6b 65 72 2c 20 70 4d 57 2d 3e 70  >pWorker, pMW->p
19e10 4c 65 76 65 6c 2c 20 31 2c 20 26 70 2d 3e 61 70  Level, 1, &p->ap
19e20 48 69 65 72 5b 69 4c 65 76 65 6c 5d 0a 20 20 20  Hier[iLevel].   
19e30 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
19e40 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29  if( rc!=LSM_OK )
19e50 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
19e60 20 61 44 61 74 61 20 3d 20 66 73 50 61 67 65 44   aData = fsPageD
19e70 61 74 61 28 70 2d 3e 61 70 48 69 65 72 5b 69 4c  ata(p->apHier[iL
19e80 65 76 65 6c 5d 2c 20 26 6e 44 61 74 61 29 3b 0a  evel], &nData);.
19e90 20 20 20 20 6d 65 6d 73 65 74 28 61 44 61 74 61      memset(aData
19ea0 2c 20 30 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20  , 0, nData);.   
19eb0 20 6c 73 6d 50 75 74 55 31 36 28 26 61 44 61 74   lsmPutU16(&aDat
19ec0 61 5b 53 45 47 4d 45 4e 54 5f 46 4c 41 47 53 5f  a[SEGMENT_FLAGS_
19ed0 4f 46 46 53 45 54 28 6e 44 61 74 61 29 5d 2c 20  OFFSET(nData)], 
19ee0 53 45 47 4d 45 4e 54 5f 42 54 52 45 45 5f 46 4c  SEGMENT_BTREE_FL
19ef0 41 47 29 3b 0a 20 20 20 20 6c 73 6d 50 75 74 55  AG);.    lsmPutU
19f00 31 36 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e  16(&aData[SEGMEN
19f10 54 5f 4e 52 45 43 4f 52 44 5f 4f 46 46 53 45 54  T_NRECORD_OFFSET
19f20 28 6e 44 61 74 61 29 5d 2c 20 30 29 3b 0a 0a 20  (nData)], 0);.. 
19f30 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 70     if( iLevel==p
19f40 2d 3e 6e 48 69 65 72 20 29 7b 0a 20 20 20 20 20  ->nHier ){.     
19f50 20 70 2d 3e 6e 48 69 65 72 2b 2b 3b 0a 20 20 20   p->nHier++;.   
19f60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19f70 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
19f80 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 70 61 67  the key into pag
19f90 65 20 61 70 48 69 65 72 5b 69 4c 65 76 65 6c 5d  e apHier[iLevel]
19fa0 2e 20 2a 2f 0a 20 20 61 44 61 74 61 20 3d 20 66  . */.  aData = f
19fb0 73 50 61 67 65 44 61 74 61 28 70 2d 3e 61 70 48  sPageData(p->apH
19fc0 69 65 72 5b 69 4c 65 76 65 6c 5d 2c 20 26 6e 44  ier[iLevel], &nD
19fd0 61 74 61 29 3b 0a 20 20 69 4f 66 66 20 3d 20 6d  ata);.  iOff = m
19fe0 65 72 67 65 57 6f 72 6b 65 72 50 61 67 65 4f 66  ergeWorkerPageOf
19ff0 66 73 65 74 28 61 44 61 74 61 2c 20 6e 44 61 74  fset(aData, nDat
1a000 61 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 61 67  a);.  nRec = pag
1a010 65 47 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20  eGetNRec(aData, 
1a020 6e 44 61 74 61 29 3b 0a 20 20 6c 73 6d 50 75 74  nData);.  lsmPut
1a030 55 31 36 28 26 61 44 61 74 61 5b 53 45 47 4d 45  U16(&aData[SEGME
1a040 4e 54 5f 43 45 4c 4c 50 54 52 5f 4f 46 46 53 45  NT_CELLPTR_OFFSE
1a050 54 28 6e 44 61 74 61 2c 20 6e 52 65 63 29 5d 2c  T(nData, nRec)],
1a060 20 28 75 31 36 29 69 4f 66 66 29 3b 0a 20 20 6c   (u16)iOff);.  l
1a070 73 6d 50 75 74 55 31 36 28 26 61 44 61 74 61 5b  smPutU16(&aData[
1a080 53 45 47 4d 45 4e 54 5f 4e 52 45 43 4f 52 44 5f  SEGMENT_NRECORD_
1a090 4f 46 46 53 45 54 28 6e 44 61 74 61 29 5d 2c 20  OFFSET(nData)], 
1a0a0 28 75 31 36 29 28 6e 52 65 63 2b 31 29 29 3b 0a  (u16)(nRec+1));.
1a0b0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29    if( eType==0 )
1a0c0 7b 0a 20 20 20 20 61 44 61 74 61 5b 69 4f 66 66  {.    aData[iOff
1a0d0 2b 2b 5d 20 3d 20 30 78 30 30 3b 0a 20 20 20 20  ++] = 0x00;.    
1a0e0 69 4f 66 66 20 2b 3d 20 6c 73 6d 56 61 72 69 6e  iOff += lsmVarin
1a0f0 74 50 75 74 33 32 28 26 61 44 61 74 61 5b 69 4f  tPut32(&aData[iO
1a100 66 66 5d 2c 20 28 69 6e 74 29 69 50 74 72 29 3b  ff], (int)iPtr);
1a110 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 6c 73 6d  .    iOff += lsm
1a120 56 61 72 69 6e 74 50 75 74 33 32 28 26 61 44 61  VarintPut32(&aDa
1a130 74 61 5b 69 4f 66 66 5d 2c 20 28 69 6e 74 29 69  ta[iOff], (int)i
1a140 4b 65 79 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  KeyPg);.  }else{
1a150 0a 20 20 20 20 61 44 61 74 61 5b 69 4f 66 66 2b  .    aData[iOff+
1a160 2b 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  +] = eType;.    
1a170 69 4f 66 66 20 2b 3d 20 6c 73 6d 56 61 72 69 6e  iOff += lsmVarin
1a180 74 50 75 74 33 32 28 26 61 44 61 74 61 5b 69 4f  tPut32(&aData[iO
1a190 66 66 5d 2c 20 28 69 6e 74 29 69 50 74 72 29 3b  ff], (int)iPtr);
1a1a0 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 6c 73 6d  .    iOff += lsm
1a1b0 56 61 72 69 6e 74 50 75 74 33 32 28 26 61 44 61  VarintPut32(&aDa
1a1c0 74 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 79 29 3b  ta[iOff], nKey);
1a1d0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61  .    memcpy(&aDa
1a1e0 74 61 5b 69 4f 66 66 5d 2c 20 70 4b 65 79 2c 20  ta[iOff], pKey, 
1a1f0 6e 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  nKey);.  }..  re
1a200 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
1a210 69 63 20 69 6e 74 20 6d 65 72 67 65 57 6f 72 6b  ic int mergeWork
1a220 65 72 42 74 72 65 65 49 6e 64 69 72 65 63 74 28  erBtreeIndirect(
1a230 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57  MergeWorker *pMW
1a240 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  ){.  int rc = LS
1a250 4d 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 4d 57 2d  M_OK;.  if( pMW-
1a260 3e 69 49 6e 64 69 72 65 63 74 20 29 7b 0a 20 20  >iIndirect ){.  
1a270 20 20 50 67 6e 6f 20 69 4b 65 79 50 67 20 3d 20    Pgno iKeyPg = 
1a280 70 4d 57 2d 3e 61 53 61 76 65 5b 31 5d 2e 69 50  pMW->aSave[1].iP
1a290 67 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 6d 65  gno;.    rc = me
1a2a0 72 67 65 57 6f 72 6b 65 72 42 74 72 65 65 57 72  rgeWorkerBtreeWr
1a2b0 69 74 65 28 70 4d 57 2c 20 30 2c 20 70 4d 57 2d  ite(pMW, 0, pMW-
1a2c0 3e 69 49 6e 64 69 72 65 63 74 2c 20 69 4b 65 79  >iIndirect, iKey
1a2d0 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70  Pg, 0, 0);.    p
1a2e0 4d 57 2d 3e 69 49 6e 64 69 72 65 63 74 20 3d 20  MW->iIndirect = 
1a2f0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1a300 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  rc;.}../*.** App
1a310 65 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  end the database
1a320 20 6b 65 79 20 28 69 54 6f 70 69 63 2f 70 4b 65   key (iTopic/pKe
1a330 79 2f 6e 4b 65 79 29 20 74 6f 20 74 68 65 20 62  y/nKey) to the b
1a340 2d 74 72 65 65 20 75 6e 64 65 72 20 0a 2a 2a 20  -tree under .** 
1a350 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 54 68  construction. Th
1a360 69 73 20 6b 65 79 20 68 61 73 20 6e 6f 74 20 79  is key has not y
1a370 65 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  et been written 
1a380 74 6f 20 61 20 73 65 67 6d 65 6e 74 20 70 61 67  to a segment pag
1a390 65 2e 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  e..** The pointe
1a3a0 72 20 74 68 61 74 20 77 69 6c 6c 20 61 63 63 6f  r that will acco
1a3b0 6d 70 61 6e 79 20 74 68 65 20 6e 65 77 20 6b 65  mpany the new ke
1a3c0 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20  y in the b-tree 
1a3d0 2d 20 74 68 61 74 0a 2a 2a 20 70 6f 69 6e 74 73  - that.** points
1a3e0 20 74 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   to the complete
1a3f0 64 20 73 65 67 6d 65 6e 74 20 70 61 67 65 20 74  d segment page t
1a400 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6b 65 79  hat contains key
1a410 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 0a 2a  s smaller than.*
1a420 2a 20 28 70 4b 65 79 2f 6e 4b 65 79 29 20 69 73  * (pKey/nKey) is
1a430 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
1a440 64 20 69 6e 20 70 4d 57 2d 3e 61 53 61 76 65 5b  d in pMW->aSave[
1a450 30 5d 2e 69 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 61  0].iPgno..*/.sta
1a460 74 69 63 20 69 6e 74 20 6d 65 72 67 65 57 6f 72  tic int mergeWor
1a470 6b 65 72 50 75 73 68 48 69 65 72 61 72 63 68 79  kerPushHierarchy
1a480 28 0a 20 20 4d 65 72 67 65 57 6f 72 6b 65 72 20  (.  MergeWorker 
1a490 2a 70 4d 57 2c 20 20 20 20 20 20 20 20 20 20 20  *pMW,           
1a4a0 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 77 6f 72      /* Merge wor
1a4b0 6b 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ker object */.  
1a4c0 69 6e 74 20 69 54 6f 70 69 63 2c 20 20 20 20 20  int iTopic,     
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4e0 2f 2a 20 54 6f 70 69 63 20 76 61 6c 75 65 20 66  /* Topic value f
1a4f0 6f 72 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20  or this key */. 
1a500 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a520 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6b   /* Pointer to k
1a530 65 79 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  ey buffer */.  i
1a540 6e 74 20 6e 4b 65 79 20 20 20 20 20 20 20 20 20  nt nKey         
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a560 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 62  * Size of pKey b
1a570 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
1a580 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
1a590 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  LSM_OK;         
1a5a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1a5b0 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   Code */.  Pgno 
1a5c0 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  iPtr;           
1a5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1a5e0 69 6e 74 65 72 20 76 61 6c 75 65 20 74 6f 20 61  inter value to a
1a5f0 63 63 6f 6d 70 61 6e 79 20 70 4b 65 79 2f 6e 4b  ccompany pKey/nK
1a600 65 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ey */..  assert(
1a610 20 70 4d 57 2d 3e 61 53 61 76 65 5b 30 5d 2e 62   pMW->aSave[0].b
1a620 53 74 6f 72 65 3d 3d 30 20 29 3b 0a 20 20 61 73  Store==0 );.  as
1a630 73 65 72 74 28 20 70 4d 57 2d 3e 61 53 61 76 65  sert( pMW->aSave
1a640 5b 31 5d 2e 62 53 74 6f 72 65 3d 3d 30 20 29 3b  [1].bStore==0 );
1a650 0a 20 20 72 63 20 3d 20 6d 65 72 67 65 57 6f 72  .  rc = mergeWor
1a660 6b 65 72 42 74 72 65 65 49 6e 64 69 72 65 63 74  kerBtreeIndirect
1a670 28 70 4d 57 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74  (pMW);..  /* Obt
1a680 61 69 6e 20 74 68 65 20 61 62 73 6f 6c 75 74 65  ain the absolute
1a690 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 20 74   pointer value t
1a6a0 6f 20 73 74 6f 72 65 20 61 6c 6f 6e 67 20 77 69  o store along wi
1a6b0 74 68 20 74 68 65 20 6b 65 79 20 69 6e 20 74 68  th the key in th
1a6c0 65 0a 20 20 2a 2a 20 70 61 67 65 20 62 6f 64 79  e.  ** page body
1a6d0 2e 20 54 68 69 73 20 70 6f 69 6e 74 65 72 20 70  . This pointer p
1a6e0 6f 69 6e 74 73 20 74 6f 20 61 20 70 61 67 65 20  oints to a page 
1a6f0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6b 65  that contains ke
1a700 79 73 20 74 68 61 74 20 61 72 65 0a 20 20 2a 2a  ys that are.  **
1a710 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b   smaller than pK
1a720 65 79 2f 6e 4b 65 79 2e 20 20 2a 2f 0a 20 20 69  ey/nKey.  */.  i
1a730 50 74 72 20 3d 20 70 4d 57 2d 3e 61 53 61 76 65  Ptr = pMW->aSave
1a740 5b 30 5d 2e 69 50 67 6e 6f 3b 0a 20 20 61 73 73  [0].iPgno;.  ass
1a750 65 72 74 28 20 69 50 74 72 21 3d 30 20 29 3b 0a  ert( iPtr!=0 );.
1a760 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .  /* Determine 
1a770 69 66 20 74 68 65 20 69 6e 64 69 72 65 63 74 20  if the indirect 
1a780 66 6f 72 6d 61 74 20 73 68 6f 75 6c 64 20 62 65  format should be
1a790 20 75 73 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20   used. */.  if( 
1a7a0 28 6e 4b 65 79 2a 34 20 3e 20 6c 73 6d 46 73 50  (nKey*4 > lsmFsP
1a7b0 61 67 65 53 69 7a 65 28 70 4d 57 2d 3e 70 44 62  ageSize(pMW->pDb
1a7c0 2d 3e 70 46 53 29 29 20 29 7b 0a 20 20 20 20 70  ->pFS)) ){.    p
1a7d0 4d 57 2d 3e 69 49 6e 64 69 72 65 63 74 20 3d 20  MW->iIndirect = 
1a7e0 69 50 74 72 3b 0a 20 20 20 20 70 4d 57 2d 3e 61  iPtr;.    pMW->a
1a7f0 53 61 76 65 5b 31 5d 2e 62 53 74 6f 72 65 20 3d  Save[1].bStore =
1a800 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
1a810 20 72 63 20 3d 20 6d 65 72 67 65 57 6f 72 6b 65   rc = mergeWorke
1a820 72 42 74 72 65 65 57 72 69 74 65 28 0a 20 20 20  rBtreeWrite(.   
1a830 20 20 20 20 20 70 4d 57 2c 20 28 75 38 29 28 69       pMW, (u8)(i
1a840 54 6f 70 69 63 20 7c 20 4c 53 4d 5f 53 45 50 41  Topic | LSM_SEPA
1a850 52 41 54 4f 52 29 2c 20 69 50 74 72 2c 20 30 2c  RATOR), iPtr, 0,
1a860 20 70 4b 65 79 2c 20 6e 4b 65 79 0a 20 20 20 20   pKey, nKey.    
1a870 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73  );.  }..  /* Ens
1a880 75 72 65 20 74 68 61 74 20 74 68 65 20 53 6f 72  ure that the Sor
1a890 74 65 64 52 75 6e 2e 69 52 6f 6f 74 20 66 69 65  tedRun.iRoot fie
1a8a0 6c 64 20 69 73 20 63 6f 72 72 65 63 74 2e 20 2a  ld is correct. *
1a8b0 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
1a8c0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 72  ..static int mer
1a8d0 67 65 57 6f 72 6b 65 72 46 69 6e 69 73 68 48 69  geWorkerFinishHi
1a8e0 65 72 61 72 63 68 79 28 0a 20 20 4d 65 72 67 65  erarchy(.  Merge
1a8f0 57 6f 72 6b 65 72 20 2a 70 4d 57 20 20 20 20 20  Worker *pMW     
1a900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
1a910 72 67 65 20 77 6f 72 6b 65 72 20 6f 62 6a 65 63  rge worker objec
1a920 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1a950 64 20 74 6f 20 6c 6f 6f 70 20 74 68 72 6f 75 67  d to loop throug
1a960 68 20 61 70 48 69 65 72 5b 5d 20 2a 2f 0a 20 20  h apHier[] */.  
1a970 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b  int rc = LSM_OK;
1a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a990 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1a9a0 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 3b 20 20  /.  Pgno iPtr;  
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9c0 20 20 20 20 2f 2a 20 4e 65 77 20 72 69 67 68 74      /* New right
1a9d0 2d 68 61 6e 64 2d 63 68 69 6c 64 20 70 6f 69 6e  -hand-child poin
1a9e0 74 65 72 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  ter value */..  
1a9f0 69 50 74 72 20 3d 20 70 4d 57 2d 3e 61 53 61 76  iPtr = pMW->aSav
1aa00 65 5b 30 5d 2e 69 50 67 6e 6f 3b 0a 20 20 66 6f  e[0].iPgno;.  fo
1aa10 72 28 69 3d 30 3b 20 69 3c 70 4d 57 2d 3e 68 69  r(i=0; i<pMW->hi
1aa20 65 72 2e 6e 48 69 65 72 20 26 26 20 72 63 3d 3d  er.nHier && rc==
1aa30 4c 53 4d 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  LSM_OK; i++){.  
1aa40 20 20 50 61 67 65 20 2a 70 50 67 20 3d 20 70 4d    Page *pPg = pM
1aa50 57 2d 3e 68 69 65 72 2e 61 70 48 69 65 72 5b 69  W->hier.apHier[i
1aa60 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 44 61 74 61  ];.    int nData
1aa70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1aa80 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1aa90 61 44 61 74 61 5b 5d 20 69 6e 20 62 79 74 65 73  aData[] in bytes
1aaa0 20 2a 2f 0a 20 20 20 20 75 38 20 2a 61 44 61 74   */.    u8 *aDat
1aab0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
1aac0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 64 61        /* Page da
1aad0 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a 0a 20  ta for pPg */.. 
1aae0 20 20 20 61 44 61 74 61 20 3d 20 66 73 50 61 67     aData = fsPag
1aaf0 65 44 61 74 61 28 70 50 67 2c 20 26 6e 44 61 74  eData(pPg, &nDat
1ab00 61 29 3b 0a 20 20 20 20 6c 73 6d 50 75 74 55 36  a);.    lsmPutU6
1ab10 34 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54  4(&aData[SEGMENT
1ab20 5f 50 4f 49 4e 54 45 52 5f 4f 46 46 53 45 54 28  _POINTER_OFFSET(
1ab30 6e 44 61 74 61 29 5d 2c 20 69 50 74 72 29 3b 0a  nData)], iPtr);.
1ab40 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 46 73 50  .    rc = lsmFsP
1ab50 61 67 65 50 65 72 73 69 73 74 28 70 50 67 29 3b  agePersist(pPg);
1ab60 0a 20 20 20 20 69 50 74 72 20 3d 20 6c 73 6d 46  .    iPtr = lsmF
1ab70 73 50 61 67 65 4e 75 6d 62 65 72 28 70 50 67 29  sPageNumber(pPg)
1ab80 3b 0a 20 20 20 20 6c 73 6d 46 73 50 61 67 65 52  ;.    lsmFsPageR
1ab90 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
1aba0 0a 0a 20 20 69 66 28 20 70 4d 57 2d 3e 68 69 65  ..  if( pMW->hie
1abb0 72 2e 6e 48 69 65 72 20 29 7b 0a 20 20 20 20 70  r.nHier ){.    p
1abc0 4d 57 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68 73 2e  MW->pLevel->lhs.
1abd0 69 52 6f 6f 74 20 3d 20 69 50 74 72 3b 0a 20 20  iRoot = iPtr;.  
1abe0 20 20 6c 73 6d 46 72 65 65 28 70 4d 57 2d 3e 70    lsmFree(pMW->p
1abf0 44 62 2d 3e 70 45 6e 76 2c 20 70 4d 57 2d 3e 68  Db->pEnv, pMW->h
1ac00 69 65 72 2e 61 70 48 69 65 72 29 3b 0a 20 20 20  ier.apHier);.   
1ac10 20 70 4d 57 2d 3e 68 69 65 72 2e 61 70 48 69 65   pMW->hier.apHie
1ac20 72 20 3d 20 30 3b 0a 20 20 20 20 70 4d 57 2d 3e  r = 0;.    pMW->
1ac30 68 69 65 72 2e 6e 48 69 65 72 20 3d 20 30 3b 0a  hier.nHier = 0;.
1ac40 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1ac50 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1ac60 6d 65 72 67 65 57 6f 72 6b 65 72 41 64 64 50 61  mergeWorkerAddPa
1ac70 64 64 69 6e 67 28 0a 20 20 4d 65 72 67 65 57 6f  dding(.  MergeWo
1ac80 72 6b 65 72 20 2a 70 4d 57 20 20 20 20 20 20 20  rker *pMW       
1ac90 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67           /* Merg
1aca0 65 20 77 6f 72 6b 65 72 20 6f 62 6a 65 63 74 20  e worker object 
1acb0 2a 2f 0a 29 7b 0a 20 20 46 69 6c 65 53 79 73 74  */.){.  FileSyst
1acc0 65 6d 20 2a 70 46 53 20 3d 20 70 4d 57 2d 3e 70  em *pFS = pMW->p
1acd0 44 62 2d 3e 70 46 53 3b 0a 20 20 72 65 74 75 72  Db->pFS;.  retur
1ace0 6e 20 6c 73 6d 46 73 53 6f 72 74 65 64 50 61 64  n lsmFsSortedPad
1acf0 64 69 6e 67 28 70 46 53 2c 20 70 4d 57 2d 3e 70  ding(pFS, pMW->p
1ad00 44 62 2d 3e 70 57 6f 72 6b 65 72 2c 20 26 70 4d  Db->pWorker, &pM
1ad10 57 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68 73 29 3b  W->pLevel->lhs);
1ad20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
1ad30 65 20 61 6c 6c 20 70 61 67 65 20 72 65 66 65 72  e all page refer
1ad40 65 6e 63 65 73 20 63 75 72 72 65 6e 74 6c 79 20  ences currently 
1ad50 68 65 6c 64 20 62 79 20 74 68 65 20 6d 65 72 67  held by the merg
1ad60 65 2d 77 6f 72 6b 65 72 20 70 61 73 73 65 64 0a  e-worker passed.
1ad70 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ** as the only a
1ad80 72 67 75 6d 65 6e 74 2e 20 55 6e 6c 65 73 73 20  rgument. Unless 
1ad90 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
1ada0 75 72 72 65 64 2c 20 61 6c 6c 20 70 61 67 65 73  urred, all pages
1adb0 20 68 61 76 65 0a 2a 2a 20 61 6c 72 65 61 64 79   have.** already
1adc0 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 0a   been released..
1add0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
1ade0 65 72 67 65 57 6f 72 6b 65 72 52 65 6c 65 61 73  ergeWorkerReleas
1adf0 65 41 6c 6c 28 4d 65 72 67 65 57 6f 72 6b 65 72  eAll(MergeWorker
1ae00 20 2a 70 4d 57 29 7b 0a 20 20 69 6e 74 20 69 3b   *pMW){.  int i;
1ae10 0a 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65  .  lsmFsPageRele
1ae20 61 73 65 28 70 4d 57 2d 3e 70 50 61 67 65 29 3b  ase(pMW->pPage);
1ae30 0a 20 20 70 4d 57 2d 3e 70 50 61 67 65 20 3d 20  .  pMW->pPage = 
1ae40 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
1ae50 3c 70 4d 57 2d 3e 68 69 65 72 2e 6e 48 69 65 72  <pMW->hier.nHier
1ae60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 73 6d 46  ; i++){.    lsmF
1ae70 73 50 61 67 65 52 65 6c 65 61 73 65 28 70 4d 57  sPageRelease(pMW
1ae80 2d 3e 68 69 65 72 2e 61 70 48 69 65 72 5b 69 5d  ->hier.apHier[i]
1ae90 29 3b 0a 20 20 20 20 70 4d 57 2d 3e 68 69 65 72  );.    pMW->hier
1aea0 2e 61 70 48 69 65 72 5b 69 5d 20 3d 20 30 3b 0a  .apHier[i] = 0;.
1aeb0 20 20 7d 0a 20 20 6c 73 6d 46 72 65 65 28 70 4d    }.  lsmFree(pM
1aec0 57 2d 3e 70 44 62 2d 3e 70 45 6e 76 2c 20 70 4d  W->pDb->pEnv, pM
1aed0 57 2d 3e 68 69 65 72 2e 61 70 48 69 65 72 29 3b  W->hier.apHier);
1aee0 0a 20 20 70 4d 57 2d 3e 68 69 65 72 2e 61 70 48  .  pMW->hier.apH
1aef0 69 65 72 20 3d 20 30 3b 0a 20 20 70 4d 57 2d 3e  ier = 0;.  pMW->
1af00 68 69 65 72 2e 6e 48 69 65 72 20 3d 20 30 3b 0a  hier.nHier = 0;.
1af10 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6b 65  }..static int ke
1af20 79 73 7a 54 6f 53 6b 69 70 28 46 69 6c 65 53 79  yszToSkip(FileSy
1af30 73 74 65 6d 20 2a 70 46 53 2c 20 69 6e 74 20 6e  stem *pFS, int n
1af40 4b 65 79 29 7b 0a 20 20 69 6e 74 20 6e 50 67 73  Key){.  int nPgs
1af50 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
1af60 20 20 2f 2a 20 4e 6f 6d 69 6e 61 6c 20 64 61 74    /* Nominal dat
1af70 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 20  abase page size 
1af80 2a 2f 0a 20 20 6e 50 67 73 7a 20 3d 20 6c 73 6d  */.  nPgsz = lsm
1af90 46 73 50 61 67 65 53 69 7a 65 28 70 46 53 29 3b  FsPageSize(pFS);
1afa0 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4d 49  .  return LSM_MI
1afb0 4e 28 28 28 6e 4b 65 79 20 2a 20 34 29 20 2f 20  N(((nKey * 4) / 
1afc0 6e 50 67 73 7a 29 2c 20 33 29 3b 0a 7d 0a 0a 2f  nPgsz), 3);.}../
1afd0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 74 68 65  *.** Release the
1afe0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
1aff0 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
1b000 20 70 61 67 65 20 6f 66 20 6d 65 72 67 65 2d 77   page of merge-w
1b010 6f 72 6b 65 72 20 2a 70 4d 57 0a 2a 2a 20 28 72  orker *pMW.** (r
1b020 65 66 65 72 65 6e 63 65 20 70 4d 57 2d 3e 70 50  eference pMW->pP
1b030 61 67 65 29 2e 20 53 65 74 20 74 68 65 20 70 61  age). Set the pa
1b040 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73  ge number values
1b050 20 69 6e 20 61 53 61 76 65 5b 5d 20 61 73 20 0a   in aSave[] as .
1b060 2a 2a 20 72 65 71 75 69 72 65 64 20 28 73 65 65  ** required (see
1b070 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
1b080 73 74 72 75 63 74 20 4d 65 72 67 65 57 6f 72 6b  struct MergeWork
1b090 65 72 20 66 6f 72 20 64 65 74 61 69 6c 73 29 2e  er for details).
1b0a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1b0b0 65 72 67 65 57 6f 72 6b 65 72 50 65 72 73 69 73  ergeWorkerPersis
1b0c0 74 41 6e 64 52 65 6c 65 61 73 65 28 4d 65 72 67  tAndRelease(Merg
1b0d0 65 57 6f 72 6b 65 72 20 2a 70 4d 57 29 7b 0a 20  eWorker *pMW){. 
1b0e0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
1b0f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57  ;..  assert( pMW
1b100 2d 3e 70 50 61 67 65 20 7c 7c 20 28 70 4d 57 2d  ->pPage || (pMW-
1b110 3e 61 53 61 76 65 5b 30 5d 2e 62 53 74 6f 72 65  >aSave[0].bStore
1b120 3d 3d 30 20 26 26 20 70 4d 57 2d 3e 61 53 61 76  ==0 && pMW->aSav
1b130 65 5b 31 5d 2e 62 53 74 6f 72 65 3d 3d 30 29 20  e[1].bStore==0) 
1b140 29 3b 0a 0a 20 20 2f 2a 20 50 65 72 73 69 73 74  );..  /* Persist
1b150 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 72   the page */.  r
1b160 63 20 3d 20 6c 73 6d 46 73 50 61 67 65 50 65 72  c = lsmFsPagePer
1b170 73 69 73 74 28 70 4d 57 2d 3e 70 50 61 67 65 29  sist(pMW->pPage)
1b180 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 69  ;..  /* If requi
1b190 72 65 64 2c 20 73 61 76 65 20 74 68 65 20 70 61  red, save the pa
1b1a0 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20  ge number. */.  
1b1b0 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
1b1c0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 57 2d  +){.    if( pMW-
1b1d0 3e 61 53 61 76 65 5b 69 5d 2e 62 53 74 6f 72 65  >aSave[i].bStore
1b1e0 20 29 7b 0a 20 20 20 20 20 20 70 4d 57 2d 3e 61   ){.      pMW->a
1b1f0 53 61 76 65 5b 69 5d 2e 69 50 67 6e 6f 20 3d 20  Save[i].iPgno = 
1b200 6c 73 6d 46 73 50 61 67 65 4e 75 6d 62 65 72 28  lsmFsPageNumber(
1b210 70 4d 57 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20  pMW->pPage);.   
1b220 20 20 20 70 4d 57 2d 3e 61 53 61 76 65 5b 69 5d     pMW->aSave[i]
1b230 2e 62 53 74 6f 72 65 20 3d 20 30 3b 0a 20 20 20  .bStore = 0;.   
1b240 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c   }.  }..  /* Rel
1b250 65 61 73 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  ease the complet
1b260 65 64 20 6f 75 74 70 75 74 20 70 61 67 65 2e 20  ed output page. 
1b270 2a 2f 0a 20 20 6c 73 6d 46 73 50 61 67 65 52 65  */.  lsmFsPageRe
1b280 6c 65 61 73 65 28 70 4d 57 2d 3e 70 50 61 67 65  lease(pMW->pPage
1b290 29 3b 0a 20 20 70 4d 57 2d 3e 70 50 61 67 65 20  );.  pMW->pPage 
1b2a0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1b2b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
1b2c0 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 70  ce to the next p
1b2d0 61 67 65 20 6f 66 20 61 6e 20 6f 75 74 70 75 74  age of an output
1b2e0 20 72 75 6e 20 62 65 69 6e 67 20 70 6f 70 75 6c   run being popul
1b2f0 61 74 65 64 20 62 79 20 6d 65 72 67 65 2d 77 6f  ated by merge-wo
1b300 72 6b 65 72 0a 2a 2a 20 70 4d 57 2e 20 54 68 65  rker.** pMW. The
1b310 20 66 6f 6f 74 65 72 20 6f 66 20 74 68 65 20 6e   footer of the n
1b320 65 77 20 70 61 67 65 20 69 73 20 69 6e 69 74 69  ew page is initi
1b330 61 6c 69 7a 65 64 20 74 6f 20 69 6e 64 69 63 61  alized to indica
1b340 74 65 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61  te that it conta
1b350 69 6e 73 0a 2a 2a 20 7a 65 72 6f 20 72 65 63 6f  ins.** zero reco
1b360 72 64 73 2e 20 54 68 65 20 66 6c 61 67 73 20 66  rds. The flags f
1b370 69 65 6c 64 20 69 73 20 63 6c 65 61 72 65 64 2e  ield is cleared.
1b380 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74 65 72   The page footer
1b390 20 70 6f 69 6e 74 65 72 20 66 69 65 6c 64 0a 2a   pointer field.*
1b3a0 2a 20 69 73 20 73 65 74 20 74 6f 20 69 46 50 74  * is set to iFPt
1b3b0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  r..**.** If succ
1b3c0 65 73 73 66 75 6c 2c 20 4c 53 4d 5f 4f 4b 20 69  essful, LSM_OK i
1b3d0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1b3e0 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
1b3f0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
1b400 69 6e 74 20 6d 65 72 67 65 57 6f 72 6b 65 72 4e  int mergeWorkerN
1b410 65 78 74 50 61 67 65 28 0a 20 20 4d 65 72 67 65  extPage(.  Merge
1b420 57 6f 72 6b 65 72 20 2a 70 4d 57 2c 20 20 20 20  Worker *pMW,    
1b430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
1b440 72 67 65 20 77 6f 72 6b 65 72 20 6f 62 6a 65 63  rge worker objec
1b450 74 20 74 6f 20 61 70 70 65 6e 64 20 70 61 67 65  t to append page
1b460 20 74 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46   to */.  Pgno iF
1b470 50 74 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Ptr             
1b480 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1b490 74 65 72 20 76 61 6c 75 65 20 66 6f 72 20 66 6f  ter value for fo
1b4a0 6f 74 65 72 20 6f 66 20 6e 65 77 20 70 61 67 65  oter of new page
1b4b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1b4c0 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20  = LSM_OK;       
1b4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1b4e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 61 67  rn code */.  Pag
1b4f0 65 20 2a 70 4e 65 78 74 20 3d 20 30 3b 20 20 20  e *pNext = 0;   
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b510 4e 65 77 20 70 61 67 65 20 61 70 70 65 6e 64 65  New page appende
1b520 64 20 74 6f 20 72 75 6e 20 2a 2f 0a 20 20 6c 73  d to run */.  ls
1b530 6d 5f 64 62 20 2a 70 44 62 20 3d 20 70 4d 57 2d  m_db *pDb = pMW-
1b540 3e 70 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  >pDb;         /*
1b550 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
1b560 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 6c 73 6d 46   */..  rc = lsmF
1b570 73 53 6f 72 74 65 64 41 70 70 65 6e 64 28 70 44  sSortedAppend(pD
1b580 62 2d 3e 70 46 53 2c 20 70 44 62 2d 3e 70 57 6f  b->pFS, pDb->pWo
1b590 72 6b 65 72 2c 20 70 4d 57 2d 3e 70 4c 65 76 65  rker, pMW->pLeve
1b5a0 6c 2c 20 30 2c 20 26 70 4e 65 78 74 29 3b 0a 20  l, 0, &pNext);. 
1b5b0 20 61 73 73 65 72 74 28 20 72 63 20 7c 7c 20 70   assert( rc || p
1b5c0 4d 57 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68 73 2e  MW->pLevel->lhs.
1b5d0 69 46 69 72 73 74 3e 30 20 7c 7c 20 70 4d 57 2d  iFirst>0 || pMW-
1b5e0 3e 70 44 62 2d 3e 63 6f 6d 70 72 65 73 73 2e 78  >pDb->compress.x
1b5f0 43 6f 6d 70 72 65 73 73 20 29 3b 0a 0a 20 20 69  Compress );..  i
1b600 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc==LSM_OK ){
1b610 0a 20 20 20 20 75 38 20 2a 61 44 61 74 61 3b 20  .    u8 *aData; 
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b630 20 20 20 2f 2a 20 44 61 74 61 20 62 75 66 66 65     /* Data buffe
1b640 72 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 70  r belonging to p
1b650 61 67 65 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20  age pNext */.   
1b660 20 69 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20   int nData;     
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b680 2a 20 53 69 7a 65 20 6f 66 20 61 44 61 74 61 5b  * Size of aData[
1b690 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  ] in bytes */.. 
1b6a0 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57 6f 72     rc = mergeWor
1b6b0 6b 65 72 50 65 72 73 69 73 74 41 6e 64 52 65 6c  kerPersistAndRel
1b6c0 65 61 73 65 28 70 4d 57 29 3b 0a 0a 20 20 20 20  ease(pMW);..    
1b6d0 70 4d 57 2d 3e 70 50 61 67 65 20 3d 20 70 4e 65  pMW->pPage = pNe
1b6e0 78 74 3b 0a 20 20 20 20 70 4d 57 2d 3e 70 4c 65  xt;.    pMW->pLe
1b6f0 76 65 6c 2d 3e 70 4d 65 72 67 65 2d 3e 69 4f 75  vel->pMerge->iOu
1b700 74 70 75 74 4f 66 66 20 3d 20 30 3b 0a 20 20 20  tputOff = 0;.   
1b710 20 61 44 61 74 61 20 3d 20 66 73 50 61 67 65 44   aData = fsPageD
1b720 61 74 61 28 70 4e 65 78 74 2c 20 26 6e 44 61 74  ata(pNext, &nDat
1b730 61 29 3b 0a 20 20 20 20 6c 73 6d 50 75 74 55 31  a);.    lsmPutU1
1b740 36 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54  6(&aData[SEGMENT
1b750 5f 4e 52 45 43 4f 52 44 5f 4f 46 46 53 45 54 28  _NRECORD_OFFSET(
1b760 6e 44 61 74 61 29 5d 2c 20 30 29 3b 0a 20 20 20  nData)], 0);.   
1b770 20 6c 73 6d 50 75 74 55 31 36 28 26 61 44 61 74   lsmPutU16(&aDat
1b780 61 5b 53 45 47 4d 45 4e 54 5f 46 4c 41 47 53 5f  a[SEGMENT_FLAGS_
1b790 4f 46 46 53 45 54 28 6e 44 61 74 61 29 5d 2c 20  OFFSET(nData)], 
1b7a0 30 29 3b 0a 20 20 20 20 6c 73 6d 50 75 74 55 36  0);.    lsmPutU6
1b7b0 34 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54  4(&aData[SEGMENT
1b7c0 5f 50 4f 49 4e 54 45 52 5f 4f 46 46 53 45 54 28  _POINTER_OFFSET(
1b7d0 6e 44 61 74 61 29 5d 2c 20 69 46 50 74 72 29 3b  nData)], iFPtr);
1b7e0 0a 20 20 20 20 70 4d 57 2d 3e 6e 57 6f 72 6b 2b  .    pMW->nWork+
1b7f0 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  +;.  }..  return
1b800 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
1b810 69 74 65 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  ite a blob of da
1b820 74 61 20 69 6e 74 6f 20 61 6e 20 6f 75 74 70 75  ta into an outpu
1b830 74 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20  t segment being 
1b840 70 6f 70 75 6c 61 74 65 64 20 62 79 20 61 20 0a  populated by a .
1b850 2a 2a 20 6d 65 72 67 65 2d 77 6f 72 6b 65 72 20  ** merge-worker 
1b860 6f 62 6a 65 63 74 2e 20 49 66 20 61 72 67 75 6d  object. If argum
1b870 65 6e 74 20 62 53 65 70 20 69 73 20 74 72 75 65  ent bSep is true
1b880 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  , write into the
1b890 20 73 65 70 61 72 61 74 6f 72 73 0a 2a 2a 20 61   separators.** a
1b8a0 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  rray. Otherwise,
1b8b0 20 74 68 65 20 6d 61 69 6e 20 61 72 72 61 79 2e   the main array.
1b8c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
1b8d0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1b8e0 77 72 69 74 65 20 74 68 65 20 62 6c 6f 62 73 20  write the blobs 
1b8f0 6f 66 20 64 61 74 61 20 66 6f 72 20 6b 65 79 73  of data for keys
1b900 20 61 6e 64 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a   and values..*/.
1b910 73 74 61 74 69 63 20 69 6e 74 20 6d 65 72 67 65  static int merge
1b920 57 6f 72 6b 65 72 44 61 74 61 28 0a 20 20 4d 65  WorkerData(.  Me
1b930 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57 2c 20  rgeWorker *pMW, 
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b950 20 4d 65 72 67 65 20 77 6f 72 6b 65 72 20 6f 62   Merge worker ob
1b960 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 62 53  ject */.  int bS
1b970 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
1b980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1b990 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 73 65  e to write to se
1b9a0 70 61 72 61 74 6f 72 73 20 72 75 6e 20 2a 2f 0a  parators run */.
1b9b0 20 20 69 6e 74 20 69 46 50 74 72 2c 20 20 20 20    int iFPtr,    
1b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9d0 20 20 2f 2a 20 46 6f 6f 74 65 72 20 70 74 72 20    /* Footer ptr 
1b9e0 66 6f 72 20 6e 65 77 20 70 61 67 65 73 20 2a 2f  for new pages */
1b9f0 0a 20 20 75 38 20 2a 61 57 72 69 74 65 2c 20 20  .  u8 *aWrite,  
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba10 20 20 20 2f 2a 20 57 72 69 74 65 20 64 61 74 61     /* Write data
1ba20 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65   from this buffe
1ba30 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 72 69 74  r */.  int nWrit
1ba40 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1ba50 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1ba60 66 20 61 57 72 69 74 65 5b 5d 20 69 6e 20 62 79  f aWrite[] in by
1ba70 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tes */.){.  int 
1ba80 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20  rc = LSM_OK;    
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1baa0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1bab0 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 57 72 69 74  int nRem = nWrit
1bac0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1bad0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1bae0 65 73 20 73 74 69 6c 6c 20 74 6f 20 77 72 69 74  es still to writ
1baf0 65 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 72  e */..  while( r
1bb00 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 6e 52 65  c==LSM_OK && nRe
1bb10 6d 3e 30 20 29 7b 0a 20 20 20 20 4d 65 72 67 65  m>0 ){.    Merge
1bb20 20 2a 70 4d 65 72 67 65 20 3d 20 70 4d 57 2d 3e   *pMerge = pMW->
1bb30 70 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65 3b 0a  pLevel->pMerge;.
1bb40 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 20 20      int nCopy;  
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1bb70 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
1bb80 20 20 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20      u8 *aData;  
1bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bba0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1bbb0 62 75 66 66 65 72 20 6f 66 20 63 75 72 72 65 6e  buffer of curren
1bbc0 74 20 6f 75 74 70 75 74 20 70 61 67 65 20 2a 2f  t output page */
1bbd0 0a 20 20 20 20 69 6e 74 20 6e 44 61 74 61 3b 20  .    int nData; 
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 44     /* Size of aD
1bc00 61 74 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ata[] in bytes *
1bc10 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 63 3b 20  /.    int nRec; 
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1bc40 20 72 65 63 6f 72 64 73 20 6f 6e 20 63 75 72 72   records on curr
1bc50 65 6e 74 20 6f 75 74 70 75 74 20 70 61 67 65 20  ent output page 
1bc60 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  */.    int iOff;
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc80 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1bc90 6e 20 61 44 61 74 61 5b 5d 20 74 6f 20 77 72 69  n aData[] to wri
1bca0 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 61 73  te to */..    as
1bcb0 73 65 72 74 28 20 6c 73 6d 46 73 50 61 67 65 57  sert( lsmFsPageW
1bcc0 72 69 74 61 62 6c 65 28 70 4d 57 2d 3e 70 50 61  ritable(pMW->pPa
1bcd0 67 65 29 20 29 3b 0a 20 20 20 0a 20 20 20 20 61  ge) );.   .    a
1bce0 44 61 74 61 20 3d 20 66 73 50 61 67 65 44 61 74  Data = fsPageDat
1bcf0 61 28 70 4d 57 2d 3e 70 50 61 67 65 2c 20 26 6e  a(pMW->pPage, &n
1bd00 44 61 74 61 29 3b 0a 20 20 20 20 6e 52 65 63 20  Data);.    nRec 
1bd10 3d 20 70 61 67 65 47 65 74 4e 52 65 63 28 61 44  = pageGetNRec(aD
1bd20 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20  ata, nData);.   
1bd30 20 69 4f 66 66 20 3d 20 70 4d 65 72 67 65 2d 3e   iOff = pMerge->
1bd40 69 4f 75 74 70 75 74 4f 66 66 3b 0a 20 20 20 20  iOutputOff;.    
1bd50 6e 43 6f 70 79 20 3d 20 4c 53 4d 5f 4d 49 4e 28  nCopy = LSM_MIN(
1bd60 6e 52 65 6d 2c 20 53 45 47 4d 45 4e 54 5f 45 4f  nRem, SEGMENT_EO
1bd70 46 28 6e 44 61 74 61 2c 20 6e 52 65 63 29 20 2d  F(nData, nRec) -
1bd80 20 69 4f 66 66 29 3b 0a 0a 20 20 20 20 6d 65 6d   iOff);..    mem
1bd90 63 70 79 28 26 61 44 61 74 61 5b 69 4f 66 66 5d  cpy(&aData[iOff]
1bda0 2c 20 26 61 57 72 69 74 65 5b 6e 57 72 69 74 65  , &aWrite[nWrite
1bdb0 2d 6e 52 65 6d 5d 2c 20 6e 43 6f 70 79 29 3b 0a  -nRem], nCopy);.
1bdc0 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 6f 70      nRem -= nCop
1bdd0 79 3b 0a 0a 20 20 20 20 69 66 28 20 6e 52 65 6d  y;..    if( nRem
1bde0 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
1bdf0 20 6d 65 72 67 65 57 6f 72 6b 65 72 4e 65 78 74   mergeWorkerNext
1be00 50 61 67 65 28 70 4d 57 2c 20 69 46 50 74 72 29  Page(pMW, iFPtr)
1be10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1be20 20 20 20 70 4d 65 72 67 65 2d 3e 69 4f 75 74 70     pMerge->iOutp
1be30 75 74 4f 66 66 20 3d 20 69 4f 66 66 20 2b 20 6e  utOff = iOff + n
1be40 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
1be50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1be60 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 65 72 67  ../*.** The Merg
1be70 65 57 6f 72 6b 65 72 20 70 61 73 73 65 64 20 61  eWorker passed a
1be80 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
1be90 65 6e 74 20 69 73 20 77 6f 72 6b 69 6e 67 20 74  ent is working t
1bea0 6f 20 6d 65 72 67 65 20 74 77 6f 20 6f 72 0a 2a  o merge two or.*
1beb0 2a 20 6d 6f 72 65 20 65 78 69 73 74 69 6e 67 20  * more existing 
1bec0 73 65 67 6d 65 6e 74 73 20 74 6f 67 65 74 68 65  segments togethe
1bed0 72 20 28 6e 6f 74 20 74 6f 20 66 6c 75 73 68 20  r (not to flush 
1bee0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65  an in-memory tre
1bef0 65 29 2e 20 49 74 0a 2a 2a 20 68 61 73 20 6e 6f  e). It.** has no
1bf00 74 20 79 65 74 20 77 72 69 74 74 65 6e 20 74 68  t yet written th
1bf10 65 20 66 69 72 73 74 20 6b 65 79 20 74 6f 20 74  e first key to t
1bf20 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1bf30 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a   the output..*/.
1bf40 73 74 61 74 69 63 20 69 6e 74 20 6d 65 72 67 65  static int merge
1bf50 57 6f 72 6b 65 72 46 69 72 73 74 50 61 67 65 28  WorkerFirstPage(
1bf60 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57  MergeWorker *pMW
1bf70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  ){.  int rc = LS
1bf80 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  M_OK;           
1bf90 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1bfa0 6f 64 65 20 2a 2f 0a 20 20 50 61 67 65 20 2a 70  ode */.  Page *p
1bfb0 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
1bfc0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1bfd0 74 20 70 61 67 65 20 6f 66 20 72 75 6e 20 70 53  t page of run pS
1bfe0 65 67 20 2a 2f 0a 20 20 69 6e 74 20 69 46 50 74  eg */.  int iFPt
1bff0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
1c000 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1c010 65 72 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  er value read fr
1c020 6f 6d 20 66 6f 6f 74 65 72 20 6f 66 20 70 50 67  om footer of pPg
1c030 20 2a 2f 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f   */.  MultiCurso
1c040 72 20 2a 70 43 73 72 20 3d 20 70 4d 57 2d 3e 70  r *pCsr = pMW->p
1c050 43 73 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Csr;..  assert( 
1c060 70 4d 57 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b  pMW->pPage==0 );
1c070 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e 70 42  ..  if( pCsr->pB
1c080 74 43 73 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  tCsr ){.    rc =
1c090 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 20 20 69 46 50   LSM_OK;.    iFP
1c0a0 74 72 20 3d 20 28 69 6e 74 29 70 4d 57 2d 3e 70  tr = (int)pMW->p
1c0b0 4c 65 76 65 6c 2d 3e 70 4e 65 78 74 2d 3e 6c 68  Level->pNext->lh
1c0c0 73 2e 69 46 69 72 73 74 3b 0a 20 20 7d 65 6c 73  s.iFirst;.  }els
1c0d0 65 20 69 66 28 20 70 43 73 72 2d 3e 6e 50 74 72  e if( pCsr->nPtr
1c0e0 3e 30 20 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e  >0 ){.    Segmen
1c0f0 74 20 2a 70 53 65 67 3b 0a 20 20 20 20 70 53 65  t *pSeg;.    pSe
1c100 67 20 3d 20 70 43 73 72 2d 3e 61 50 74 72 5b 70  g = pCsr->aPtr[p
1c110 43 73 72 2d 3e 6e 50 74 72 2d 31 5d 2e 70 53 65  Csr->nPtr-1].pSe
1c120 67 3b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 46  g;.    rc = lsmF
1c130 73 44 62 50 61 67 65 47 65 74 28 70 4d 57 2d 3e  sDbPageGet(pMW->
1c140 70 44 62 2d 3e 70 46 53 2c 20 70 53 65 67 2c 20  pDb->pFS, pSeg, 
1c150 70 53 65 67 2d 3e 69 46 69 72 73 74 2c 20 26 70  pSeg->iFirst, &p
1c160 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  Pg);.    if( rc=
1c170 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =LSM_OK ){.     
1c180 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20   u8 *aData;     
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c1a0 2a 20 42 75 66 66 65 72 20 66 6f 72 20 70 61 67  * Buffer for pag
1c1b0 65 20 70 50 67 20 2a 2f 0a 20 20 20 20 20 20 69  e pPg */.      i
1c1c0 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20  nt nData;       
1c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c1e0 53 69 7a 65 20 6f 66 20 61 44 61 74 61 5b 5d 20  Size of aData[] 
1c1f0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
1c200 20 20 61 44 61 74 61 20 3d 20 66 73 50 61 67 65    aData = fsPage
1c210 44 61 74 61 28 70 50 67 2c 20 26 6e 44 61 74 61  Data(pPg, &nData
1c220 29 3b 0a 20 20 20 20 20 20 69 46 50 74 72 20 3d  );.      iFPtr =
1c230 20 28 69 6e 74 29 70 61 67 65 47 65 74 50 74 72   (int)pageGetPtr
1c240 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a  (aData, nData);.
1c250 20 20 20 20 20 20 6c 73 6d 46 73 50 61 67 65 52        lsmFsPageR
1c260 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
1c270 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
1c280 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
1c290 72 63 20 3d 20 6d 65 72 67 65 57 6f 72 6b 65 72  rc = mergeWorker
1c2a0 4e 65 78 74 50 61 67 65 28 70 4d 57 2c 20 69 46  NextPage(pMW, iF
1c2b0 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43  Ptr);.    if( pC
1c2c0 73 72 2d 3e 70 50 72 65 76 4d 65 72 67 65 50 74  sr->pPrevMergePt
1c2d0 72 20 29 20 2a 70 43 73 72 2d 3e 70 50 72 65 76  r ) *pCsr->pPrev
1c2e0 4d 65 72 67 65 50 74 72 20 3d 20 69 46 50 74 72  MergePtr = iFPtr
1c2f0 3b 0a 20 20 20 20 70 4d 57 2d 3e 61 53 61 76 65  ;.    pMW->aSave
1c300 5b 30 5d 2e 62 53 74 6f 72 65 20 3d 20 31 3b 0a  [0].bStore = 1;.
1c310 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1c320 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1c330 6d 65 72 67 65 57 6f 72 6b 65 72 57 72 69 74 65  mergeWorkerWrite
1c340 28 0a 20 20 4d 65 72 67 65 57 6f 72 6b 65 72 20  (.  MergeWorker 
1c350 2a 70 4d 57 2c 20 20 20 20 20 20 20 20 20 20 20  *pMW,           
1c360 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 77 6f 72      /* Merge wor
1c370 6b 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 77 72  ker object to wr
1c380 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 69 6e  ite into */.  in
1c390 74 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  t eType,        
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c3b0 20 4f 6e 65 20 6f 66 20 53 4f 52 54 45 44 5f 53   One of SORTED_S
1c3c0 45 50 41 52 41 54 4f 52 2c 20 57 52 49 54 45 20  EPARATOR, WRITE 
1c3d0 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 76  or DELETE */.  v
1c3e0 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e  oid *pKey, int n
1c3f0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
1c400 2a 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20  * Key value */. 
1c410 20 76 6f 69 64 20 2a 70 56 61 6c 2c 20 69 6e 74   void *pVal, int
1c420 20 6e 56 61 6c 2c 20 20 20 20 20 20 20 20 20 20   nVal,          
1c430 20 2f 2a 20 56 61 6c 75 65 20 76 61 6c 75 65 20   /* Value value 
1c440 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 20 20 20  */.  int iPtr   
1c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c460 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
1c470 20 76 61 6c 75 65 20 6f 66 20 70 61 67 65 20 70   value of page p
1c480 6f 69 6e 74 65 72 2c 20 6f 72 20 30 20 2a 2f 0a  ointer, or 0 */.
1c490 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  ){.  int rc = LS
1c4a0 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  M_OK;           
1c4b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1c4c0 6f 64 65 20 2a 2f 0a 20 20 4d 65 72 67 65 20 2a  ode */.  Merge *
1c4d0 70 4d 65 72 67 65 3b 20 20 20 20 20 20 20 20 20  pMerge;         
1c4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 73           /* Pers
1c4f0 69 73 74 65 6e 74 20 70 61 72 74 20 6f 66 20 6c  istent part of l
1c500 65 76 65 6c 20 6d 65 72 67 65 20 73 74 61 74 65  evel merge state
1c510 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 64 72 3b 20   */.  int nHdr; 
1c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c530 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 72        /* Space r
1c540 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 69 73  equired for this
1c550 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20 2a   record header *
1c560 2f 0a 20 20 50 61 67 65 20 2a 70 50 67 3b 20 20  /.  Page *pPg;  
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c580 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 77      /* Page to w
1c590 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 75 38 20  rite to */.  u8 
1c5a0 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *aData;         
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c5c0 44 61 74 61 20 62 75 66 66 65 72 20 66 6f 72 20  Data buffer for 
1c5d0 70 61 67 65 20 70 57 72 69 74 65 72 2d 3e 70 50  page pWriter->pP
1c5e0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61  age */.  int nDa
1c5f0 74 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ta = 0;         
1c600 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1c610 20 6f 66 20 62 75 66 66 65 72 20 61 44 61 74 61   of buffer aData
1c620 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  [] in bytes */. 
1c630 20 69 6e 74 20 6e 52 65 63 20 3d 20 30 3b 20 20   int nRec = 0;  
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c650 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
1c660 63 6f 72 64 73 20 6f 6e 20 70 61 67 65 20 70 50  cords on page pP
1c670 67 20 2a 2f 0a 20 20 69 6e 74 20 69 46 50 74 72  g */.  int iFPtr
1c680 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c690 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1c6a0 6f 66 20 70 6f 69 6e 74 65 72 20 69 6e 20 66 6f  of pointer in fo
1c6b0 6f 74 65 72 20 6f 66 20 70 50 67 20 2a 2f 0a 20  oter of pPg */. 
1c6c0 20 69 6e 74 20 69 52 50 74 72 20 3d 20 30 3b 20   int iRPtr = 0; 
1c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6e0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 6f 69   /* Value of poi
1c6f0 6e 74 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74  nter written int
1c700 6f 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  o record */.  in
1c710 74 20 69 4f 66 66 20 3d 20 30 3b 20 20 20 20 20  t iOff = 0;     
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c730 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
1c740 66 66 73 65 74 20 77 69 74 68 69 6e 20 70 61 67  ffset within pag
1c750 65 20 70 50 67 20 2a 2f 0a 20 20 53 65 67 6d 65  e pPg */.  Segme
1c760 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 20 20  nt *pSeg;       
1c770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1c780 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74  gment being writ
1c790 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ten */.  int fla
1c7a0 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
1c7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 21           /* If !
1c7c0 3d 20 30 2c 20 66 6c 61 67 73 20 76 61 6c 75 65  = 0, flags value
1c7d0 20 66 6f 72 20 70 61 67 65 20 66 6f 6f 74 65 72   for page footer
1c7e0 20 2a 2f 0a 20 20 69 6e 74 20 62 46 69 72 73 74   */.  int bFirst
1c7f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c800 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
1c810 72 20 66 69 72 73 74 20 6b 65 79 20 6f 66 20 6f  r first key of o
1c820 75 74 70 75 74 20 72 75 6e 20 2a 2f 0a 0a 20 20  utput run */..  
1c830 70 4d 65 72 67 65 20 3d 20 70 4d 57 2d 3e 70 4c  pMerge = pMW->pL
1c840 65 76 65 6c 2d 3e 70 4d 65 72 67 65 3b 20 20 20  evel->pMerge;   
1c850 20 0a 20 20 70 53 65 67 20 3d 20 26 70 4d 57 2d   .  pSeg = &pMW-
1c860 3e 70 4c 65 76 65 6c 2d 3e 6c 68 73 3b 0a 0a 20  >pLevel->lhs;.. 
1c870 20 69 66 28 20 70 53 65 67 2d 3e 69 46 69 72 73   if( pSeg->iFirs
1c880 74 3d 3d 30 20 26 26 20 70 4d 57 2d 3e 70 50 61  t==0 && pMW->pPa
1c890 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ge==0 ){.    rc 
1c8a0 3d 20 6d 65 72 67 65 57 6f 72 6b 65 72 46 69 72  = mergeWorkerFir
1c8b0 73 74 50 61 67 65 28 70 4d 57 29 3b 0a 20 20 20  stPage(pMW);.   
1c8c0 20 62 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 7d   bFirst = 1;.  }
1c8d0 0a 20 20 70 50 67 20 3d 20 70 4d 57 2d 3e 70 50  .  pPg = pMW->pP
1c8e0 61 67 65 3b 0a 20 20 69 66 28 20 70 50 67 20 29  age;.  if( pPg )
1c8f0 7b 0a 20 20 20 20 61 44 61 74 61 20 3d 20 66 73  {.    aData = fs
1c900 50 61 67 65 44 61 74 61 28 70 50 67 2c 20 26 6e  PageData(pPg, &n
1c910 44 61 74 61 29 3b 0a 20 20 20 20 6e 52 65 63 20  Data);.    nRec 
1c920 3d 20 70 61 67 65 47 65 74 4e 52 65 63 28 61 44  = pageGetNRec(aD
1c930 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20  ata, nData);.   
1c940 20 69 46 50 74 72 20 3d 20 28 69 6e 74 29 70 61   iFPtr = (int)pa
1c950 67 65 47 65 74 50 74 72 28 61 44 61 74 61 2c 20  geGetPtr(aData, 
1c960 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 52 50 74  nData);.    iRPt
1c970 72 20 3d 20 69 50 74 72 20 2d 20 69 46 50 74 72  r = iPtr - iFPtr
1c980 3b 0a 20 20 7d 0a 20 20 20 20 20 0a 20 20 2f 2a  ;.  }.     .  /*
1c990 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1c9a0 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
1c9b0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 6e 65  quired by the ne
1c9c0 77 20 72 65 63 6f 72 64 2e 20 54 68 65 20 73 70  w record. The sp
1c9d0 61 63 65 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ace.  ** require
1c9e0 64 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  d is divided int
1c9f0 6f 20 74 77 6f 20 73 65 63 74 69 6f 6e 73 3a 20  o two sections: 
1ca00 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1ca10 68 65 20 62 6f 64 79 2e 20 54 68 65 0a 20 20 2a  he body. The.  *
1ca20 2a 20 68 65 61 64 65 72 20 63 6f 6e 73 69 73 74  * header consist
1ca30 73 20 6f 66 20 74 68 65 20 69 6e 74 69 61 6c 20  s of the intial 
1ca40 76 61 72 69 6e 74 20 66 69 65 6c 64 73 2e 20 54  varint fields. T
1ca50 68 65 20 62 6f 64 79 20 61 72 65 20 74 68 65 20  he body are the 
1ca60 62 6c 6f 62 73 20 0a 20 20 2a 2a 20 6f 66 20 64  blobs .  ** of d
1ca70 61 74 61 20 74 68 61 74 20 63 6f 72 72 65 73 70  ata that corresp
1ca80 6f 6e 64 20 74 6f 20 74 68 65 20 6b 65 79 20 61  ond to the key a
1ca90 6e 64 20 76 61 6c 75 65 20 64 61 74 61 2e 20 54  nd value data. T
1caa0 68 65 20 65 6e 74 69 72 65 20 68 65 61 64 65 72  he entire header
1cab0 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 73   .  ** must be s
1cac0 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 70 61 67  tored on the pag
1cad0 65 2e 20 54 68 65 20 62 6f 64 79 20 6d 61 79 20  e. The body may 
1cae0 6f 76 65 72 66 6c 6f 77 20 6f 6e 74 6f 20 74 68  overflow onto th
1caf0 65 20 6e 65 78 74 20 61 6e 64 0a 20 20 2a 2a 20  e next and.  ** 
1cb00 73 75 62 73 65 71 75 65 6e 74 20 70 61 67 65 73  subsequent pages
1cb10 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1cb20 68 65 61 64 65 72 20 73 70 61 63 65 20 69 73 3a  header space is:
1cb30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 31  .  **.  **     1
1cb40 29 20 72 65 63 6f 72 64 20 74 79 70 65 20 2d 20  ) record type - 
1cb50 31 20 62 79 74 65 2e 0a 20 20 2a 2a 20 20 20 20  1 byte..  **    
1cb60 20 32 29 20 50 61 67 65 2d 70 6f 69 6e 74 65 72   2) Page-pointer
1cb70 2d 6f 66 66 73 65 74 20 2d 20 31 20 76 61 72 69  -offset - 1 vari
1cb80 6e 74 0a 20 20 2a 2a 20 20 20 20 20 33 29 20 4b  nt.  **     3) K
1cb90 65 79 20 73 69 7a 65 20 2d 20 31 20 76 61 72 69  ey size - 1 vari
1cba0 6e 74 0a 20 20 2a 2a 20 20 20 20 20 34 29 20 56  nt.  **     4) V
1cbb0 61 6c 75 65 20 73 69 7a 65 20 2d 20 31 20 76 61  alue size - 1 va
1cbc0 72 69 6e 74 20 28 6f 6e 6c 79 20 69 66 20 4c 53  rint (only if LS
1cbd0 4d 5f 49 4e 53 45 52 54 20 66 6c 61 67 20 69 73  M_INSERT flag is
1cbe0 20 73 65 74 29 0a 20 20 2a 2f 0a 20 20 69 66 28   set).  */.  if(
1cbf0 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
1cc00 20 20 20 6e 48 64 72 20 3d 20 31 20 2b 20 6c 73     nHdr = 1 + ls
1cc10 6d 56 61 72 69 6e 74 4c 65 6e 33 32 28 69 52 50  mVarintLen32(iRP
1cc20 74 72 29 20 2b 20 6c 73 6d 56 61 72 69 6e 74 4c  tr) + lsmVarintL
1cc30 65 6e 33 32 28 6e 4b 65 79 29 3b 0a 20 20 20 20  en32(nKey);.    
1cc40 69 66 28 20 72 74 49 73 57 72 69 74 65 28 65 54  if( rtIsWrite(eT
1cc50 79 70 65 29 20 29 20 6e 48 64 72 20 2b 3d 20 6c  ype) ) nHdr += l
1cc60 73 6d 56 61 72 69 6e 74 4c 65 6e 33 32 28 6e 56  smVarintLen32(nV
1cc70 61 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  al);..    /* If 
1cc80 74 68 65 20 65 6e 74 69 72 65 20 68 65 61 64 65  the entire heade
1cc90 72 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f  r will not fit o
1cca0 6e 20 70 61 67 65 20 70 50 67 2c 20 6f 72 20 69  n page pPg, or i
1ccb0 66 20 70 61 67 65 20 70 50 67 20 69 73 20 0a 20  f page pPg is . 
1ccc0 20 20 20 2a 2a 20 6d 61 72 6b 65 64 20 72 65 61     ** marked rea
1ccd0 64 2d 6f 6e 6c 79 2c 20 61 64 76 61 6e 63 65 20  d-only, advance 
1cce0 74 6f 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  to the next page
1ccf0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 72   of the output r
1cd00 75 6e 2e 20 2a 2f 0a 20 20 20 20 69 4f 66 66 20  un. */.    iOff 
1cd10 3d 20 70 4d 65 72 67 65 2d 3e 69 4f 75 74 70 75  = pMerge->iOutpu
1cd20 74 4f 66 66 3b 0a 20 20 20 20 69 66 28 20 69 4f  tOff;.    if( iO
1cd30 66 66 3c 30 20 7c 7c 20 70 50 67 3d 3d 30 20 7c  ff<0 || pPg==0 |
1cd40 7c 20 69 4f 66 66 2b 6e 48 64 72 20 3e 20 53 45  | iOff+nHdr > SE
1cd50 47 4d 45 4e 54 5f 45 4f 46 28 6e 44 61 74 61 2c  GMENT_EOF(nData,
1cd60 20 6e 52 65 63 2b 31 29 20 29 7b 0a 20 20 20 20   nRec+1) ){.    
1cd70 20 20 69 46 50 74 72 20 3d 20 28 69 6e 74 29 2a    iFPtr = (int)*
1cd80 70 4d 57 2d 3e 70 43 73 72 2d 3e 70 50 72 65 76  pMW->pCsr->pPrev
1cd90 4d 65 72 67 65 50 74 72 3b 0a 20 20 20 20 20 20  MergePtr;.      
1cda0 69 52 50 74 72 20 3d 20 69 50 74 72 20 2d 20 69  iRPtr = iPtr - i
1cdb0 46 50 74 72 3b 0a 20 20 20 20 20 20 69 4f 66 66  FPtr;.      iOff
1cdc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 52 65 63   = 0;.      nRec
1cdd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1cde0 20 6d 65 72 67 65 57 6f 72 6b 65 72 4e 65 78 74   mergeWorkerNext
1cdf0 50 61 67 65 28 70 4d 57 2c 20 69 46 50 74 72 29  Page(pMW, iFPtr)
1ce00 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 4d  ;.      pPg = pM
1ce10 57 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a  W->pPage;.    }.
1ce20 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
1ce30 73 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  s record header 
1ce40 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73  will be the firs
1ce50 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 61  t on the page, a
1ce60 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 0a  nd the page is .
1ce70 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 76 65 72    ** not the ver
1ce80 79 20 66 69 72 73 74 20 69 6e 20 74 68 65 20 65  y first in the e
1ce90 6e 74 69 72 65 20 72 75 6e 2c 20 61 64 64 20 61  ntire run, add a
1cea0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6b 65 79   copy of the key
1ceb0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62 2d 74   to the.  ** b-t
1cec0 72 65 65 20 68 69 65 72 61 72 63 68 79 2e 0a 20  ree hierarchy.. 
1ced0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53   */.  if( rc==LS
1cee0 4d 5f 4f 4b 20 26 26 20 6e 52 65 63 3d 3d 30 20  M_OK && nRec==0 
1cef0 26 26 20 62 46 69 72 73 74 3d 3d 30 20 29 7b 0a  && bFirst==0 ){.
1cf00 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 72      assert( pMer
1cf10 67 65 2d 3e 6e 53 6b 69 70 3e 3d 30 20 29 3b 0a  ge->nSkip>=0 );.
1cf20 0a 20 20 20 20 69 66 28 20 70 4d 65 72 67 65 2d  .    if( pMerge-
1cf30 3e 6e 53 6b 69 70 3d 3d 30 20 29 7b 0a 20 20 20  >nSkip==0 ){.   
1cf40 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57 6f 72     rc = mergeWor
1cf50 6b 65 72 50 75 73 68 48 69 65 72 61 72 63 68 79  kerPushHierarchy
1cf60 28 70 4d 57 2c 20 72 74 54 6f 70 69 63 28 65 54  (pMW, rtTopic(eT
1cf70 79 70 65 29 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  ype), pKey, nKey
1cf80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1cf90 20 70 4d 57 2d 3e 61 53 61 76 65 5b 30 5d 2e 62   pMW->aSave[0].b
1cfa0 53 74 6f 72 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Store==0 );.    
1cfb0 20 20 70 4d 57 2d 3e 61 53 61 76 65 5b 30 5d 2e    pMW->aSave[0].
1cfc0 62 53 74 6f 72 65 20 3d 20 31 3b 0a 20 20 20 20  bStore = 1;.    
1cfd0 20 20 70 4d 65 72 67 65 2d 3e 6e 53 6b 69 70 20    pMerge->nSkip 
1cfe0 3d 20 6b 65 79 73 7a 54 6f 53 6b 69 70 28 70 4d  = keyszToSkip(pM
1cff0 57 2d 3e 70 44 62 2d 3e 70 46 53 2c 20 6e 4b 65  W->pDb->pFS, nKe
1d000 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  y);.    }else{. 
1d010 20 20 20 20 20 70 4d 65 72 67 65 2d 3e 6e 53 6b       pMerge->nSk
1d020 69 70 2d 2d 3b 0a 20 20 20 20 20 20 66 6c 61 67  ip--;.      flag
1d030 73 20 3d 20 50 47 46 54 52 5f 53 4b 49 50 5f 54  s = PGFTR_SKIP_T
1d040 48 49 53 5f 46 4c 41 47 3b 0a 20 20 20 20 7d 0a  HIS_FLAG;.    }.
1d050 0a 20 20 20 20 69 66 28 20 70 4d 65 72 67 65 2d  .    if( pMerge-
1d060 3e 6e 53 6b 69 70 20 29 20 66 6c 61 67 73 20 7c  >nSkip ) flags |
1d070 3d 20 50 47 46 54 52 5f 53 4b 49 50 5f 4e 45 58  = PGFTR_SKIP_NEX
1d080 54 5f 46 4c 41 47 3b 0a 20 20 7d 0a 0a 20 20 2f  T_FLAG;.  }..  /
1d090 2a 20 55 70 64 61 74 65 20 74 68 65 20 6f 75 74  * Update the out
1d0a0 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  put segment */. 
1d0b0 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
1d0c0 29 7b 0a 20 20 20 20 61 44 61 74 61 20 3d 20 66  ){.    aData = f
1d0d0 73 50 61 67 65 44 61 74 61 28 70 50 67 2c 20 26  sPageData(pPg, &
1d0e0 6e 44 61 74 61 29 3b 0a 0a 20 20 20 20 2f 2a 20  nData);..    /* 
1d0f0 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 20  Update the page 
1d100 66 6f 6f 74 65 72 2e 20 2a 2f 0a 20 20 20 20 6c  footer. */.    l
1d110 73 6d 50 75 74 55 31 36 28 26 61 44 61 74 61 5b  smPutU16(&aData[
1d120 53 45 47 4d 45 4e 54 5f 4e 52 45 43 4f 52 44 5f  SEGMENT_NRECORD_
1d130 4f 46 46 53 45 54 28 6e 44 61 74 61 29 5d 2c 20  OFFSET(nData)], 
1d140 28 75 31 36 29 28 6e 52 65 63 2b 31 29 29 3b 0a  (u16)(nRec+1));.
1d150 20 20 20 20 6c 73 6d 50 75 74 55 31 36 28 26 61      lsmPutU16(&a
1d160 44 61 74 61 5b 53 45 47 4d 45 4e 54 5f 43 45 4c  Data[SEGMENT_CEL
1d170 4c 50 54 52 5f 4f 46 46 53 45 54 28 6e 44 61 74  LPTR_OFFSET(nDat
1d180 61 2c 20 6e 52 65 63 29 5d 2c 20 28 75 31 36 29  a, nRec)], (u16)
1d190 69 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 66  iOff);.    if( f
1d1a0 6c 61 67 73 20 29 20 6c 73 6d 50 75 74 55 31 36  lags ) lsmPutU16
1d1b0 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54 5f  (&aData[SEGMENT_
1d1c0 46 4c 41 47 53 5f 4f 46 46 53 45 54 28 6e 44 61  FLAGS_OFFSET(nDa
1d1d0 74 61 29 5d 2c 20 28 75 31 36 29 66 6c 61 67 73  ta)], (u16)flags
1d1e0 29 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  );..    /* Write
1d1f0 20 74 68 65 20 65 6e 74 72 79 20 68 65 61 64 65   the entry heade
1d200 72 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  r into the curre
1d210 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nt page. */.    
1d220 61 44 61 74 61 5b 69 4f 66 66 2b 2b 5d 20 3d 20  aData[iOff++] = 
1d230 28 75 38 29 65 54 79 70 65 3b 20 20 20 20 20 20  (u8)eType;      
1d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d260 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f           /* 1 */
1d270 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 6c 73 6d  .    iOff += lsm
1d280 56 61 72 69 6e 74 50 75 74 33 32 28 26 61 44 61  VarintPut32(&aDa
1d290 74 61 5b 69 4f 66 66 5d 2c 20 69 52 50 74 72 29  ta[iOff], iRPtr)
1d2a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d2b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20 2a            /* 2 *
1d2c0 2f 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 6c 73  /.    iOff += ls
1d2d0 6d 56 61 72 69 6e 74 50 75 74 33 32 28 26 61 44  mVarintPut32(&aD
1d2e0 61 74 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 79 29  ata[iOff], nKey)
1d2f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20             /* 3 
1d310 2a 2f 0a 20 20 20 20 69 66 28 20 72 74 49 73 57  */.    if( rtIsW
1d320 72 69 74 65 28 65 54 79 70 65 29 20 29 20 69 4f  rite(eType) ) iO
1d330 66 66 20 2b 3d 20 6c 73 6d 56 61 72 69 6e 74 50  ff += lsmVarintP
1d340 75 74 33 32 28 26 61 44 61 74 61 5b 69 4f 66 66  ut32(&aData[iOff
1d350 5d 2c 20 6e 56 61 6c 29 3b 20 20 20 2f 2a 20 34  ], nVal);   /* 4
1d360 20 2a 2f 0a 20 20 20 20 70 4d 65 72 67 65 2d 3e   */.    pMerge->
1d370 69 4f 75 74 70 75 74 4f 66 66 20 3d 20 69 4f 66  iOutputOff = iOf
1d380 66 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  f;..    /* Write
1d390 20 74 68 65 20 6b 65 79 20 61 6e 64 20 64 61 74   the key and dat
1d3a0 61 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65  a into the segme
1d3b0 6e 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  nt. */.    asser
1d3c0 74 28 20 69 46 50 74 72 3d 3d 70 61 67 65 47 65  t( iFPtr==pageGe
1d3d0 74 50 74 72 28 61 44 61 74 61 2c 20 6e 44 61 74  tPtr(aData, nDat
1d3e0 61 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  a) );.    rc = m
1d3f0 65 72 67 65 57 6f 72 6b 65 72 44 61 74 61 28 70  ergeWorkerData(p
1d400 4d 57 2c 20 30 2c 20 69 46 50 74 72 2b 69 52 50  MW, 0, iFPtr+iRP
1d410 74 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b  tr, pKey, nKey);
1d420 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d  .    if( rc==LSM
1d430 5f 4f 4b 20 26 26 20 72 74 49 73 57 72 69 74 65  _OK && rtIsWrite
1d440 28 65 54 79 70 65 29 20 29 7b 0a 20 20 20 20 20  (eType) ){.     
1d450 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
1d460 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d470 6d 65 72 67 65 57 6f 72 6b 65 72 44 61 74 61 28  mergeWorkerData(
1d480 70 4d 57 2c 20 30 2c 20 69 46 50 74 72 2b 69 52  pMW, 0, iFPtr+iR
1d490 50 74 72 2c 20 70 56 61 6c 2c 20 6e 56 61 6c 29  Ptr, pVal, nVal)
1d4a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d4b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1d4c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  ;.}.../*.** Free
1d4d0 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 61   all resources a
1d4e0 6c 6c 6f 63 61 74 65 64 20 62 79 20 6d 65 72 67  llocated by merg
1d4f0 65 57 6f 72 6b 65 72 49 6e 69 74 28 29 2e 0a 2a  eWorkerInit()..*
1d500 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65  /.static void me
1d510 72 67 65 57 6f 72 6b 65 72 53 68 75 74 64 6f 77  rgeWorkerShutdow
1d520 6e 28 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70  n(MergeWorker *p
1d530 4d 57 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  MW, int *pRc){. 
1d540 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d560 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
1d570 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  iable */.  int r
1d580 63 20 3d 20 2a 70 52 63 3b 0a 20 20 4d 75 6c 74  c = *pRc;.  Mult
1d590 69 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20  iCursor *pCsr = 
1d5a0 70 4d 57 2d 3e 70 43 73 72 3b 0a 0a 20 20 2f 2a  pMW->pCsr;..  /*
1d5b0 20 55 6e 6c 65 73 73 20 74 68 65 20 6d 65 72 67   Unless the merg
1d5c0 65 20 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20  e has finished, 
1d5d0 73 61 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  save the cursor 
1d5e0 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 0a  position in the.
1d5f0 20 20 2a 2a 20 4d 65 72 67 65 2e 61 49 6e 70 75    ** Merge.aInpu
1d600 74 5b 5d 20 61 72 72 61 79 2e 20 53 65 65 20 66  t[] array. See f
1d610 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 57 6f 72  unction mergeWor
1d620 6b 65 72 49 6e 69 74 28 29 20 66 6f 72 20 74 68  kerInit() for th
1d630 65 20 0a 20 20 2a 2a 20 63 6f 64 65 20 74 6f 20  e .  ** code to 
1d640 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72  restore a cursor
1d650 20 70 6f 73 69 74 69 6f 6e 20 62 61 73 65 64 20   position based 
1d660 6f 6e 20 61 49 6e 70 75 74 5b 5d 2e 20 20 2a 2f  on aInput[].  */
1d670 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f  .  if( rc==LSM_O
1d680 4b 20 26 26 20 70 43 73 72 20 26 26 20 6c 73 6d  K && pCsr && lsm
1d690 4d 43 75 72 73 6f 72 56 61 6c 69 64 28 70 43 73  MCursorValid(pCs
1d6a0 72 29 20 29 7b 0a 20 20 20 20 4d 65 72 67 65 20  r) ){.    Merge 
1d6b0 2a 70 4d 65 72 67 65 20 3d 20 70 4d 57 2d 3e 70  *pMerge = pMW->p
1d6c0 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65 3b 0a 20  Level->pMerge;. 
1d6d0 20 20 20 69 6e 74 20 62 42 74 72 65 65 20 3d 20     int bBtree = 
1d6e0 28 70 43 73 72 2d 3e 70 42 74 43 73 72 21 3d 30  (pCsr->pBtCsr!=0
1d6f0 29 3b 0a 20 20 20 20 69 6e 74 20 69 50 74 72 3b  );.    int iPtr;
1d700 0a 0a 20 20 20 20 2f 2a 20 70 4d 65 72 67 65 2d  ..    /* pMerge-
1d710 3e 6e 49 6e 70 75 74 3d 3d 30 20 69 6e 64 69 63  >nInput==0 indic
1d720 61 74 65 73 20 74 68 61 74 20 74 68 69 73 20 69  ates that this i
1d730 73 20 61 20 46 6c 75 73 68 54 72 65 65 28 29 20  s a FlushTree() 
1d740 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  operation. */.  
1d750 20 20 61 73 73 65 72 74 28 20 70 4d 65 72 67 65    assert( pMerge
1d760 2d 3e 6e 49 6e 70 75 74 3d 3d 30 20 7c 7c 20 70  ->nInput==0 || p
1d770 4d 57 2d 3e 70 4c 65 76 65 6c 2d 3e 6e 52 69 67  MW->pLevel->nRig
1d780 68 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ht>0 );.    asse
1d790 72 74 28 20 70 4d 65 72 67 65 2d 3e 6e 49 6e 70  rt( pMerge->nInp
1d7a0 75 74 3d 3d 30 20 7c 7c 20 70 4d 65 72 67 65 2d  ut==0 || pMerge-
1d7b0 3e 6e 49 6e 70 75 74 3d 3d 28 70 43 73 72 2d 3e  >nInput==(pCsr->
1d7c0 6e 50 74 72 2b 62 42 74 72 65 65 29 20 29 3b 0a  nPtr+bBtree) );.
1d7d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1d7e0 28 70 4d 65 72 67 65 2d 3e 6e 49 6e 70 75 74 2d  (pMerge->nInput-
1d7f0 62 42 74 72 65 65 29 3b 20 69 2b 2b 29 7b 0a 20  bBtree); i++){. 
1d800 20 20 20 20 20 53 65 67 6d 65 6e 74 50 74 72 20       SegmentPtr 
1d810 2a 70 50 74 72 20 3d 20 26 70 43 73 72 2d 3e 61  *pPtr = &pCsr->a
1d820 50 74 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Ptr[i];.      if
1d830 28 20 70 50 74 72 2d 3e 70 50 67 20 29 7b 0a 20  ( pPtr->pPg ){. 
1d840 20 20 20 20 20 20 20 70 4d 65 72 67 65 2d 3e 61         pMerge->a
1d850 49 6e 70 75 74 5b 69 5d 2e 69 50 67 20 3d 20 6c  Input[i].iPg = l
1d860 73 6d 46 73 50 61 67 65 4e 75 6d 62 65 72 28 70  smFsPageNumber(p
1d870 50 74 72 2d 3e 70 50 67 29 3b 0a 20 20 20 20 20  Ptr->pPg);.     
1d880 20 20 20 70 4d 65 72 67 65 2d 3e 61 49 6e 70 75     pMerge->aInpu
1d890 74 5b 69 5d 2e 69 43 65 6c 6c 20 3d 20 70 50 74  t[i].iCell = pPt
1d8a0 72 2d 3e 69 43 65 6c 6c 3b 0a 20 20 20 20 20 20  r->iCell;.      
1d8b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1d8c0 4d 65 72 67 65 2d 3e 61 49 6e 70 75 74 5b 69 5d  Merge->aInput[i]
1d8d0 2e 69 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  .iPg = 0;.      
1d8e0 20 20 70 4d 65 72 67 65 2d 3e 61 49 6e 70 75 74    pMerge->aInput
1d8f0 5b 69 5d 2e 69 43 65 6c 6c 20 3d 20 30 3b 0a 20  [i].iCell = 0;. 
1d900 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d910 20 69 66 28 20 62 42 74 72 65 65 20 26 26 20 70   if( bBtree && p
1d920 4d 65 72 67 65 2d 3e 6e 49 6e 70 75 74 20 29 7b  Merge->nInput ){
1d930 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1d940 3d 3d 70 43 73 72 2d 3e 6e 50 74 72 20 29 3b 0a  ==pCsr->nPtr );.
1d950 20 20 20 20 20 20 62 74 72 65 65 43 75 72 73 6f        btreeCurso
1d960 72 50 6f 73 69 74 69 6f 6e 28 70 43 73 72 2d 3e  rPosition(pCsr->
1d970 70 42 74 43 73 72 2c 20 26 70 4d 65 72 67 65 2d  pBtCsr, &pMerge-
1d980 3e 61 49 6e 70 75 74 5b 69 5d 29 3b 0a 20 20 20  >aInput[i]);.   
1d990 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65   }..    /* Store
1d9a0 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66   the location of
1d9b0 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2a   the split-key *
1d9c0 2f 0a 20 20 20 20 69 50 74 72 20 3d 20 70 43 73  /.    iPtr = pCs
1d9d0 72 2d 3e 61 54 72 65 65 5b 31 5d 20 2d 20 43 55  r->aTree[1] - CU
1d9e0 52 53 4f 52 5f 44 41 54 41 5f 53 45 47 4d 45 4e  RSOR_DATA_SEGMEN
1d9f0 54 3b 0a 20 20 20 20 69 66 28 20 69 50 74 72 3c  T;.    if( iPtr<
1da00 70 43 73 72 2d 3e 6e 50 74 72 20 29 7b 0a 20 20  pCsr->nPtr ){.  
1da10 20 20 20 20 70 4d 65 72 67 65 2d 3e 73 70 6c 69      pMerge->spli
1da20 74 6b 65 79 20 3d 20 70 4d 65 72 67 65 2d 3e 61  tkey = pMerge->a
1da30 49 6e 70 75 74 5b 69 50 74 72 5d 3b 0a 20 20 20  Input[iPtr];.   
1da40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 74   }else{.      bt
1da50 72 65 65 43 75 72 73 6f 72 53 70 6c 69 74 6b 65  reeCursorSplitke
1da60 79 28 70 43 73 72 2d 3e 70 42 74 43 73 72 2c 20  y(pCsr->pBtCsr, 
1da70 26 70 4d 65 72 67 65 2d 3e 73 70 6c 69 74 6b 65  &pMerge->splitke
1da80 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20  y);.    }.    . 
1da90 20 20 20 70 4d 65 72 67 65 2d 3e 69 4f 75 74 70     pMerge->iOutp
1daa0 75 74 4f 66 66 20 3d 20 2d 31 3b 0a 20 20 7d 0a  utOff = -1;.  }.
1dab0 0a 20 20 6c 73 6d 4d 43 75 72 73 6f 72 43 6c 6f  .  lsmMCursorClo
1dac0 73 65 28 70 43 73 72 2c 20 30 29 3b 0a 0a 20 20  se(pCsr, 0);..  
1dad0 2f 2a 20 50 65 72 73 69 73 74 20 61 6e 64 20 72  /* Persist and r
1dae0 65 6c 65 61 73 65 20 74 68 65 20 6f 75 74 70 75  elease the outpu
1daf0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28  t page. */.  if(
1db00 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 72 63   rc==LSM_OK ) rc
1db10 20 3d 20 6d 65 72 67 65 57 6f 72 6b 65 72 50 65   = mergeWorkerPe
1db20 72 73 69 73 74 41 6e 64 52 65 6c 65 61 73 65 28  rsistAndRelease(
1db30 70 4d 57 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  pMW);.  if( rc==
1db40 4c 53 4d 5f 4f 4b 20 29 20 72 63 20 3d 20 6d 65  LSM_OK ) rc = me
1db50 72 67 65 57 6f 72 6b 65 72 42 74 72 65 65 49 6e  rgeWorkerBtreeIn
1db60 64 69 72 65 63 74 28 70 4d 57 29 3b 0a 20 20 69  direct(pMW);.  i
1db70 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 20  f( rc==LSM_OK ) 
1db80 72 63 20 3d 20 6d 65 72 67 65 57 6f 72 6b 65 72  rc = mergeWorker
1db90 46 69 6e 69 73 68 48 69 65 72 61 72 63 68 79 28  FinishHierarchy(
1dba0 70 4d 57 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  pMW);.  if( rc==
1dbb0 4c 53 4d 5f 4f 4b 20 29 20 72 63 20 3d 20 6d 65  LSM_OK ) rc = me
1dbc0 72 67 65 57 6f 72 6b 65 72 41 64 64 50 61 64 64  rgeWorkerAddPadd
1dbd0 69 6e 67 28 70 4d 57 29 3b 0a 20 20 6c 73 6d 46  ing(pMW);.  lsmF
1dbe0 73 46 6c 75 73 68 57 61 69 74 69 6e 67 28 70 4d  sFlushWaiting(pM
1dbf0 57 2d 3e 70 44 62 2d 3e 70 46 53 2c 20 26 72 63  W->pDb->pFS, &rc
1dc00 29 3b 0a 20 20 6d 65 72 67 65 57 6f 72 6b 65 72  );.  mergeWorker
1dc10 52 65 6c 65 61 73 65 41 6c 6c 28 70 4d 57 29 3b  ReleaseAll(pMW);
1dc20 0a 0a 20 20 6c 73 6d 46 72 65 65 28 70 4d 57 2d  ..  lsmFree(pMW-
1dc30 3e 70 44 62 2d 3e 70 45 6e 76 2c 20 70 4d 57 2d  >pDb->pEnv, pMW-
1dc40 3e 61 47 6f 62 62 6c 65 29 3b 0a 20 20 70 4d 57  >aGobble);.  pMW
1dc50 2d 3e 61 47 6f 62 62 6c 65 20 3d 20 30 3b 0a 20  ->aGobble = 0;. 
1dc60 20 70 4d 57 2d 3e 70 43 73 72 20 3d 20 30 3b 0a   pMW->pCsr = 0;.
1dc70 0a 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 7d 0a  .  *pRc = rc;.}.
1dc80 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  ./*.** The curso
1dc90 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
1dca0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1dcb0 73 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20  s being used as 
1dcc0 74 68 65 20 69 6e 70 75 74 20 66 6f 72 0a 2a 2a  the input for.**
1dcd0 20 61 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69   a merge operati
1dce0 6f 6e 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75  on. When this fu
1dcf0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1dd00 2c 20 2a 70 69 46 6c 61 67 73 20 63 6f 6e 74 61  , *piFlags conta
1dd10 69 6e 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ins the.** datab
1dd20 61 73 65 20 65 6e 74 72 79 20 66 6c 61 67 73 20  ase entry flags 
1dd30 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1dd40 65 6e 74 72 79 2e 20 54 68 65 20 65 6e 74 72 79  entry. The entry
1dd50 20 61 62 6f 75 74 20 74 6f 20 62 65 20 77 72 69   about to be wri
1dd60 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 6f  tten.** to the o
1dd70 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  utput..**.** Not
1dd80 65 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  e that this func
1dd90 74 69 6f 6e 20 6f 6e 6c 79 20 68 61 73 20 74 6f  tion only has to
1dda0 20 77 6f 72 6b 20 66 6f 72 20 63 75 72 73 6f 72   work for cursor
1ddb0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
1ddc0 0a 2a 2a 20 69 74 65 72 61 74 65 20 66 6f 72 77  .** iterate forw
1ddd0 61 72 64 73 20 28 6e 6f 74 20 62 61 63 6b 77 61  ards (not backwa
1dde0 72 64 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rds)..*/.static 
1ddf0 76 6f 69 64 20 6d 65 72 67 65 52 61 6e 67 65 44  void mergeRangeD
1de00 65 6c 65 74 65 73 28 4d 75 6c 74 69 43 75 72 73  eletes(MultiCurs
1de10 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 2a 70  or *pCsr, int *p
1de20 69 56 61 6c 2c 20 69 6e 74 20 2a 70 69 46 6c 61  iVal, int *piFla
1de30 67 73 29 7b 0a 20 20 69 6e 74 20 66 20 3d 20 2a  gs){.  int f = *
1de40 70 69 46 6c 61 67 73 3b 0a 20 20 69 6e 74 20 69  piFlags;.  int i
1de50 4b 65 79 20 3d 20 70 43 73 72 2d 3e 61 54 72 65  Key = pCsr->aTre
1de60 65 5b 31 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e[1];.  int i;..
1de70 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
1de80 66 6c 61 67 73 20 26 20 43 55 52 53 4f 52 5f 4e  flags & CURSOR_N
1de90 45 58 54 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  EXT_OK );.  if( 
1dea0 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 43 55  pCsr->flags & CU
1deb0 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 44 45 4c 45  RSOR_IGNORE_DELE
1dec0 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  TE ){.    /* The
1ded0 20 69 67 6e 6f 72 65 2d 64 65 6c 65 74 65 20 66   ignore-delete f
1dee0 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20  lag is set when 
1def0 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
1df00 65 20 6d 65 72 67 65 20 77 69 6c 6c 20 66 6f 72  e merge will for
1df10 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 6c 64  m.    ** the old
1df20 65 73 74 20 6c 65 76 65 6c 20 69 6e 20 74 68 65  est level in the
1df30 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 74 68   database. In th
1df40 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
1df50 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 0a 20 20 20   no point in.   
1df60 20 2a 2a 20 72 65 74 61 69 6e 69 6e 67 20 61 6e   ** retaining an
1df70 79 20 72 61 6e 67 65 2d 64 65 6c 65 74 65 20 66  y range-delete f
1df80 6c 61 67 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73  lags.  */.    as
1df90 73 65 72 74 28 20 28 66 20 26 20 4c 53 4d 5f 50  sert( (f & LSM_P
1dfa0 4f 49 4e 54 5f 44 45 4c 45 54 45 29 3d 3d 30 20  OINT_DELETE)==0 
1dfb0 29 3b 0a 20 20 20 20 66 20 26 3d 20 7e 28 4c 53  );.    f &= ~(LS
1dfc0 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54 45 7c 4c  M_START_DELETE|L
1dfd0 53 4d 5f 45 4e 44 5f 44 45 4c 45 54 45 29 3b 0a  SM_END_DELETE);.
1dfe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
1dff0 28 69 3d 30 3b 20 69 3c 28 43 55 52 53 4f 52 5f  (i=0; i<(CURSOR_
1e000 44 41 54 41 5f 53 45 47 4d 45 4e 54 20 2b 20 70  DATA_SEGMENT + p
1e010 43 73 72 2d 3e 6e 50 74 72 29 3b 20 69 2b 2b 29  Csr->nPtr); i++)
1e020 7b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 69  {.      if( i!=i
1e030 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Key ){.        i
1e040 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  nt eType;.      
1e050 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
1e060 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a        int nKey;.
1e070 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b          int res;
1e080 0a 20 20 20 20 20 20 20 20 6d 75 6c 74 69 43 75  .        multiCu
1e090 72 73 6f 72 47 65 74 4b 65 79 28 70 43 73 72 2c  rsorGetKey(pCsr,
1e0a0 20 69 2c 20 26 65 54 79 70 65 2c 20 26 70 4b 65   i, &eType, &pKe
1e0b0 79 2c 20 26 6e 4b 65 79 29 3b 0a 0a 20 20 20 20  y, &nKey);..    
1e0c0 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
1e0d0 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
1e0e0 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65  sortedKeyCompare
1e0f0 28 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70  (pCsr->pDb->xCmp
1e100 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1e110 20 72 74 54 6f 70 69 63 28 70 43 73 72 2d 3e 65   rtTopic(pCsr->e
1e120 54 79 70 65 29 2c 20 70 43 73 72 2d 3e 6b 65 79  Type), pCsr->key
1e130 2e 70 44 61 74 61 2c 20 70 43 73 72 2d 3e 6b 65  .pData, pCsr->ke
1e140 79 2e 6e 44 61 74 61 2c 0a 20 20 20 20 20 20 20  y.nData,.       
1e150 20 20 20 20 20 20 20 72 74 54 6f 70 69 63 28 65         rtTopic(e
1e160 54 79 70 65 29 2c 20 70 4b 65 79 2c 20 6e 4b 65  Type), pKey, nKe
1e170 79 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  y.          );. 
1e180 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1e190 20 72 65 73 3c 3d 30 20 29 3b 0a 20 20 20 20 20   res<=0 );.     
1e1a0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
1e1b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1e1c0 66 28 20 28 66 20 26 20 28 4c 53 4d 5f 49 4e 53  f( (f & (LSM_INS
1e1d0 45 52 54 7c 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45  ERT|LSM_POINT_DE
1e1e0 4c 45 54 45 29 29 3d 3d 30 20 29 7b 0a 20 20 20  LETE))==0 ){.   
1e1f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65             if( e
1e200 54 79 70 65 20 26 20 4c 53 4d 5f 49 4e 53 45 52  Type & LSM_INSER
1e210 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T ){.           
1e220 20 20 20 20 20 66 20 7c 3d 20 4c 53 4d 5f 49 4e       f |= LSM_IN
1e230 53 45 52 54 3b 0a 20 20 20 20 20 20 20 20 20 20  SERT;.          
1e240 20 20 20 20 20 20 2a 70 69 56 61 6c 20 3d 20 69        *piVal = i
1e250 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e260 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
1e270 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 20 26  else if( eType &
1e280 20 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c 45 54   LSM_POINT_DELET
1e290 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
1e2a0 20 20 20 20 20 66 20 7c 3d 20 4c 53 4d 5f 50 4f       f |= LSM_PO
1e2b0 49 4e 54 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  INT_DELETE;.    
1e2c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e2d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e2e0 20 20 20 20 20 20 66 20 7c 3d 20 28 65 54 79 70        f |= (eTyp
1e2f0 65 20 26 20 28 4c 53 4d 5f 45 4e 44 5f 44 45 4c  e & (LSM_END_DEL
1e300 45 54 45 7c 4c 53 4d 5f 53 54 41 52 54 5f 44 45  ETE|LSM_START_DE
1e310 4c 45 54 45 29 29 3b 0a 20 20 20 20 20 20 20 20  LETE));.        
1e320 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69    }..          i
1e330 66 28 20 69 3e 69 4b 65 79 20 26 26 20 28 65 54  f( i>iKey && (eT
1e340 79 70 65 20 26 20 4c 53 4d 5f 45 4e 44 5f 44 45  ype & LSM_END_DE
1e350 4c 45 54 45 29 20 26 26 20 72 65 73 3c 30 20 29  LETE) && res<0 )
1e360 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1e370 28 20 66 20 26 20 28 4c 53 4d 5f 49 4e 53 45 52  ( f & (LSM_INSER
1e380 54 7c 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c 45  T|LSM_POINT_DELE
1e390 54 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  TE) ){.         
1e3a0 20 20 20 20 20 66 20 7c 3d 20 28 4c 53 4d 5f 45       f |= (LSM_E
1e3b0 4e 44 5f 44 45 4c 45 54 45 7c 4c 53 4d 5f 53 54  ND_DELETE|LSM_ST
1e3c0 41 52 54 5f 44 45 4c 45 54 45 29 3b 0a 20 20 20  ART_DELETE);.   
1e3d0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 20                f 
1e3f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
1e400 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62   }.            b
1e410 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1e420 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1e430 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
1e440 73 73 65 72 74 28 20 28 66 20 26 20 4c 53 4d 5f  ssert( (f & LSM_
1e450 49 4e 53 45 52 54 29 3d 3d 30 20 7c 7c 20 28 66  INSERT)==0 || (f
1e460 20 26 20 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c   & LSM_POINT_DEL
1e470 45 54 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ETE)==0 );.    i
1e480 66 28 20 28 66 20 26 20 4c 53 4d 5f 53 54 41 52  f( (f & LSM_STAR
1e490 54 5f 44 45 4c 45 54 45 29 20 0a 20 20 20 20 20  T_DELETE) .     
1e4a0 26 26 20 28 66 20 26 20 4c 53 4d 5f 45 4e 44 5f  && (f & LSM_END_
1e4b0 44 45 4c 45 54 45 29 20 0a 20 20 20 20 20 26 26  DELETE) .     &&
1e4c0 20 28 66 20 26 20 4c 53 4d 5f 50 4f 49 4e 54 5f   (f & LSM_POINT_
1e4d0 44 45 4c 45 54 45 20 29 0a 20 20 20 20 29 7b 0a  DELETE ).    ){.
1e4e0 20 20 20 20 20 20 66 20 3d 20 30 3b 0a 20 20 20        f = 0;.   
1e4f0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 69 46 6c 61   }.  }..  *piFla
1e500 67 73 20 3d 20 66 3b 0a 7d 0a 0a 73 74 61 74 69  gs = f;.}..stati
1e510 63 20 69 6e 74 20 6d 65 72 67 65 57 6f 72 6b 65  c int mergeWorke
1e520 72 53 74 65 70 28 4d 65 72 67 65 57 6f 72 6b 65  rStep(MergeWorke
1e530 72 20 2a 70 4d 57 29 7b 0a 20 20 6c 73 6d 5f 64  r *pMW){.  lsm_d
1e540 62 20 2a 70 44 62 20 3d 20 70 4d 57 2d 3e 70 44  b *pDb = pMW->pD
1e550 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
1e560 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
1e570 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43   MultiCursor *pC
1e580 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sr;            /
1e590 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 61 64  * Cursor to read
1e5a0 20 69 6e 70 75 74 20 64 61 74 61 20 66 72 6f 6d   input data from
1e5b0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c   */.  int rc = L
1e5c0 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  SM_OK;          
1e5d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1e5e0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70  de */.  int eTyp
1e5f0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1e600 20 20 20 20 20 20 2f 2a 20 53 4f 52 54 45 44 5f        /* SORTED_
1e610 53 45 50 41 52 41 54 4f 52 2c 20 57 52 49 54 45  SEPARATOR, WRITE
1e620 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20   or DELETE */.  
1e630 76 6f 69 64 20 2a 70 4b 65 79 3b 20 69 6e 74 20  void *pKey; int 
1e640 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  nKey;         /*
1e650 20 4b 65 79 20 2a 2f 0a 20 20 50 67 6e 6f 20 69   Key */.  Pgno i
1e660 50 74 72 3b 0a 20 20 69 6e 74 20 69 56 61 6c 3b  Ptr;.  int iVal;
1e670 0a 0a 20 20 70 43 73 72 20 3d 20 70 4d 57 2d 3e  ..  pCsr = pMW->
1e680 70 43 73 72 3b 0a 0a 20 20 2f 2a 20 50 75 6c 6c  pCsr;..  /* Pull
1e690 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64   the next record
1e6a0 20 6f 75 74 20 6f 66 20 74 68 65 20 73 6f 75 72   out of the sour
1e6b0 63 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20  ce cursor. */.  
1e6c0 6c 73 6d 4d 43 75 72 73 6f 72 4b 65 79 28 70 43  lsmMCursorKey(pC
1e6d0 73 72 2c 20 26 70 4b 65 79 2c 20 26 6e 4b 65 79  sr, &pKey, &nKey
1e6e0 29 3b 0a 20 20 65 54 79 70 65 20 3d 20 70 43 73  );.  eType = pCs
1e6f0 72 2d 3e 65 54 79 70 65 3b 0a 0a 20 20 2f 2a 20  r->eType;..  /* 
1e700 46 69 67 75 72 65 20 6f 75 74 20 69 66 20 74 68  Figure out if th
1e710 65 20 6f 75 74 70 75 74 20 72 65 63 6f 72 64 20  e output record 
1e720 6d 61 79 20 68 61 76 65 20 61 20 64 69 66 66 65  may have a diffe
1e730 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 76 61 6c  rent pointer val
1e740 75 65 0a 20 20 2a 2a 20 74 68 61 6e 20 74 68 65  ue.  ** than the
1e750 20 70 72 65 76 69 6f 75 73 2e 20 54 68 69 73 20   previous. This 
1e760 69 73 20 74 68 65 20 63 61 73 65 20 69 66 20 74  is the case if t
1e770 68 65 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69  he current key i
1e780 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 0a 20  s identical to. 
1e790 20 2a 2a 20 61 20 6b 65 79 20 74 68 61 74 20 61   ** a key that a
1e7a0 70 70 65 61 72 73 20 69 6e 20 74 68 65 20 6c 6f  ppears in the lo
1e7b0 77 65 73 74 20 6c 65 76 65 6c 20 72 75 6e 20 62  west level run b
1e7c0 65 69 6e 67 20 6d 65 72 67 65 64 2e 20 49 66 20  eing merged. If 
1e7d0 73 6f 2c 20 73 65 74 20 0a 20 20 2a 2a 20 69 50  so, set .  ** iP
1e7e0 74 72 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75  tr to the absolu
1e7f0 74 65 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65  te pointer value
1e800 2e 20 49 66 20 6e 6f 74 2c 20 6c 65 61 76 65 20  . If not, leave 
1e810 69 50 74 72 20 73 65 74 20 74 6f 20 7a 65 72 6f  iPtr set to zero
1e820 2c 20 0a 20 20 2a 2a 20 69 6e 64 69 63 61 74 69  , .  ** indicati
1e830 6e 67 20 74 68 61 74 20 74 68 65 20 6f 75 74 70  ng that the outp
1e840 75 74 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65  ut pointer value
1e850 20 73 68 6f 75 6c 64 20 62 65 20 61 20 63 6f 70   should be a cop
1e860 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
1e870 20 0a 20 20 2a 2a 20 76 61 6c 75 65 20 77 72 69   .  ** value wri
1e880 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 70 72  tten with the pr
1e890 65 76 69 6f 75 73 20 6b 65 79 2e 20 20 2a 2f 0a  evious key.  */.
1e8a0 20 20 69 50 74 72 20 3d 20 28 70 43 73 72 2d 3e    iPtr = (pCsr->
1e8b0 70 50 72 65 76 4d 65 72 67 65 50 74 72 20 3f 20  pPrevMergePtr ? 
1e8c0 2a 70 43 73 72 2d 3e 70 50 72 65 76 4d 65 72 67  *pCsr->pPrevMerg
1e8d0 65 50 74 72 20 3a 20 30 29 3b 0a 20 20 69 66 28  ePtr : 0);.  if(
1e8e0 20 70 43 73 72 2d 3e 70 42 74 43 73 72 20 29 7b   pCsr->pBtCsr ){
1e8f0 0a 20 20 20 20 42 74 72 65 65 43 75 72 73 6f 72  .    BtreeCursor
1e900 20 2a 70 42 74 43 73 72 20 3d 20 70 43 73 72 2d   *pBtCsr = pCsr-
1e910 3e 70 42 74 43 73 72 3b 0a 20 20 20 20 69 66 28  >pBtCsr;.    if(
1e920 20 70 42 74 43 73 72 2d 3e 70 4b 65 79 20 29 7b   pBtCsr->pKey ){
1e930 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d  .      int res =
1e940 20 72 74 54 6f 70 69 63 28 70 42 74 43 73 72 2d   rtTopic(pBtCsr-
1e950 3e 65 54 79 70 65 29 20 2d 20 72 74 54 6f 70 69  >eType) - rtTopi
1e960 63 28 65 54 79 70 65 29 3b 0a 20 20 20 20 20 20  c(eType);.      
1e970 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73  if( res==0 ) res
1e980 20 3d 20 70 44 62 2d 3e 78 43 6d 70 28 70 42 74   = pDb->xCmp(pBt
1e990 43 73 72 2d 3e 70 4b 65 79 2c 20 70 42 74 43 73  Csr->pKey, pBtCs
1e9a0 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 6e  r->nKey, pKey, n
1e9b0 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
1e9c0 30 3d 3d 72 65 73 20 29 20 69 50 74 72 20 3d 20  0==res ) iPtr = 
1e9d0 70 42 74 43 73 72 2d 3e 69 50 74 72 3b 0a 20 20  pBtCsr->iPtr;.  
1e9e0 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 3e      assert( res>
1e9f0 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  =0 );.    }.  }e
1ea00 6c 73 65 20 69 66 28 20 70 43 73 72 2d 3e 6e 50  lse if( pCsr->nP
1ea10 74 72 20 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e  tr ){.    Segmen
1ea20 74 50 74 72 20 2a 70 50 74 72 20 3d 20 26 70 43  tPtr *pPtr = &pC
1ea30 73 72 2d 3e 61 50 74 72 5b 70 43 73 72 2d 3e 6e  sr->aPtr[pCsr->n
1ea40 50 74 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20  Ptr-1];.    if( 
1ea50 70 50 74 72 2d 3e 70 50 67 0a 20 20 20 20 20 26  pPtr->pPg.     &
1ea60 26 20 30 3d 3d 70 44 62 2d 3e 78 43 6d 70 28 70  & 0==pDb->xCmp(p
1ea70 50 74 72 2d 3e 70 4b 65 79 2c 20 70 50 74 72 2d  Ptr->pKey, pPtr-
1ea80 3e 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 6e 4b 65  >nKey, pKey, nKe
1ea90 79 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  y).    ){.      
1eaa0 69 50 74 72 20 3d 20 70 50 74 72 2d 3e 69 50 74  iPtr = pPtr->iPt
1eab0 72 2b 70 50 74 72 2d 3e 69 50 67 50 74 72 3b 0a  r+pPtr->iPgPtr;.
1eac0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 56 61      }.  }..  iVa
1ead0 6c 20 3d 20 70 43 73 72 2d 3e 61 54 72 65 65 5b  l = pCsr->aTree[
1eae0 31 5d 3b 0a 20 20 6d 65 72 67 65 52 61 6e 67 65  1];.  mergeRange
1eaf0 44 65 6c 65 74 65 73 28 70 43 73 72 2c 20 26 69  Deletes(pCsr, &i
1eb00 56 61 6c 2c 20 26 65 54 79 70 65 29 3b 0a 0a 20  Val, &eType);.. 
1eb10 20 69 66 28 20 65 54 79 70 65 21 3d 30 20 29 7b   if( eType!=0 ){
1eb20 0a 20 20 20 20 69 66 28 20 70 4d 57 2d 3e 61 47  .    if( pMW->aG
1eb30 6f 62 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  obble ){.      i
1eb40 6e 74 20 69 47 6f 62 62 6c 65 20 3d 20 70 43 73  nt iGobble = pCs
1eb50 72 2d 3e 61 54 72 65 65 5b 31 5d 20 2d 20 43 55  r->aTree[1] - CU
1eb60 52 53 4f 52 5f 44 41 54 41 5f 53 45 47 4d 45 4e  RSOR_DATA_SEGMEN
1eb70 54 3b 0a 20 20 20 20 20 20 69 66 28 20 69 47 6f  T;.      if( iGo
1eb80 62 62 6c 65 3c 70 43 73 72 2d 3e 6e 50 74 72 20  bble<pCsr->nPtr 
1eb90 26 26 20 69 47 6f 62 62 6c 65 3e 3d 30 20 29 7b  && iGobble>=0 ){
1eba0 0a 20 20 20 20 20 20 20 20 53 65 67 6d 65 6e 74  .        Segment
1ebb0 50 74 72 20 2a 70 47 6f 62 62 6c 65 20 3d 20 26  Ptr *pGobble = &
1ebc0 70 43 73 72 2d 3e 61 50 74 72 5b 69 47 6f 62 62  pCsr->aPtr[iGobb
1ebd0 6c 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  le];.        if(
1ebe0 20 28 70 47 6f 62 62 6c 65 2d 3e 66 6c 61 67 73   (pGobble->flags
1ebf0 20 26 20 50 47 46 54 52 5f 53 4b 49 50 5f 54 48   & PGFTR_SKIP_TH
1ec00 49 53 5f 46 4c 41 47 29 3d 3d 30 20 29 7b 0a 20  IS_FLAG)==0 ){. 
1ec10 20 20 20 20 20 20 20 20 20 70 4d 57 2d 3e 61 47           pMW->aG
1ec20 6f 62 62 6c 65 5b 69 47 6f 62 62 6c 65 5d 20 3d  obble[iGobble] =
1ec30 20 6c 73 6d 46 73 50 61 67 65 4e 75 6d 62 65 72   lsmFsPageNumber
1ec40 28 70 47 6f 62 62 6c 65 2d 3e 70 50 67 29 3b 0a  (pGobble->pPg);.
1ec50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ec60 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1ec70 49 66 20 74 68 69 73 20 69 73 20 61 20 73 65 70  If this is a sep
1ec80 61 72 61 74 6f 72 20 6b 65 79 20 61 6e 64 20 77  arator key and w
1ec90 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
1eca0 6f 75 74 70 75 74 20 70 6f 69 6e 74 65 72 20 68  output pointer h
1ecb0 61 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 68  as not.    ** ch
1ecc0 61 6e 67 65 64 2c 20 74 68 65 72 65 20 69 73 20  anged, there is 
1ecd0 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74  no point in writ
1ece0 69 6e 67 20 61 6e 20 6f 75 74 70 75 74 20 72 65  ing an output re
1ecf0 63 6f 72 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  cord. Otherwise,
1ed00 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  .    ** proceed.
1ed10 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1ed20 4c 53 4d 5f 4f 4b 20 26 26 20 28 72 74 49 73 53  LSM_OK && (rtIsS
1ed30 65 70 61 72 61 74 6f 72 28 65 54 79 70 65 29 3d  eparator(eType)=
1ed40 3d 30 20 7c 7c 20 69 50 74 72 21 3d 30 29 20 29  =0 || iPtr!=0) )
1ed50 7b 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  {.      /* Write
1ed60 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f   the record into
1ed70 20 74 68 65 20 6d 61 69 6e 20 72 75 6e 2e 20 2a   the main run. *
1ed80 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 56  /.      void *pV
1ed90 61 6c 3b 20 69 6e 74 20 6e 56 61 6c 3b 0a 20 20  al; int nVal;.  
1eda0 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75      rc = multiCu
1edb0 72 73 6f 72 47 65 74 56 61 6c 28 70 43 73 72 2c  rsorGetVal(pCsr,
1edc0 20 69 56 61 6c 2c 20 26 70 56 61 6c 2c 20 26 6e   iVal, &pVal, &n
1edd0 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
1ede0 70 56 61 6c 20 26 26 20 72 63 3d 3d 4c 53 4d 5f  pVal && rc==LSM_
1edf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
1ee00 73 65 72 74 28 20 6e 56 61 6c 3e 3d 30 20 29 3b  sert( nVal>=0 );
1ee10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 6f  .        rc = so
1ee20 72 74 65 64 42 6c 6f 62 53 65 74 28 70 44 62 2d  rtedBlobSet(pDb-
1ee30 3e 70 45 6e 76 2c 20 26 70 43 73 72 2d 3e 76 61  >pEnv, &pCsr->va
1ee40 6c 2c 20 70 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a  l, pVal, nVal);.
1ee50 20 20 20 20 20 20 20 20 70 56 61 6c 20 3d 20 70          pVal = p
1ee60 43 73 72 2d 3e 76 61 6c 2e 70 44 61 74 61 3b 0a  Csr->val.pData;.
1ee70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1ee80 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
1ee90 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 72          rc = mer
1eea0 67 65 57 6f 72 6b 65 72 57 72 69 74 65 28 70 4d  geWorkerWrite(pM
1eeb0 57 2c 20 65 54 79 70 65 2c 20 70 4b 65 79 2c 20  W, eType, pKey, 
1eec0 6e 4b 65 79 2c 20 70 56 61 6c 2c 20 6e 56 61 6c  nKey, pVal, nVal
1eed0 2c 20 28 69 6e 74 29 69 50 74 72 29 3b 0a 20 20  , (int)iPtr);.  
1eee0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1eef0 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 68  .  /* Advance th
1ef00 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
1ef10 6e 65 78 74 20 69 6e 70 75 74 20 72 65 63 6f 72  next input recor
1ef20 64 20 28 61 73 73 75 6d 69 6e 67 20 6f 6e 65 20  d (assuming one 
1ef30 65 78 69 73 74 73 29 2e 20 2a 2f 0a 20 20 61 73  exists). */.  as
1ef40 73 65 72 74 28 20 6c 73 6d 4d 43 75 72 73 6f 72  sert( lsmMCursor
1ef50 56 61 6c 69 64 28 70 4d 57 2d 3e 70 43 73 72 29  Valid(pMW->pCsr)
1ef60 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53   );.  if( rc==LS
1ef70 4d 5f 4f 4b 20 29 20 72 63 20 3d 20 6c 73 6d 4d  M_OK ) rc = lsmM
1ef80 43 75 72 73 6f 72 4e 65 78 74 28 70 4d 57 2d 3e  CursorNext(pMW->
1ef90 70 43 73 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pCsr);..  return
1efa0 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
1efb0 6e 74 20 6d 65 72 67 65 57 6f 72 6b 65 72 44 6f  nt mergeWorkerDo
1efc0 6e 65 28 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a  ne(MergeWorker *
1efd0 70 4d 57 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pMW){.  return p
1efe0 4d 57 2d 3e 70 43 73 72 3d 3d 30 20 7c 7c 20 21  MW->pCsr==0 || !
1eff0 6c 73 6d 4d 43 75 72 73 6f 72 56 61 6c 69 64 28  lsmMCursorValid(
1f000 70 4d 57 2d 3e 70 43 73 72 29 3b 0a 7d 0a 0a 73  pMW->pCsr);.}..s
1f010 74 61 74 69 63 20 76 6f 69 64 20 73 6f 72 74 65  tatic void sorte
1f020 64 46 72 65 65 4c 65 76 65 6c 28 6c 73 6d 5f 65  dFreeLevel(lsm_e
1f030 6e 76 20 2a 70 45 6e 76 2c 20 4c 65 76 65 6c 20  nv *pEnv, Level 
1f040 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
1f050 20 20 20 20 6c 73 6d 46 72 65 65 28 70 45 6e 76      lsmFree(pEnv
1f060 2c 20 70 2d 3e 70 53 70 6c 69 74 4b 65 79 29 3b  , p->pSplitKey);
1f070 0a 20 20 20 20 6c 73 6d 46 72 65 65 28 70 45 6e  .    lsmFree(pEn
1f080 76 2c 20 70 2d 3e 70 4d 65 72 67 65 29 3b 0a 20  v, p->pMerge);. 
1f090 20 20 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c     lsmFree(pEnv,
1f0a0 20 70 2d 3e 61 52 68 73 29 3b 0a 20 20 20 20 6c   p->aRhs);.    l
1f0b0 73 6d 46 72 65 65 28 70 45 6e 76 2c 20 70 29 3b  smFree(pEnv, p);
1f0c0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
1f0d0 6f 69 64 20 73 6f 72 74 65 64 49 6e 76 6f 6b 65  oid sortedInvoke
1f0e0 57 6f 72 6b 48 6f 6f 6b 28 6c 73 6d 5f 64 62 20  WorkHook(lsm_db 
1f0f0 2a 70 44 62 29 7b 0a 20 20 69 66 28 20 70 44 62  *pDb){.  if( pDb
1f100 2d 3e 78 57 6f 72 6b 20 29 7b 0a 20 20 20 20 70  ->xWork ){.    p
1f110 44 62 2d 3e 78 57 6f 72 6b 28 70 44 62 2c 20 70  Db->xWork(pDb, p
1f120 44 62 2d 3e 70 57 6f 72 6b 43 74 78 29 3b 0a 20  Db->pWorkCtx);. 
1f130 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74   }.}..static int
1f140 20 73 6f 72 74 65 64 4e 65 77 54 6f 70 6c 65 76   sortedNewToplev
1f150 65 6c 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44  el(.  lsm_db *pD
1f160 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
1f170 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1f180 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ion handle */.  
1f190 69 6e 74 20 65 54 72 65 65 2c 20 20 20 20 20 20  int eTree,      
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 54 52  /* One of the TR
1f1c0 45 45 5f 58 58 58 20 63 6f 6e 73 74 61 6e 74 73  EE_XXX constants
1f1d0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 57 72 69   */.  int *pnWri
1f1e0 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  te              
1f1f0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75        /* OUT: Nu
1f200 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
1f210 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a   pages written *
1f220 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
1f230 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  LSM_OK;         
1f240 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1f250 20 43 6f 64 65 20 2a 2f 0a 20 20 4d 75 6c 74 69   Code */.  Multi
1f260 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 30  Cursor *pCsr = 0
1f270 3b 0a 20 20 4c 65 76 65 6c 20 2a 70 4e 65 78 74  ;.  Level *pNext
1f280 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f290 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65      /* The curre
1f2a0 6e 74 20 74 6f 70 20 6c 65 76 65 6c 20 2a 2f 0a  nt top level */.
1f2b0 20 20 4c 65 76 65 6c 20 2a 70 4e 65 77 3b 20 20    Level *pNew;  
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 76    /* The new lev
1f2e0 65 6c 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 53  el itself */.  S
1f2f0 65 67 6d 65 6e 74 20 2a 70 4c 69 6e 6b 65 64 20  egment *pLinked 
1f300 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1f310 2a 20 44 65 6c 65 74 65 20 73 65 70 61 72 61 74  * Delete separat
1f320 6f 72 73 20 66 72 6f 6d 20 74 68 69 73 20 73 65  ors from this se
1f330 67 6d 65 6e 74 20 2a 2f 0a 20 20 4c 65 76 65 6c  gment */.  Level
1f340 20 2a 70 44 65 6c 20 3d 20 30 3b 20 20 20 20 20   *pDel = 0;     
1f350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1f360 6c 65 74 65 20 74 68 69 73 20 65 6e 74 69 72 65  lete this entire
1f370 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20   level */.  int 
1f380 6e 57 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20  nWrite = 0;     
1f390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f3a0 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
1f3b0 65 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  e pages written 
1f3c0 2a 2f 0a 20 20 46 72 65 65 6c 69 73 74 20 66 72  */.  Freelist fr
1f3d0 65 65 6c 69 73 74 3b 0a 0a 20 20 69 66 28 20 65  eelist;..  if( e
1f3e0 54 72 65 65 21 3d 54 52 45 45 5f 4e 4f 4e 45 20  Tree!=TREE_NONE 
1f3f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 53  ){.    rc = lsmS
1f400 68 6d 43 61 63 68 65 43 68 75 6e 6b 73 28 70 44  hmCacheChunks(pD
1f410 62 2c 20 70 44 62 2d 3e 74 72 65 65 68 64 72 2e  b, pDb->treehdr.
1f420 6e 43 68 75 6e 6b 29 3b 0a 20 20 7d 0a 0a 20 20  nChunk);.  }..  
1f430 61 73 73 65 72 74 28 20 70 44 62 2d 3e 62 55 73  assert( pDb->bUs
1f440 65 46 72 65 65 6c 69 73 74 3d 3d 30 20 29 3b 0a  eFreelist==0 );.
1f450 20 20 70 44 62 2d 3e 70 46 72 65 65 6c 69 73 74    pDb->pFreelist
1f460 20 3d 20 26 66 72 65 65 6c 69 73 74 3b 0a 20 20   = &freelist;.  
1f470 70 44 62 2d 3e 62 55 73 65 46 72 65 65 6c 69 73  pDb->bUseFreelis
1f480 74 20 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  t = 1;.  memset(
1f490 26 66 72 65 65 6c 69 73 74 2c 20 30 2c 20 73 69  &freelist, 0, si
1f4a0 7a 65 6f 66 28 66 72 65 65 6c 69 73 74 29 29 3b  zeof(freelist));
1f4b0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1f4c0 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 20 73 74  the new level st
1f4d0 72 75 63 74 75 72 65 20 74 6f 20 77 72 69 74 65  ructure to write
1f4e0 20 74 6f 2e 20 2a 2f 0a 20 20 70 4e 65 78 74 20   to. */.  pNext 
1f4f0 3d 20 6c 73 6d 44 62 53 6e 61 70 73 68 6f 74 4c  = lsmDbSnapshotL
1f500 65 76 65 6c 28 70 44 62 2d 3e 70 57 6f 72 6b 65  evel(pDb->pWorke
1f510 72 29 3b 0a 20 20 70 4e 65 77 20 3d 20 28 4c 65  r);.  pNew = (Le
1f520 76 65 6c 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a  vel *)lsmMallocZ
1f530 65 72 6f 52 63 28 70 44 62 2d 3e 70 45 6e 76 2c  eroRc(pDb->pEnv,
1f540 20 73 69 7a 65 6f 66 28 4c 65 76 65 6c 29 2c 20   sizeof(Level), 
1f550 26 72 63 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  &rc);.  if( pNew
1f560 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e   ){.    pNew->pN
1f570 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20  ext = pNext;.   
1f580 20 6c 73 6d 44 62 53 6e 61 70 73 68 6f 74 53 65   lsmDbSnapshotSe
1f590 74 4c 65 76 65 6c 28 70 44 62 2d 3e 70 57 6f 72  tLevel(pDb->pWor
1f5a0 6b 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 7d 0a  ker, pNew);.  }.
1f5b0 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 63  .  /* Create a c
1f5c0 75 72 73 6f 72 20 74 6f 20 67 61 74 68 65 72 20  ursor to gather 
1f5d0 74 68 65 20 64 61 74 61 20 72 65 71 75 69 72 65  the data require
1f5e0 64 20 62 79 20 74 68 65 20 6e 65 77 20 73 65 67  d by the new seg
1f5f0 6d 65 6e 74 2e 20 54 68 65 20 6e 65 77 0a 20 20  ment. The new.  
1f600 2a 2a 20 73 65 67 6d 65 6e 74 20 63 6f 6e 74 61  ** segment conta
1f610 69 6e 73 20 65 76 65 72 79 74 68 69 6e 67 20 69  ins everything i
1f620 6e 20 74 68 65 20 74 72 65 65 20 61 6e 64 20 70  n the tree and p
1f630 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6e  ointers to the n
1f640 65 78 74 20 73 65 67 6d 65 6e 74 0a 20 20 2a 2a  ext segment.  **
1f650 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1f660 20 28 69 66 20 61 6e 79 29 2e 20 20 2a 2f 0a 20   (if any).  */. 
1f670 20 70 43 73 72 20 3d 20 6d 75 6c 74 69 43 75 72   pCsr = multiCur
1f680 73 6f 72 4e 65 77 28 70 44 62 2c 20 26 72 63 29  sorNew(pDb, &rc)
1f690 3b 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b 0a  ;.  if( pCsr ){.
1f6a0 20 20 20 20 70 43 73 72 2d 3e 70 44 62 20 3d 20      pCsr->pDb = 
1f6b0 70 44 62 3b 0a 20 20 20 20 72 63 20 3d 20 6d 75  pDb;.    rc = mu
1f6c0 6c 74 69 43 75 72 73 6f 72 56 69 73 69 74 46 72  ltiCursorVisitFr
1f6d0 65 65 6c 69 73 74 28 70 43 73 72 29 3b 0a 20 20  eelist(pCsr);.  
1f6e0 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b    if( rc==LSM_OK
1f6f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
1f700 75 6c 74 69 43 75 72 73 6f 72 41 64 64 54 72 65  ultiCursorAddTre
1f710 65 28 70 43 73 72 2c 20 70 44 62 2d 3e 70 57 6f  e(pCsr, pDb->pWo
1f720 72 6b 65 72 2c 20 65 54 72 65 65 29 3b 0a 20 20  rker, eTree);.  
1f730 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1f740 4c 53 4d 5f 4f 4b 20 26 26 20 70 4e 65 78 74 20  LSM_OK && pNext 
1f750 26 26 20 70 4e 65 78 74 2d 3e 70 4d 65 72 67 65  && pNext->pMerge
1f760 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
1f770 20 28 70 4e 65 78 74 2d 3e 66 6c 61 67 73 20 26   (pNext->flags &
1f780 20 4c 45 56 45 4c 5f 46 52 45 45 4c 49 53 54 5f   LEVEL_FREELIST_
1f790 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 20  ONLY) ){.       
1f7a0 20 70 44 65 6c 20 3d 20 70 4e 65 78 74 3b 0a 20   pDel = pNext;. 
1f7b0 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 50 74         pCsr->aPt
1f7c0 72 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72  r = lsmMallocZer
1f7d0 6f 52 63 28 70 44 62 2d 3e 70 45 6e 76 2c 20 73  oRc(pDb->pEnv, s
1f7e0 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 50 74 72  izeof(SegmentPtr
1f7f0 29 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  ), &rc);.       
1f800 20 6d 75 6c 74 69 43 75 72 73 6f 72 41 64 64 4f   multiCursorAddO
1f810 6e 65 28 70 43 73 72 2c 20 70 4e 65 78 74 2c 20  ne(pCsr, pNext, 
1f820 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  &rc);.      }els
1f830 65 20 69 66 28 20 65 54 72 65 65 21 3d 54 52 45  e if( eTree!=TRE
1f840 45 5f 4e 4f 4e 45 20 26 26 20 70 4e 65 78 74 2d  E_NONE && pNext-
1f850 3e 6c 68 73 2e 69 52 6f 6f 74 20 29 7b 0a 20 20  >lhs.iRoot ){.  
1f860 20 20 20 20 20 20 70 4c 69 6e 6b 65 64 20 3d 20        pLinked = 
1f870 26 70 4e 65 78 74 2d 3e 6c 68 73 3b 0a 20 20 20  &pNext->lhs;.   
1f880 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43       rc = btreeC
1f890 75 72 73 6f 72 4e 65 77 28 70 44 62 2c 20 70 4c  ursorNew(pDb, pL
1f8a0 69 6e 6b 65 64 2c 20 26 70 43 73 72 2d 3e 70 42  inked, &pCsr->pB
1f8b0 74 43 73 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCsr);.      }. 
1f8c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1f8d0 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
1f8e0 20 6f 6e 6c 79 20 73 65 67 6d 65 6e 74 20 69 6e   only segment in
1f8f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
1f900 69 73 63 61 72 64 20 61 6e 79 20 64 65 6c 65 74  iscard any delet
1f910 65 0a 20 20 20 20 2a 2a 20 6d 61 72 6b 65 72 73  e.    ** markers
1f920 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
1f930 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65 2e 20  in-memory tree. 
1f940 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 78   */.    if( pNex
1f950 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 75  t==0 ){.      mu
1f960 6c 74 69 43 75 72 73 6f 72 49 67 6e 6f 72 65 44  ltiCursorIgnoreD
1f970 65 6c 65 74 65 28 70 43 73 72 29 3b 0a 20 20 20  elete(pCsr);.   
1f980 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
1f990 21 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=LSM_OK ){.    
1f9a0 6c 73 6d 4d 43 75 72 73 6f 72 43 6c 6f 73 65 28  lsmMCursorClose(
1f9b0 70 43 73 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  pCsr, 0);.  }els
1f9c0 65 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4c 65 66  e{.    Pgno iLef
1f9d0 74 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 4d 65  tPtr = 0;.    Me
1f9e0 72 67 65 20 6d 65 72 67 65 3b 20 20 20 20 20 20  rge merge;      
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1fa00 65 72 67 65 20 6f 62 6a 65 63 74 20 75 73 65 64  erge object used
1fa10 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 6c   to create new l
1fa20 65 76 65 6c 20 2a 2f 0a 20 20 20 20 4d 65 72 67  evel */.    Merg
1fa30 65 57 6f 72 6b 65 72 20 6d 65 72 67 65 77 6f 72  eWorker mergewor
1fa40 6b 65 72 3b 20 20 20 20 20 20 2f 2a 20 4d 65 72  ker;      /* Mer
1fa50 67 65 57 6f 72 6b 65 72 20 6f 62 6a 65 63 74 20  geWorker object 
1fa60 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 75 72  for the same pur
1fa70 70 6f 73 65 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d  pose */..    mem
1fa80 73 65 74 28 26 6d 65 72 67 65 2c 20 30 2c 20 73  set(&merge, 0, s
1fa90 69 7a 65 6f 66 28 4d 65 72 67 65 29 29 3b 0a 20  izeof(Merge));. 
1faa0 20 20 20 6d 65 6d 73 65 74 28 26 6d 65 72 67 65     memset(&merge
1fab0 77 6f 72 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f  worker, 0, sizeo
1fac0 66 28 4d 65 72 67 65 57 6f 72 6b 65 72 29 29 3b  f(MergeWorker));
1fad0 0a 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 72  ..    pNew->pMer
1fae0 67 65 20 3d 20 26 6d 65 72 67 65 3b 0a 20 20 20  ge = &merge;.   
1faf0 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
1fb00 4c 45 56 45 4c 5f 49 4e 43 4f 4d 50 4c 45 54 45  LEVEL_INCOMPLETE
1fb10 3b 0a 20 20 20 20 6d 65 72 67 65 77 6f 72 6b 65  ;.    mergeworke
1fb20 72 2e 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 20  r.pDb = pDb;.   
1fb30 20 6d 65 72 67 65 77 6f 72 6b 65 72 2e 70 4c 65   mergeworker.pLe
1fb40 76 65 6c 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  vel = pNew;.    
1fb50 6d 65 72 67 65 77 6f 72 6b 65 72 2e 70 43 73 72  mergeworker.pCsr
1fb60 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 70 43 73   = pCsr;.    pCs
1fb70 72 2d 3e 70 50 72 65 76 4d 65 72 67 65 50 74 72  r->pPrevMergePtr
1fb80 20 3d 20 26 69 4c 65 66 74 50 74 72 3b 0a 0a 20   = &iLeftPtr;.. 
1fb90 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 73     /* Mark the s
1fba0 65 70 61 72 61 74 6f 72 73 20 61 72 72 61 79 20  eparators array 
1fbb0 66 6f 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65  for the new leve
1fbc0 6c 20 61 73 20 61 20 22 70 68 61 6e 74 6f 6d 22  l as a "phantom"
1fbd0 2e 20 2a 2f 0a 20 20 20 20 6d 65 72 67 65 77 6f  . */.    mergewo
1fbe0 72 6b 65 72 2e 62 46 6c 75 73 68 20 3d 20 31 3b  rker.bFlush = 1;
1fbf0 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
1fc00 77 6f 72 6b 20 74 6f 20 63 72 65 61 74 65 20 74  work to create t
1fc10 68 65 20 6e 65 77 20 6d 65 72 67 65 64 20 73 65  he new merged se
1fc20 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 20 2a 2f  gment on disk */
1fc30 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d  .    if( rc==LSM
1fc40 5f 4f 4b 20 29 20 72 63 20 3d 20 6c 73 6d 4d 43  _OK ) rc = lsmMC
1fc50 75 72 73 6f 72 46 69 72 73 74 28 70 43 73 72 29  ursorFirst(pCsr)
1fc60 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
1fc70 3d 4c 53 4d 5f 4f 4b 20 26 26 20 6d 65 72 67 65  =LSM_OK && merge
1fc80 57 6f 72 6b 65 72 44 6f 6e 65 28 26 6d 65 72 67  WorkerDone(&merg
1fc90 65 77 6f 72 6b 65 72 29 3d 3d 30 20 29 7b 0a 20  eworker)==0 ){. 
1fca0 20 20 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57       rc = mergeW
1fcb0 6f 72 6b 65 72 53 74 65 70 28 26 6d 65 72 67 65  orkerStep(&merge
1fcc0 77 6f 72 6b 65 72 29 3b 0a 20 20 20 20 7d 0a 20  worker);.    }. 
1fcd0 20 20 20 6d 65 72 67 65 57 6f 72 6b 65 72 53 68     mergeWorkerSh
1fce0 75 74 64 6f 77 6e 28 26 6d 65 72 67 65 77 6f 72  utdown(&mergewor
1fcf0 6b 65 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 61  ker, &rc);.    a
1fd00 73 73 65 72 74 28 20 72 63 21 3d 4c 53 4d 5f 4f  ssert( rc!=LSM_O
1fd10 4b 20 7c 7c 20 6d 65 72 67 65 77 6f 72 6b 65 72  K || mergeworker
1fd20 2e 6e 57 6f 72 6b 3d 3d 30 20 7c 7c 20 70 4e 65  .nWork==0 || pNe
1fd30 77 2d 3e 6c 68 73 2e 69 46 69 72 73 74 20 29 3b  w->lhs.iFirst );
1fd40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d  .    if( rc==LSM
1fd50 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 6c 68 73  _OK && pNew->lhs
1fd60 2e 69 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20  .iFirst ){.     
1fd70 20 72 63 20 3d 20 6c 73 6d 46 73 53 6f 72 74 65   rc = lsmFsSorte
1fd80 64 46 69 6e 69 73 68 28 70 44 62 2d 3e 70 46 53  dFinish(pDb->pFS
1fd90 2c 20 26 70 4e 65 77 2d 3e 6c 68 73 29 3b 0a 20  , &pNew->lhs);. 
1fda0 20 20 20 7d 0a 20 20 20 20 6e 57 72 69 74 65 20     }.    nWrite 
1fdb0 3d 20 6d 65 72 67 65 77 6f 72 6b 65 72 2e 6e 57  = mergeworker.nW
1fdc0 6f 72 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66  ork;.    pNew->f
1fdd0 6c 61 67 73 20 26 3d 20 7e 4c 45 56 45 4c 5f 49  lags &= ~LEVEL_I
1fde0 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 69  NCOMPLETE;.    i
1fdf0 66 28 20 65 54 72 65 65 3d 3d 54 52 45 45 5f 4e  f( eTree==TREE_N
1fe00 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  ONE ){.      pNe
1fe10 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 4c 45 56 45  w->flags |= LEVE
1fe20 4c 5f 46 52 45 45 4c 49 53 54 5f 4f 4e 4c 59 3b  L_FREELIST_ONLY;
1fe30 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
1fe40 3e 70 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d  >pMerge = 0;.  }
1fe50 0a 0a 20 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f  ..  if( rc!=LSM_
1fe60 4f 4b 20 7c 7c 20 70 4e 65 77 2d 3e 6c 68 73 2e  OK || pNew->lhs.
1fe70 69 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20  iFirst==0 ){.   
1fe80 20 61 73 73 65 72 74 28 20 72 63 21 3d 4c 53 4d   assert( rc!=LSM
1fe90 5f 4f 4b 20 7c 7c 20 70 44 62 2d 3e 70 57 6f 72  _OK || pDb->pWor
1fea0 6b 65 72 2d 3e 66 72 65 65 6c 69 73 74 2e 6e 45  ker->freelist.nE
1feb0 6e 74 72 79 3d 3d 30 20 29 3b 0a 20 20 20 20 6c  ntry==0 );.    l
1fec0 73 6d 44 62 53 6e 61 70 73 68 6f 74 53 65 74 4c  smDbSnapshotSetL
1fed0 65 76 65 6c 28 70 44 62 2d 3e 70 57 6f 72 6b 65  evel(pDb->pWorke
1fee0 72 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 73  r, pNext);.    s
1fef0 6f 72 74 65 64 46 72 65 65 4c 65 76 65 6c 28 70  ortedFreeLevel(p
1ff00 44 62 2d 3e 70 45 6e 76 2c 20 70 4e 65 77 29 3b  Db->pEnv, pNew);
1ff10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1ff20 28 20 70 4c 69 6e 6b 65 64 20 29 7b 0a 20 20 20  ( pLinked ){.   
1ff30 20 20 20 70 4c 69 6e 6b 65 64 2d 3e 69 52 6f 6f     pLinked->iRoo
1ff40 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
1ff50 20 69 66 28 20 70 44 65 6c 20 29 7b 0a 20 20 20   if( pDel ){.   
1ff60 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
1ff70 3e 70 4e 65 78 74 3d 3d 70 44 65 6c 20 29 3b 0a  >pNext==pDel );.
1ff80 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78        pNew->pNex
1ff90 74 20 3d 20 70 44 65 6c 2d 3e 70 4e 65 78 74 3b  t = pDel->pNext;
1ffa0 0a 20 20 20 20 20 20 6c 73 6d 46 73 53 6f 72 74  .      lsmFsSort
1ffb0 65 64 44 65 6c 65 74 65 28 70 44 62 2d 3e 70 46  edDelete(pDb->pF
1ffc0 53 2c 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2c  S, pDb->pWorker,
1ffd0 20 31 2c 20 26 70 44 65 6c 2d 3e 6c 68 73 29 3b   1, &pDel->lhs);
1ffe0 0a 20 20 20 20 20 20 73 6f 72 74 65 64 46 72 65  .      sortedFre
1fff0 65 4c 65 76 65 6c 28 70 44 62 2d 3e 70 45 6e 76  eLevel(pDb->pEnv
20000 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a  , pDel);.    }..
20010 23 69 66 20 4c 53 4d 5f 4c 4f 47 5f 53 54 52 55  #if LSM_LOG_STRU
20020 43 54 55 52 45 0a 20 20 20 20 6c 73 6d 53 6f 72  CTURE.    lsmSor
20030 74 65 64 44 75 6d 70 53 74 72 75 63 74 75 72 65  tedDumpStructure
20040 28 70 44 62 2c 20 70 44 62 2d 3e 70 57 6f 72 6b  (pDb, pDb->pWork
20050 65 72 2c 20 4c 53 4d 5f 4c 4f 47 5f 44 41 54 41  er, LSM_LOG_DATA
20060 2c 20 30 2c 20 22 6e 65 77 2d 74 6f 70 6c 65 76  , 0, "new-toplev
20070 65 6c 22 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  el");.#endif..  
20080 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 2e 6e    if( freelist.n
20090 45 6e 74 72 79 20 29 7b 0a 20 20 20 20 20 20 46  Entry ){.      F
200a0 72 65 65 6c 69 73 74 20 2a 70 20 3d 20 26 70 44  reelist *p = &pD
200b0 62 2d 3e 70 57 6f 72 6b 65 72 2d 3e 66 72 65 65  b->pWorker->free
200c0 6c 69 73 74 3b 0a 20 20 20 20 20 20 6c 73 6d 46  list;.      lsmF
200d0 72 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70  ree(pDb->pEnv, p
200e0 2d 3e 61 45 6e 74 72 79 29 3b 0a 20 20 20 20 20  ->aEntry);.     
200f0 20 6d 65 6d 63 70 79 28 70 2c 20 26 66 72 65 65   memcpy(p, &free
20100 6c 69 73 74 2c 20 73 69 7a 65 6f 66 28 66 72 65  list, sizeof(fre
20110 65 6c 69 73 74 29 29 3b 0a 20 20 20 20 20 20 66  elist));.      f
20120 72 65 65 6c 69 73 74 2e 61 45 6e 74 72 79 20 3d  reelist.aEntry =
20130 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
20140 20 20 20 20 20 70 44 62 2d 3e 70 57 6f 72 6b 65       pDb->pWorke
20150 72 2d 3e 66 72 65 65 6c 69 73 74 2e 6e 45 6e 74  r->freelist.nEnt
20160 72 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ry = 0;.    }.. 
20170 20 20 20 61 73 73 65 72 74 42 74 72 65 65 4f 6b     assertBtreeOk
20180 28 70 44 62 2c 20 26 70 4e 65 77 2d 3e 6c 68 73  (pDb, &pNew->lhs
20190 29 3b 0a 20 20 20 20 73 6f 72 74 65 64 49 6e 76  );.    sortedInv
201a0 6f 6b 65 57 6f 72 6b 48 6f 6f 6b 28 70 44 62 29  okeWorkHook(pDb)
201b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 6e 57  ;.  }..  if( pnW
201c0 72 69 74 65 20 29 20 2a 70 6e 57 72 69 74 65 20  rite ) *pnWrite 
201d0 3d 20 6e 57 72 69 74 65 3b 0a 20 20 70 44 62 2d  = nWrite;.  pDb-
201e0 3e 70 57 6f 72 6b 65 72 2d 3e 6e 57 72 69 74 65  >pWorker->nWrite
201f0 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 70 44   += nWrite;.  pD
20200 62 2d 3e 70 46 72 65 65 6c 69 73 74 20 3d 20 30  b->pFreelist = 0
20210 3b 0a 20 20 70 44 62 2d 3e 62 55 73 65 46 72 65  ;.  pDb->bUseFre
20220 65 6c 69 73 74 20 3d 20 30 3b 0a 20 20 6c 73 6d  elist = 0;.  lsm
20230 46 72 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20  Free(pDb->pEnv, 
20240 66 72 65 65 6c 69 73 74 2e 61 45 6e 74 72 79 29  freelist.aEntry)
20250 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20260 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 4d 65 72  ../*.** The nMer
20270 67 65 20 6c 65 76 65 6c 73 20 69 6e 20 74 68 65  ge levels in the
20280 20 4c 53 4d 20 62 65 67 69 6e 6e 69 6e 67 20 77   LSM beginning w
20290 69 74 68 20 70 4c 65 76 65 6c 20 63 6f 6e 73 69  ith pLevel consi
202a0 73 74 20 6f 66 20 61 0a 2a 2a 20 6c 65 66 74 2d  st of a.** left-
202b0 68 61 6e 64 2d 73 69 64 65 20 73 65 67 6d 65 6e  hand-side segmen
202c0 74 20 6f 6e 6c 79 2e 20 52 65 70 6c 61 63 65 20  t only. Replace 
202d0 74 68 65 73 65 20 6c 65 76 65 6c 73 20 77 69 74  these levels wit
202e0 68 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 0a 2a  h a single new.*
202f0 2a 20 6c 65 76 65 6c 20 63 6f 6e 73 69 73 74 69  * level consisti
20300 6e 67 20 6f 66 20 61 20 6e 65 77 20 65 6d 70 74  ng of a new empt
20310 79 20 73 65 67 6d 65 6e 74 20 6f 6e 20 74 68 65  y segment on the
20320 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
20330 61 6e 64 20 74 68 65 0a 2a 2a 20 6e 4d 65 72 67  and the.** nMerg
20340 65 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  e segments from 
20350 74 68 65 20 72 65 70 6c 61 63 65 64 20 6c 65 76  the replaced lev
20360 65 6c 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74  els on the right
20370 2d 68 61 6e 64 2d 73 69 64 65 2e 0a 2a 2a 0a 2a  -hand-side..**.*
20380 2a 20 41 6c 73 6f 2c 20 61 6c 6c 6f 63 61 74 65  * Also, allocate
20390 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 20   and populate a 
203a0 4d 65 72 67 65 20 6f 62 6a 65 63 74 20 61 6e 64  Merge object and
203b0 20 73 65 74 20 4c 65 76 65 6c 2e 70 4d 65 72 67   set Level.pMerg
203c0 65 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  e to.** point to
203d0 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
203e0 6e 74 20 73 6f 72 74 65 64 4d 65 72 67 65 53 65  nt sortedMergeSe
203f0 74 75 70 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70  tup(.  lsm_db *p
20400 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
20410 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
20420 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 4c  se handle */.  L
20430 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20  evel *pLevel,   
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20450 2a 20 46 69 72 73 74 20 6c 65 76 65 6c 20 74 6f  * First level to
20460 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20   merge */.  int 
20470 6e 4d 65 72 67 65 2c 20 20 20 20 20 20 20 20 20  nMerge,         
20480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
20490 65 72 67 65 20 74 68 69 73 20 6d 61 6e 79 20 6c  erge this many l
204a0 65 76 65 6c 73 20 74 6f 67 65 74 68 65 72 20 2a  evels together *
204b0 2f 0a 20 20 4c 65 76 65 6c 20 2a 2a 70 70 4e 65  /.  Level **ppNe
204c0 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
204d0 20 20 20 20 2f 2a 20 4e 65 77 2c 20 6d 65 72 67      /* New, merg
204e0 65 64 2c 20 6c 65 76 65 6c 20 2a 2f 0a 29 7b 0a  ed, level */.){.
204f0 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f    int rc = LSM_O
20500 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
20510 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
20520 20 2a 2f 0a 20 20 4c 65 76 65 6c 20 2a 70 4e 65   */.  Level *pNe
20530 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
20540 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 4c 65 76        /* New Lev
20550 65 6c 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  el object */.  i
20560 6e 74 20 62 55 73 65 4e 65 78 74 20 3d 20 30 3b  nt bUseNext = 0;
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20580 2a 20 54 72 75 65 20 74 6f 20 6c 69 6e 6b 20 69  * True to link i
20590 6e 20 6e 65 78 74 20 73 65 70 61 72 61 74 6f 72  n next separator
205a0 73 20 2a 2f 0a 20 20 4d 65 72 67 65 20 2a 70 4d  s */.  Merge *pM
205b0 65 72 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  erge;           
205c0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 4d 65         /* New Me
205d0 72 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  rge object */.  
205e0 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
20610 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70  e allocated at p
20620 4d 65 72 67 65 20 2a 2f 0a 0a 23 69 66 64 65 66  Merge */..#ifdef
20630 20 4c 53 4d 5f 44 45 42 55 47 0a 20 20 69 6e 74   LSM_DEBUG.  int
20640 20 69 4c 65 76 65 6c 3b 0a 20 20 4c 65 76 65 6c   iLevel;.  Level
20650 20 2a 70 58 20 3d 20 70 4c 65 76 65 6c 3b 0a 20   *pX = pLevel;. 
20660 20 66 6f 72 28 69 4c 65 76 65 6c 3d 30 3b 20 69   for(iLevel=0; i
20670 4c 65 76 65 6c 3c 6e 4d 65 72 67 65 3b 20 69 4c  Level<nMerge; iL
20680 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 61 73 73  evel++){.    ass
20690 65 72 74 28 20 70 58 2d 3e 6e 52 69 67 68 74 3d  ert( pX->nRight=
206a0 3d 30 20 29 3b 0a 20 20 20 20 70 58 20 3d 20 70  =0 );.    pX = p
206b0 58 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65  X->pNext;.  }.#e
206c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ndif..  /* Alloc
206d0 61 74 65 20 74 68 65 20 6e 65 77 20 4c 65 76 65  ate the new Leve
206e0 6c 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 4e  l object */.  pN
206f0 65 77 20 3d 20 28 4c 65 76 65 6c 20 2a 29 6c 73  ew = (Level *)ls
20700 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63 28 70 44  mMallocZeroRc(pD
20710 62 2d 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28  b->pEnv, sizeof(
20720 4c 65 76 65 6c 29 2c 20 26 72 63 29 3b 0a 20 20  Level), &rc);.  
20730 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
20740 70 4e 65 77 2d 3e 61 52 68 73 20 3d 20 28 53 65  pNew->aRhs = (Se
20750 67 6d 65 6e 74 20 2a 29 6c 73 6d 4d 61 6c 6c 6f  gment *)lsmMallo
20760 63 5a 65 72 6f 52 63 28 70 44 62 2d 3e 70 45 6e  cZeroRc(pDb->pEn
20770 76 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  v, .            
20780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20790 20 20 20 20 20 20 20 20 20 20 20 20 6e 4d 65 72              nMer
207a0 67 65 20 2a 20 73 69 7a 65 6f 66 28 53 65 67 6d  ge * sizeof(Segm
207b0 65 6e 74 29 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  ent), &rc);.  }.
207c0 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74  .  /* Populate t
207d0 68 65 20 6e 65 77 20 4c 65 76 65 6c 20 6f 62 6a  he new Level obj
207e0 65 63 74 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ect */.  if( rc=
207f0 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 4c  =LSM_OK ){.    L
20800 65 76 65 6c 20 2a 70 4e 65 78 74 20 3d 20 30 3b  evel *pNext = 0;
20810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20820 4c 65 76 65 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20  Level following 
20830 70 4e 65 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20  pNew */.    int 
20840 69 3b 0a 20 20 20 20 69 6e 74 20 62 46 72 65 65  i;.    int bFree
20850 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 4c 65  Only = 1;.    Le
20860 76 65 6c 20 2a 70 54 6f 70 4c 65 76 65 6c 3b 0a  vel *pTopLevel;.
20870 20 20 20 20 4c 65 76 65 6c 20 2a 70 20 3d 20 70      Level *p = p
20880 4c 65 76 65 6c 3b 0a 20 20 20 20 4c 65 76 65 6c  Level;.    Level
20890 20 2a 2a 70 70 3b 0a 20 20 20 20 70 4e 65 77 2d   **pp;.    pNew-
208a0 3e 6e 52 69 67 68 74 20 3d 20 6e 4d 65 72 67 65  >nRight = nMerge
208b0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 41 67 65  ;.    pNew->iAge
208c0 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 41 67 65 2b   = pLevel->iAge+
208d0 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  1;.    for(i=0; 
208e0 69 3c 6e 4d 65 72 67 65 3b 20 69 2b 2b 29 7b 0a  i<nMerge; i++){.
208f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
20900 3e 6e 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >nRight==0 );.  
20910 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
20920 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Next;.      pNew
20930 2d 3e 61 52 68 73 5b 69 5d 20 3d 20 70 2d 3e 6c  ->aRhs[i] = p->l
20940 68 73 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  hs;.      if( (p
20950 2d 3e 66 6c 61 67 73 20 26 20 4c 45 56 45 4c 5f  ->flags & LEVEL_
20960 46 52 45 45 4c 49 53 54 5f 4f 4e 4c 59 29 3d 3d  FREELIST_ONLY)==
20970 30 20 29 20 62 46 72 65 65 4f 6e 6c 79 20 3d 20  0 ) bFreeOnly = 
20980 30 3b 0a 20 20 20 20 20 20 73 6f 72 74 65 64 46  0;.      sortedF
20990 72 65 65 4c 65 76 65 6c 28 70 44 62 2d 3e 70 45  reeLevel(pDb->pE
209a0 6e 76 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 20  nv, p);.      p 
209b0 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a  = pNext;.    }..
209c0 20 20 20 20 69 66 28 20 62 46 72 65 65 4f 6e 6c      if( bFreeOnl
209d0 79 20 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20  y ) pNew->flags 
209e0 7c 3d 20 4c 45 56 45 4c 5f 46 52 45 45 4c 49 53  |= LEVEL_FREELIS
209f0 54 5f 4f 4e 4c 59 3b 0a 0a 20 20 20 20 2f 2a 20  T_ONLY;..    /* 
20a00 52 65 70 6c 61 63 65 20 74 68 65 20 6f 6c 64 20  Replace the old 
20a10 6c 65 76 65 6c 73 20 77 69 74 68 20 74 68 65 20  levels with the 
20a20 6e 65 77 2e 20 2a 2f 0a 20 20 20 20 70 54 6f 70  new. */.    pTop
20a30 4c 65 76 65 6c 20 3d 20 6c 73 6d 44 62 53 6e 61  Level = lsmDbSna
20a40 70 73 68 6f 74 4c 65 76 65 6c 28 70 44 62 2d 3e  pshotLevel(pDb->
20a50 70 57 6f 72 6b 65 72 29 3b 0a 20 20 20 20 70 4e  pWorker);.    pN
20a60 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ew->pNext = p;. 
20a70 20 20 20 66 6f 72 28 70 70 3d 26 70 54 6f 70 4c     for(pp=&pTopL
20a80 65 76 65 6c 3b 20 2a 70 70 21 3d 70 4c 65 76 65  evel; *pp!=pLeve
20a90 6c 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70  l; pp=&((*pp)->p
20aa0 4e 65 78 74 29 29 3b 0a 20 20 20 20 2a 70 70 20  Next));.    *pp 
20ab0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6c 73 6d 44  = pNew;.    lsmD
20ac0 62 53 6e 61 70 73 68 6f 74 53 65 74 4c 65 76 65  bSnapshotSetLeve
20ad0 6c 28 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2c 20  l(pDb->pWorker, 
20ae0 70 54 6f 70 4c 65 76 65 6c 29 3b 0a 0a 20 20 20  pTopLevel);..   
20af0 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68   /* Determine wh
20b00 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
20b10 20 6e 65 78 74 20 73 65 70 61 72 61 74 6f 72 73   next separators
20b20 20 77 69 6c 6c 20 62 65 20 6c 69 6e 6b 65 64 20   will be linked 
20b30 69 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e  in */.    if( pN
20b40 65 78 74 20 26 26 20 70 4e 65 78 74 2d 3e 70 4d  ext && pNext->pM
20b50 65 72 67 65 3d 3d 30 20 26 26 20 70 4e 65 78 74  erge==0 && pNext
20b60 2d 3e 6c 68 73 2e 69 52 6f 6f 74 20 26 26 20 70  ->lhs.iRoot && p
20b70 4e 65 78 74 20 0a 20 20 20 20 20 26 26 20 28 62  Next .     && (b
20b80 46 72 65 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28  FreeOnly==0 || (
20b90 70 4e 65 78 74 2d 3e 66 6c 61 67 73 20 26 20 4c  pNext->flags & L
20ba0 45 56 45 4c 5f 46 52 45 45 4c 49 53 54 5f 4f 4e  EVEL_FREELIST_ON
20bb0 4c 59 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  LY)).    ){.    
20bc0 20 20 62 55 73 65 4e 65 78 74 20 3d 20 31 3b 0a    bUseNext = 1;.
20bd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20be0 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 6d 65 72  Allocate the mer
20bf0 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 6e  ge object */.  n
20c00 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 4d 65  Byte = sizeof(Me
20c10 72 67 65 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rge) + sizeof(Me
20c20 72 67 65 49 6e 70 75 74 29 20 2a 20 28 6e 4d 65  rgeInput) * (nMe
20c30 72 67 65 20 2b 20 62 55 73 65 4e 65 78 74 29 3b  rge + bUseNext);
20c40 0a 20 20 70 4d 65 72 67 65 20 3d 20 28 4d 65 72  .  pMerge = (Mer
20c50 67 65 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a 65  ge *)lsmMallocZe
20c60 72 6f 52 63 28 70 44 62 2d 3e 70 45 6e 76 2c 20  roRc(pDb->pEnv, 
20c70 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 69  nByte, &rc);.  i
20c80 66 28 20 70 4d 65 72 67 65 20 29 7b 0a 20 20 20  f( pMerge ){.   
20c90 20 70 4d 65 72 67 65 2d 3e 61 49 6e 70 75 74 20   pMerge->aInput 
20ca0 3d 20 28 4d 65 72 67 65 49 6e 70 75 74 20 2a 29  = (MergeInput *)
20cb0 26 70 4d 65 72 67 65 5b 31 5d 3b 0a 20 20 20 20  &pMerge[1];.    
20cc0 70 4d 65 72 67 65 2d 3e 6e 49 6e 70 75 74 20 3d  pMerge->nInput =
20cd0 20 6e 4d 65 72 67 65 20 2b 20 62 55 73 65 4e 65   nMerge + bUseNe
20ce0 78 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d  xt;.    pNew->pM
20cf0 65 72 67 65 20 3d 20 70 4d 65 72 67 65 3b 0a 20  erge = pMerge;. 
20d00 20 7d 0a 0a 20 20 2a 70 70 4e 65 77 20 3d 20 70   }..  *ppNew = p
20d10 4e 65 77 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  New;.  return rc
20d20 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
20d30 6d 65 72 67 65 57 6f 72 6b 65 72 49 6e 69 74 28  mergeWorkerInit(
20d40 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20  .  lsm_db *pDb, 
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d60 20 20 20 2f 2a 20 44 62 20 63 6f 6e 6e 65 63 74     /* Db connect
20d70 69 6f 6e 20 74 6f 20 64 6f 20 6d 65 72 67 65 20  ion to do merge 
20d80 77 6f 72 6b 20 2a 2f 0a 20 20 4c 65 76 65 6c 20  work */.  Level 
20d90 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20  *pLevel,        
20da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
20db0 65 6c 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 6d 65  el to work on me
20dc0 72 67 69 6e 67 20 2a 2f 0a 20 20 4d 65 72 67 65  rging */.  Merge
20dd0 57 6f 72 6b 65 72 20 2a 70 4d 57 20 20 20 20 20  Worker *pMW     
20de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
20df0 6a 65 63 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  ject to initiali
20e00 7a 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ze */.){.  int r
20e10 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20  c = LSM_OK;     
20e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
20e30 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d  turn code */.  M
20e40 65 72 67 65 20 2a 70 4d 65 72 67 65 20 3d 20 70  erge *pMerge = p
20e50 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65 3b 20 2f  Level->pMerge; /
20e60 2a 20 50 65 72 73 69 73 74 65 6e 74 20 70 61 72  * Persistent par
20e70 74 20 6f 66 20 6d 65 72 67 65 20 73 74 61 74 65  t of merge state
20e80 20 2a 2f 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f   */.  MultiCurso
20e90 72 20 2a 70 43 73 72 20 3d 20 30 3b 20 20 20 20  r *pCsr = 0;    
20ea0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
20eb0 6f 70 65 6e 65 64 20 66 6f 72 20 70 4d 57 20 2a  opened for pMW *
20ec0 2f 0a 20 20 4c 65 76 65 6c 20 2a 70 4e 65 78 74  /.  Level *pNext
20ed0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 4e 65 78 74   = pLevel->pNext
20ee0 3b 20 20 20 2f 2a 20 4e 65 78 74 20 6c 65 76 65  ;   /* Next leve
20ef0 6c 20 69 6e 20 4c 53 4d 20 2a 2f 0a 0a 20 20 61  l in LSM */..  a
20f00 73 73 65 72 74 28 20 70 44 62 2d 3e 70 57 6f 72  ssert( pDb->pWor
20f10 6b 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ker );.  assert(
20f20 20 70 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65 20   pLevel->pMerge 
20f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  );.  assert( pLe
20f40 76 65 6c 2d 3e 6e 52 69 67 68 74 3e 30 20 29 3b  vel->nRight>0 );
20f50 0a 0a 20 20 6d 65 6d 73 65 74 28 70 4d 57 2c 20  ..  memset(pMW, 
20f60 30 2c 20 73 69 7a 65 6f 66 28 4d 65 72 67 65 57  0, sizeof(MergeW
20f70 6f 72 6b 65 72 29 29 3b 0a 20 20 70 4d 57 2d 3e  orker));.  pMW->
20f80 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 70 4d 57  pDb = pDb;.  pMW
20f90 2d 3e 70 4c 65 76 65 6c 20 3d 20 70 4c 65 76 65  ->pLevel = pLeve
20fa0 6c 3b 0a 20 20 70 4d 57 2d 3e 61 47 6f 62 62 6c  l;.  pMW->aGobbl
20fb0 65 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72  e = lsmMallocZer
20fc0 6f 52 63 28 70 44 62 2d 3e 70 45 6e 76 2c 20 73  oRc(pDb->pEnv, s
20fd0 69 7a 65 6f 66 28 50 67 6e 6f 29 20 2a 20 70 4c  izeof(Pgno) * pL
20fe0 65 76 65 6c 2d 3e 6e 52 69 67 68 74 2c 20 26 72  evel->nRight, &r
20ff0 63 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  c);..  /* Create
21000 20 61 20 6d 75 6c 74 69 2d 63 75 72 73 6f 72 20   a multi-cursor 
21010 74 6f 20 72 65 61 64 20 74 68 65 20 64 61 74 61  to read the data
21020 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
21030 20 6e 65 77 0a 20 20 2a 2a 20 73 65 67 6d 65 6e   new.  ** segmen
21040 74 2e 20 54 68 65 20 6e 65 77 20 73 65 67 6d 65  t. The new segme
21050 6e 74 20 63 6f 6e 74 61 69 6e 73 3a 0a 20 20 2a  nt contains:.  *
21060 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 52 65 63 6f  *.  **   1. Reco
21070 72 64 73 20 66 72 6f 6d 20 4c 48 53 20 6f 66 20  rds from LHS of 
21080 65 61 63 68 20 6f 66 20 74 68 65 20 6e 4d 65 72  each of the nMer
21090 67 65 20 6c 65 76 65 6c 73 20 62 65 69 6e 67 20  ge levels being 
210a0 6d 65 72 67 65 64 2e 0a 20 20 2a 2a 20 20 20 32  merged..  **   2
210b0 2e 20 53 65 70 61 72 61 74 6f 72 73 20 66 72 6f  . Separators fro
210c0 6d 20 65 69 74 68 65 72 20 74 68 65 20 6c 61 73  m either the las
210d0 74 20 6c 65 76 65 6c 20 62 65 69 6e 67 20 6d 65  t level being me
210e0 72 67 65 64 2c 20 6f 72 20 74 68 65 0a 20 20 2a  rged, or the.  *
210f0 2a 20 20 20 20 20 20 73 65 70 61 72 61 74 6f 72  *      separator
21100 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
21110 65 20 4c 48 53 20 6f 66 20 74 68 65 20 66 6f 6c  e LHS of the fol
21120 6c 6f 77 69 6e 67 20 6c 65 76 65 6c 2c 20 6f 72  lowing level, or
21130 20 6e 65 69 74 68 65 72 2e 0a 20 20 2a 2a 0a 20   neither..  **. 
21140 20 2a 2a 20 49 66 20 74 68 65 20 6e 65 77 20 6c   ** If the new l
21150 65 76 65 6c 20 69 73 20 74 68 65 20 6c 6f 77 65  evel is the lowe
21160 73 74 20 28 6f 6c 64 65 73 74 29 20 69 6e 20 74  st (oldest) in t
21170 68 65 20 64 62 2c 20 64 69 73 63 61 72 64 20 61  he db, discard a
21180 6e 79 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20 6b  ny.  ** delete k
21190 65 79 73 2e 20 4b 65 79 20 61 6e 6e 69 68 69 6c  eys. Key annihil
211a0 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 43  ation..  */.  pC
211b0 73 72 20 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72  sr = multiCursor
211c0 4e 65 77 28 70 44 62 2c 20 26 72 63 29 3b 0a 20  New(pDb, &rc);. 
211d0 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20 20 20   if( pCsr ){.   
211e0 20 70 43 73 72 2d 3e 66 6c 61 67 73 20 7c 3d 20   pCsr->flags |= 
211f0 43 55 52 53 4f 52 5f 4e 45 58 54 5f 4f 4b 3b 0a  CURSOR_NEXT_OK;.
21200 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75      rc = multiCu
21210 72 73 6f 72 41 64 64 52 68 73 28 70 43 73 72 2c  rsorAddRhs(pCsr,
21220 20 70 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 20 20   pLevel);.  }.  
21230 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26  if( rc==LSM_OK &
21240 26 20 70 4d 65 72 67 65 2d 3e 6e 49 6e 70 75 74  & pMerge->nInput
21250 20 3e 20 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68   > pLevel->nRigh
21260 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  t ){.    rc = bt
21270 72 65 65 43 75 72 73 6f 72 4e 65 77 28 70 44 62  reeCursorNew(pDb
21280 2c 20 26 70 4e 65 78 74 2d 3e 6c 68 73 2c 20 26  , &pNext->lhs, &
21290 70 43 73 72 2d 3e 70 42 74 43 73 72 29 3b 0a 20  pCsr->pBtCsr);. 
212a0 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 65 78 74   }else if( pNext
212b0 20 29 7b 0a 20 20 20 20 6d 75 6c 74 69 43 75 72   ){.    multiCur
212c0 73 6f 72 52 65 61 64 53 65 70 61 72 61 74 6f 72  sorReadSeparator
212d0 73 28 70 43 73 72 29 3b 0a 20 20 7d 65 6c 73 65  s(pCsr);.  }else
212e0 7b 0a 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f  {.    multiCurso
212f0 72 49 67 6e 6f 72 65 44 65 6c 65 74 65 28 70 43  rIgnoreDelete(pC
21300 73 72 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  sr);.  }..  asse
21310 72 74 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 7c  rt( rc!=LSM_OK |
21320 7c 20 70 4d 65 72 67 65 2d 3e 6e 49 6e 70 75 74  | pMerge->nInput
21330 3d 3d 28 70 43 73 72 2d 3e 6e 50 74 72 2b 28 70  ==(pCsr->nPtr+(p
21340 43 73 72 2d 3e 70 42 74 43 73 72 21 3d 30 29 29  Csr->pBtCsr!=0))
21350 20 29 3b 0a 20 20 70 4d 57 2d 3e 70 43 73 72 20   );.  pMW->pCsr 
21360 3d 20 70 43 73 72 3b 0a 0a 20 20 2f 2a 20 4c 6f  = pCsr;..  /* Lo
21370 61 64 20 74 68 65 20 62 2d 74 72 65 65 20 68 69  ad the b-tree hi
21380 65 72 61 72 63 68 79 20 69 6e 74 6f 20 6d 65 6d  erarchy into mem
21390 6f 72 79 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ory. */.  if( rc
213a0 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 72 63 20 3d 20  ==LSM_OK ) rc = 
213b0 6d 65 72 67 65 57 6f 72 6b 65 72 4c 6f 61 64 48  mergeWorkerLoadH
213c0 69 65 72 61 72 63 68 79 28 70 4d 57 29 3b 0a 20  ierarchy(pMW);. 
213d0 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
213e0 26 26 20 70 4d 57 2d 3e 68 69 65 72 2e 6e 48 69  && pMW->hier.nHi
213f0 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4d 57  er==0 ){.    pMW
21400 2d 3e 61 53 61 76 65 5b 30 5d 2e 69 50 67 6e 6f  ->aSave[0].iPgno
21410 20 3d 20 70 4c 65 76 65 6c 2d 3e 6c 68 73 2e 69   = pLevel->lhs.i
21420 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  First;.  }..  /*
21430 20 50 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75   Position the cu
21440 72 73 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 72  rsor. */.  if( r
21450 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20  c==LSM_OK ){.   
21460 20 70 43 73 72 2d 3e 70 50 72 65 76 4d 65 72 67   pCsr->pPrevMerg
21470 65 50 74 72 20 3d 20 26 70 4d 65 72 67 65 2d 3e  ePtr = &pMerge->
21480 69 43 75 72 72 65 6e 74 50 74 72 3b 0a 20 20 20  iCurrentPtr;.   
21490 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6c 68 73   if( pLevel->lhs
214a0 2e 69 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20  .iFirst==0 ){.  
214b0 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
214c0 74 20 61 72 72 61 79 20 69 73 20 73 74 69 6c 6c  t array is still
214d0 20 65 6d 70 74 79 2e 20 53 6f 20 70 6f 73 69 74   empty. So posit
214e0 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  ion the cursor a
214f0 74 20 74 68 65 20 76 65 72 79 20 0a 20 20 20 20  t the very .    
21500 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68    ** start of th
21510 65 20 69 6e 70 75 74 2e 20 20 2a 2f 0a 20 20 20  e input.  */.   
21520 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72     rc = multiCur
21530 73 6f 72 45 6e 64 28 70 43 73 72 2c 20 30 29 3b  sorEnd(pCsr, 0);
21540 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21550 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
21560 61 72 72 61 79 20 69 73 20 6e 6f 6e 2d 65 6d 70  array is non-emp
21570 74 79 2e 20 50 6f 73 69 74 69 6f 6e 20 74 68 65  ty. Position the
21580 20 63 75 72 73 6f 72 20 62 61 73 65 64 20 6f 6e   cursor based on
21590 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61   the.      ** pa
215a0 67 65 2f 63 65 6c 6c 20 64 61 74 61 20 73 61 76  ge/cell data sav
215b0 65 64 20 69 6e 20 74 68 65 20 4d 65 72 67 65 2e  ed in the Merge.
215c0 61 49 6e 70 75 74 5b 5d 20 61 72 72 61 79 2e 20  aInput[] array. 
215d0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
215e0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
215f0 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 69 3c  rc==LSM_OK && i<
21600 70 43 73 72 2d 3e 6e 50 74 72 3b 20 69 2b 2b 29  pCsr->nPtr; i++)
21610 7b 0a 20 20 20 20 20 20 20 20 4d 65 72 67 65 49  {.        MergeI
21620 6e 70 75 74 20 2a 70 49 6e 70 75 74 20 3d 20 26  nput *pInput = &
21630 70 4d 65 72 67 65 2d 3e 61 49 6e 70 75 74 5b 69  pMerge->aInput[i
21640 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
21650 49 6e 70 75 74 2d 3e 69 50 67 20 29 7b 0a 20 20  Input->iPg ){.  
21660 20 20 20 20 20 20 20 20 53 65 67 6d 65 6e 74 50          SegmentP
21670 74 72 20 2a 70 50 74 72 3b 0a 20 20 20 20 20 20  tr *pPtr;.      
21680 20 20 20 20 61 73 73 65 72 74 28 20 70 43 73 72      assert( pCsr
21690 2d 3e 61 50 74 72 5b 69 5d 2e 70 50 67 3d 3d 30  ->aPtr[i].pPg==0
216a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50   );.          pP
216b0 74 72 20 3d 20 26 70 43 73 72 2d 3e 61 50 74 72  tr = &pCsr->aPtr
216c0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  [i];.          r
216d0 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 4c 6f  c = segmentPtrLo
216e0 61 64 50 61 67 65 28 70 44 62 2d 3e 70 46 53 2c  adPage(pDb->pFS,
216f0 20 70 50 74 72 2c 20 28 69 6e 74 29 70 49 6e 70   pPtr, (int)pInp
21700 75 74 2d 3e 69 50 67 29 3b 0a 20 20 20 20 20 20  ut->iPg);.      
21710 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f      if( rc==LSM_
21720 4f 4b 20 26 26 20 70 50 74 72 2d 3e 6e 43 65 6c  OK && pPtr->nCel
21730 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l>0 ){.         
21740 20 20 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50     rc = segmentP
21750 74 72 4c 6f 61 64 43 65 6c 6c 28 70 50 74 72 2c  trLoadCell(pPtr,
21760 20 70 49 6e 70 75 74 2d 3e 69 43 65 6c 6c 29 3b   pInput->iCell);
21770 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
21790 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53        if( rc==LS
217a0 4d 5f 4f 4b 20 26 26 20 70 43 73 72 2d 3e 70 42  M_OK && pCsr->pB
217b0 74 43 73 72 20 29 7b 0a 20 20 20 20 20 20 20 20  tCsr ){.        
217c0 69 6e 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64  int (*xCmp)(void
217d0 20 2a 2c 20 69 6e 74 2c 20 76 6f 69 64 20 2a 2c   *, int, void *,
217e0 20 69 6e 74 29 20 3d 20 70 43 73 72 2d 3e 70 44   int) = pCsr->pD
217f0 62 2d 3e 78 43 6d 70 3b 0a 20 20 20 20 20 20 20  b->xCmp;.       
21800 20 61 73 73 65 72 74 28 20 69 3d 3d 70 43 73 72   assert( i==pCsr
21810 2d 3e 6e 50 74 72 20 29 3b 0a 20 20 20 20 20 20  ->nPtr );.      
21820 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
21830 6f 72 52 65 73 74 6f 72 65 28 70 43 73 72 2d 3e  orRestore(pCsr->
21840 70 42 74 43 73 72 2c 20 78 43 6d 70 2c 20 26 70  pBtCsr, xCmp, &p
21850 4d 65 72 67 65 2d 3e 61 49 6e 70 75 74 5b 69 5d  Merge->aInput[i]
21860 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
21870 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b    if( rc==LSM_OK
21880 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21890 20 6d 75 6c 74 69 43 75 72 73 6f 72 53 65 74 75   multiCursorSetu
218a0 70 54 72 65 65 28 70 43 73 72 2c 20 30 29 3b 0a  pTree(pCsr, 0);.
218b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
218c0 20 20 70 43 73 72 2d 3e 66 6c 61 67 73 20 7c 3d    pCsr->flags |=
218d0 20 43 55 52 53 4f 52 5f 4e 45 58 54 5f 4f 4b 3b   CURSOR_NEXT_OK;
218e0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
218f0 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
21900 20 73 6f 72 74 65 64 42 74 72 65 65 47 6f 62 62   sortedBtreeGobb
21910 6c 65 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44  le(.  lsm_db *pD
21920 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
21930 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 65 72 20        /* Worker 
21940 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
21950 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73  MultiCursor *pCs
21960 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
21970 2f 2a 20 4d 75 6c 74 69 2d 63 75 72 73 6f 72 20  /* Multi-cursor 
21980 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 61  being used for a
21990 20 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20   merge */.  int 
219a0 69 47 6f 62 62 6c 65 20 20 20 20 20 20 20 20 20  iGobble         
219b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
219c0 43 73 72 2d 3e 61 50 74 72 5b 5d 20 65 6e 74 72  Csr->aPtr[] entr
219d0 79 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  y to operate on 
219e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
219f0 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 66 28 20 72   LSM_OK;.  if( r
21a00 74 54 6f 70 69 63 28 70 43 73 72 2d 3e 65 54 79  tTopic(pCsr->eTy
21a10 70 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 65  pe)==0 ){.    Se
21a20 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 43  gment *pSeg = pC
21a30 73 72 2d 3e 61 50 74 72 5b 69 47 6f 62 62 6c 65  sr->aPtr[iGobble
21a40 5d 2e 70 53 65 67 3b 0a 20 20 20 20 50 67 6e 6f  ].pSeg;.    Pgno
21a50 20 2a 61 50 67 3b 0a 20 20 20 20 69 6e 74 20 6e   *aPg;.    int n
21a60 50 67 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  Pg;..    /* Seek
21a70 20 66 72 6f 6d 20 74 68 65 20 72 6f 6f 74 20 6f   from the root o
21a80 66 20 74 68 65 20 62 2d 74 72 65 65 20 74 6f 20  f the b-tree to 
21a90 74 68 65 20 73 65 67 6d 65 6e 74 20 6c 65 61 66  the segment leaf
21aa0 20 74 68 61 74 20 6d 61 79 20 63 6f 6e 74 61 69   that may contai
21ab0 6e 0a 20 20 20 20 2a 2a 20 61 20 6b 65 79 20 65  n.    ** a key e
21ac0 71 75 61 6c 20 74 6f 20 74 68 65 20 6f 6e 65 20  qual to the one 
21ad0 6d 75 6c 74 69 2d 63 75 72 73 6f 72 20 63 75 72  multi-cursor cur
21ae0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
21af0 2e 20 52 65 63 6f 72 64 20 74 68 65 0a 20 20 20  . Record the.   
21b00 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20   ** page number 
21b10 6f 66 20 65 61 63 68 20 62 2d 74 72 65 65 20 70  of each b-tree p
21b20 61 67 65 20 61 6e 64 20 74 68 65 20 6c 65 61 66  age and the leaf
21b30 2e 20 54 68 65 20 73 65 67 6d 65 6e 74 20 6d 61  . The segment ma
21b40 79 20 62 65 0a 20 20 20 20 2a 2a 20 67 6f 62 62  y be.    ** gobb
21b50 6c 65 64 20 75 70 20 74 6f 20 28 62 75 74 20 6e  led up to (but n
21b60 6f 74 20 69 6e 63 6c 75 64 69 6e 67 29 20 74 68  ot including) th
21b70 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 73 65  e first of these
21b80 20 70 61 67 65 20 6e 75 6d 62 65 72 73 2e 0a 20   page numbers.. 
21b90 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
21ba0 28 20 70 53 65 67 2d 3e 69 52 6f 6f 74 3e 30 20  ( pSeg->iRoot>0 
21bb0 29 3b 0a 20 20 20 20 61 50 67 20 3d 20 6c 73 6d  );.    aPg = lsm
21bc0 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63 28 70 44 62  MallocZeroRc(pDb
21bd0 2d 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28 50  ->pEnv, sizeof(P
21be0 67 6e 6f 29 2a 33 32 2c 20 26 72 63 29 3b 0a 20  gno)*32, &rc);. 
21bf0 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
21c00 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
21c10 73 65 65 6b 49 6e 42 74 72 65 65 28 70 43 73 72  seekInBtree(pCsr
21c20 2c 20 70 53 65 67 2c 20 0a 20 20 20 20 20 20 20  , pSeg, .       
21c30 20 20 20 72 74 54 6f 70 69 63 28 70 43 73 72 2d     rtTopic(pCsr-
21c40 3e 65 54 79 70 65 29 2c 20 70 43 73 72 2d 3e 6b  >eType), pCsr->k
21c50 65 79 2e 70 44 61 74 61 2c 20 70 43 73 72 2d 3e  ey.pData, pCsr->
21c60 6b 65 79 2e 6e 44 61 74 61 2c 20 61 50 67 2c 20  key.nData, aPg, 
21c70 30 0a 20 20 20 20 20 20 29 3b 20 0a 20 20 20 20  0.      ); .    
21c80 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c  }..    if( rc==L
21c90 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66  SM_OK ){.      f
21ca0 6f 72 28 6e 50 67 3d 30 3b 20 61 50 67 5b 6e 50  or(nPg=0; aPg[nP
21cb0 67 5d 3b 20 6e 50 67 2b 2b 29 3b 0a 20 20 20 20  g]; nPg++);.    
21cc0 20 20 6c 73 6d 46 73 47 6f 62 62 6c 65 28 70 44    lsmFsGobble(pD
21cd0 62 2c 20 70 53 65 67 2c 20 61 50 67 2c 20 6e 50  b, pSeg, aPg, nP
21ce0 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c  g);.    }..    l
21cf0 73 6d 46 72 65 65 28 70 44 62 2d 3e 70 45 6e 76  smFree(pDb->pEnv
21d00 2c 20 61 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  , aPg);.  }.  re
21d10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21d20 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69  * Argument p poi
21d30 6e 74 73 20 74 6f 20 61 20 6c 65 76 65 6c 20 6f  nts to a level o
21d40 66 20 61 67 65 20 4e 2e 20 52 65 74 75 72 6e 20  f age N. Return 
21d50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  the number of le
21d60 76 65 6c 73 20 69 6e 0a 2a 2a 20 74 68 65 20 6c  vels in.** the l
21d70 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
21d80 69 6e 67 20 61 74 20 70 20 74 68 61 74 20 68 61  ing at p that ha
21d90 76 65 20 61 67 65 3d 4e 20 28 61 6c 77 61 79 73  ve age=N (always
21da0 20 61 74 20 6c 65 61 73 74 20 31 29 2e 0a 2a 2f   at least 1)..*/
21db0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74  .static int sort
21dc0 65 64 43 6f 75 6e 74 4c 65 76 65 6c 73 28 4c 65  edCountLevels(Le
21dd0 76 65 6c 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  vel *p){.  int i
21de0 41 67 65 20 3d 20 70 2d 3e 69 41 67 65 3b 0a 20  Age = p->iAge;. 
21df0 20 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20   int nRet = 0;. 
21e00 20 64 6f 20 7b 0a 20 20 20 20 6e 52 65 74 2b 2b   do {.    nRet++
21e10 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  ;.    p = p->pNe
21e20 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20  xt;.  }while( p 
21e30 26 26 20 70 2d 3e 69 41 67 65 3d 3d 69 41 67 65  && p->iAge==iAge
21e40 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52 65   );.  return nRe
21e50 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  t;.}..static int
21e60 20 73 6f 72 74 65 64 53 65 6c 65 63 74 4c 65 76   sortedSelectLev
21e70 65 6c 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20  el(lsm_db *pDb, 
21e80 69 6e 74 20 6e 4d 65 72 67 65 2c 20 4c 65 76 65  int nMerge, Leve
21e90 6c 20 2a 2a 70 70 4f 75 74 29 7b 0a 20 20 4c 65  l **ppOut){.  Le
21ea0 76 65 6c 20 2a 70 54 6f 70 4c 65 76 65 6c 20 3d  vel *pTopLevel =
21eb0 20 6c 73 6d 44 62 53 6e 61 70 73 68 6f 74 4c 65   lsmDbSnapshotLe
21ec0 76 65 6c 28 70 44 62 2d 3e 70 57 6f 72 6b 65 72  vel(pDb->pWorker
21ed0 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  );.  int rc = LS
21ee0 4d 5f 4f 4b 3b 0a 20 20 4c 65 76 65 6c 20 2a 70  M_OK;.  Level *p
21ef0 4c 65 76 65 6c 20 3d 20 30 3b 20 20 20 20 20 20  Level = 0;      
21f00 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
21f10 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 65 76 65 6c  value */.  Level
21f20 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20   *pBest = 0;    
21f30 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
21f40 20 6c 65 76 65 6c 20 74 6f 20 77 6f 72 6b 20 6f   level to work o
21f50 6e 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a  n found so far *
21f60 2f 0a 20 20 69 6e 74 20 6e 42 65 73 74 3b 20 20  /.  int nBest;  
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
21f90 65 67 6d 65 6e 74 73 20 6d 65 72 67 65 64 20 61  egments merged a
21fa0 74 20 70 42 65 73 74 20 2a 2f 0a 20 20 4c 65 76  t pBest */.  Lev
21fb0 65 6c 20 2a 70 54 68 69 73 20 3d 20 30 3b 20 20  el *pThis = 0;  
21fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
21fd0 72 73 74 20 69 6e 20 72 75 6e 20 6f 66 20 6c 65  rst in run of le
21fe0 76 65 6c 73 20 77 69 74 68 20 61 67 65 3d 69 41  vels with age=iA
21ff0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69  ge */.  int nThi
22000 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
22010 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22020 6f 66 20 6c 65 76 65 6c 73 20 73 74 61 72 74 69  of levels starti
22030 6e 67 20 61 74 20 70 54 68 69 73 20 2a 2f 0a 0a  ng at pThis */..
22040 20 20 61 73 73 65 72 74 28 20 6e 4d 65 72 67 65    assert( nMerge
22050 3e 3d 31 20 29 3b 0a 20 20 6e 42 65 73 74 20 3d  >=1 );.  nBest =
22060 20 4c 53 4d 5f 4d 41 58 28 31 2c 20 6e 4d 65 72   LSM_MAX(1, nMer
22070 67 65 2d 31 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  ge-1);..  /* Fin
22080 64 20 74 68 65 20 6c 6f 6e 67 65 73 74 20 63 6f  d the longest co
22090 6e 74 69 67 75 6f 75 73 20 72 75 6e 20 6f 66 20  ntiguous run of 
220a0 6c 65 76 65 6c 73 20 6e 6f 74 20 63 75 72 72 65  levels not curre
220b0 6e 74 6c 79 20 75 6e 64 65 72 67 6f 69 6e 67 20  ntly undergoing 
220c0 61 20 0a 20 20 2a 2a 20 6d 65 72 67 65 20 77 69  a .  ** merge wi
220d0 74 68 20 74 68 65 20 73 61 6d 65 20 61 67 65 20  th the same age 
220e0 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
220f0 2e 20 4f 72 20 74 68 65 20 6c 65 76 65 6c 20 62  . Or the level b
22100 65 69 6e 67 20 6d 65 72 67 65 64 0a 20 20 2a 2a  eing merged.  **
22110 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
22120 74 20 6e 75 6d 62 65 72 20 6f 66 20 72 69 67 68  t number of righ
22130 74 2d 68 61 6e 64 20 73 65 67 6d 65 6e 74 73 2e  t-hand segments.
22140 20 57 6f 72 6b 20 6f 6e 20 69 74 2e 20 2a 2f 0a   Work on it. */.
22150 20 20 66 6f 72 28 70 4c 65 76 65 6c 3d 70 54 6f    for(pLevel=pTo
22160 70 4c 65 76 65 6c 3b 20 70 4c 65 76 65 6c 3b 20  pLevel; pLevel; 
22170 70 4c 65 76 65 6c 3d 70 4c 65 76 65 6c 2d 3e 70  pLevel=pLevel->p
22180 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22190 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3d 3d 30  Level->nRight==0
221a0 20 26 26 20 70 54 68 69 73 20 26 26 20 70 4c 65   && pThis && pLe
221b0 76 65 6c 2d 3e 69 41 67 65 3d 3d 70 54 68 69 73  vel->iAge==pThis
221c0 2d 3e 69 41 67 65 20 29 7b 0a 20 20 20 20 20 20  ->iAge ){.      
221d0 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c  nThis++;.    }el
221e0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 54  se{.      if( nT
221f0 68 69 73 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20  his>nBest ){.   
22200 20 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c       if( (pLevel
22210 2d 3e 69 41 67 65 21 3d 70 54 68 69 73 2d 3e 69  ->iAge!=pThis->i
22220 41 67 65 2b 31 29 0a 20 20 20 20 20 20 20 20 20  Age+1).         
22230 7c 7c 20 28 70 4c 65 76 65 6c 2d 3e 6e 52 69 67  || (pLevel->nRig
22240 68 74 3d 3d 30 20 26 26 20 73 6f 72 74 65 64 43  ht==0 && sortedC
22250 6f 75 6e 74 4c 65 76 65 6c 73 28 70 4c 65 76 65  ountLevels(pLeve
22260 6c 29 3c 3d 70 44 62 2d 3e 6e 4d 65 72 67 65 29  l)<=pDb->nMerge)
22270 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
22280 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 54        pBest = pT
22290 68 69 73 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  his;.          n
222a0 42 65 73 74 20 3d 20 6e 54 68 69 73 3b 0a 20 20  Best = nThis;.  
222b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
222c0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
222d0 2d 3e 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->nRight ){.    
222e0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
222f0 6e 52 69 67 68 74 3e 6e 42 65 73 74 20 29 7b 0a  nRight>nBest ){.
22300 20 20 20 20 20 20 20 20 20 20 6e 42 65 73 74 20            nBest 
22310 3d 20 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74  = pLevel->nRight
22320 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 65 73  ;.          pBes
22330 74 20 3d 20 70 4c 65 76 65 6c 3b 0a 20 20 20 20  t = pLevel;.    
22340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 54      }.        nT
22350 68 69 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  his = 0;.       
22360 20 70 54 68 69 73 20 3d 20 30 3b 0a 20 20 20 20   pThis = 0;.    
22370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22380 20 70 54 68 69 73 20 3d 20 70 4c 65 76 65 6c 3b   pThis = pLevel;
22390 0a 20 20 20 20 20 20 20 20 6e 54 68 69 73 20 3d  .        nThis =
223a0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
223b0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 68 69  }.  }.  if( nThi
223c0 73 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 61  s>nBest ){.    a
223d0 73 73 65 72 74 28 20 70 54 68 69 73 20 29 3b 0a  ssert( pThis );.
223e0 20 20 20 20 70 42 65 73 74 20 3d 20 70 54 68 69      pBest = pThi
223f0 73 3b 0a 20 20 20 20 6e 42 65 73 74 20 3d 20 6e  s;.    nBest = n
22400 54 68 69 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  This;.  }..  if(
22410 20 70 42 65 73 74 3d 3d 30 20 26 26 20 6e 4d 65   pBest==0 && nMe
22420 72 67 65 3d 3d 31 20 29 7b 0a 20 20 20 20 69 6e  rge==1 ){.    in
22430 74 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  t nFree = 0;.   
22440 20 69 6e 74 20 6e 55 73 72 20 3d 20 30 3b 0a 20   int nUsr = 0;. 
22450 20 20 20 66 6f 72 28 70 4c 65 76 65 6c 3d 70 54     for(pLevel=pT
22460 6f 70 4c 65 76 65 6c 3b 20 70 4c 65 76 65 6c 3b  opLevel; pLevel;
22470 20 70 4c 65 76 65 6c 3d 70 4c 65 76 65 6c 2d 3e   pLevel=pLevel->
22480 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
22490 73 65 72 74 28 20 21 70 4c 65 76 65 6c 2d 3e 6e  sert( !pLevel->n
224a0 52 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 69  Right );.      i
224b0 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
224c0 20 26 20 4c 45 56 45 4c 5f 46 52 45 45 4c 49 53   & LEVEL_FREELIS
224d0 54 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  T_ONLY ){.      
224e0 20 20 6e 46 72 65 65 2b 2b 3b 0a 20 20 20 20 20    nFree++;.     
224f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22500 6e 55 73 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nUsr++;.      }.
22510 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 55      }.    if( nU
22520 73 72 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42  sr>1 ){.      pB
22530 65 73 74 20 3d 20 70 54 6f 70 4c 65 76 65 6c 3b  est = pTopLevel;
22540 0a 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 6e  .      nBest = n
22550 46 72 65 65 20 2b 20 6e 55 73 72 3b 0a 20 20 20  Free + nUsr;.   
22560 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42   }.  }..  if( pB
22570 65 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  est ){.    if( p
22580 42 65 73 74 2d 3e 6e 52 69 67 68 74 3d 3d 30 20  Best->nRight==0 
22590 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 6f  ){.      rc = so
225a0 72 74 65 64 4d 65 72 67 65 53 65 74 75 70 28 70  rtedMergeSetup(p
225b0 44 62 2c 20 70 42 65 73 74 2c 20 6e 42 65 73 74  Db, pBest, nBest
225c0 2c 20 70 70 4f 75 74 29 3b 0a 20 20 20 20 7d 65  , ppOut);.    }e
225d0 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 4f 75  lse{.      *ppOu
225e0 74 20 3d 20 70 42 65 73 74 3b 0a 20 20 20 20 7d  t = pBest;.    }
225f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
22600 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
22610 20 73 6f 72 74 65 64 44 62 49 73 46 75 6c 6c 28   sortedDbIsFull(
22620 6c 73 6d 5f 64 62 20 2a 70 44 62 29 7b 0a 20 20  lsm_db *pDb){.  
22630 4c 65 76 65 6c 20 2a 70 54 6f 70 20 3d 20 6c 73  Level *pTop = ls
22640 6d 44 62 53 6e 61 70 73 68 6f 74 4c 65 76 65 6c  mDbSnapshotLevel
22650 28 70 44 62 2d 3e 70 57 6f 72 6b 65 72 29 3b 0a  (pDb->pWorker);.
22660 0a 20 20 69 66 28 20 6c 73 6d 44 61 74 61 62 61  .  if( lsmDataba
22670 73 65 46 75 6c 6c 28 70 44 62 29 20 29 20 72 65  seFull(pDb) ) re
22680 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 54  turn 1;.  if( pT
22690 6f 70 20 26 26 20 70 54 6f 70 2d 3e 69 41 67 65  op && pTop->iAge
226a0 3d 3d 30 0a 20 20 20 26 26 20 28 70 54 6f 70 2d  ==0.   && (pTop-
226b0 3e 6e 52 69 67 68 74 20 7c 7c 20 73 6f 72 74 65  >nRight || sorte
226c0 64 43 6f 75 6e 74 4c 65 76 65 6c 73 28 70 54 6f  dCountLevels(pTo
226d0 70 29 3e 3d 70 44 62 2d 3e 6e 4d 65 72 67 65 29  p)>=pDb->nMerge)
226e0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
226f0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
22700 20 30 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73   0;.}..typedef s
22710 74 72 75 63 74 20 4d 6f 76 65 42 6c 6f 63 6b 43  truct MoveBlockC
22720 74 78 20 4d 6f 76 65 42 6c 6f 63 6b 43 74 78 3b  tx MoveBlockCtx;
22730 0a 73 74 72 75 63 74 20 4d 6f 76 65 42 6c 6f 63  .struct MoveBloc
22740 6b 43 74 78 20 7b 0a 20 20 69 6e 74 20 69 53 65  kCtx {.  int iSe
22750 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
22760 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
22770 69 6f 75 73 20 66 72 65 65 20 62 6c 6f 63 6b 20  ious free block 
22780 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  on list */.  int
22790 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   iFrom;         
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
227b0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
227c0 62 6c 6f 63 6b 73 20 69 6e 20 66 69 6c 65 20 2a  blocks in file *
227d0 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  /.};..static int
227e0 20 6d 6f 76 65 42 6c 6f 63 6b 43 62 28 76 6f 69   moveBlockCb(voi
227f0 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 69 42 6c  d *pCtx, int iBl
22800 6b 2c 20 69 36 34 20 69 53 6e 61 70 73 68 6f 74  k, i64 iSnapshot
22810 29 7b 0a 20 20 4d 6f 76 65 42 6c 6f 63 6b 43 74  ){.  MoveBlockCt
22820 78 20 2a 70 20 3d 20 28 4d 6f 76 65 42 6c 6f 63  x *p = (MoveBloc
22830 6b 43 74 78 20 2a 29 70 43 74 78 3b 0a 20 20 61  kCtx *)pCtx;.  a
22840 73 73 65 72 74 28 20 70 2d 3e 69 46 72 6f 6d 3d  ssert( p->iFrom=
22850 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 42 6c 6b  =0 );.  if( iBlk
22860 3d 3d 28 70 2d 3e 69 53 65 65 6e 2d 31 29 20 29  ==(p->iSeen-1) )
22870 7b 0a 20 20 20 20 70 2d 3e 69 53 65 65 6e 20 3d  {.    p->iSeen =
22880 20 69 42 6c 6b 3b 0a 20 20 20 20 72 65 74 75 72   iBlk;.    retur
22890 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 46  n 0;.  }.  p->iF
228a0 72 6f 6d 20 3d 20 70 2d 3e 69 53 65 65 6e 2d 31  rom = p->iSeen-1
228b0 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
228c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
228d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
228e0 6f 20 66 75 72 74 68 65 72 20 63 6f 6d 70 61 63  o further compac
228f0 74 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72  t a database for
22900 20 77 68 69 63 68 20 61 6c 6c 20 0a 2a 2a 20 6f   which all .** o
22910 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 68 61  f the content ha
22920 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d  s already been m
22930 65 72 67 65 64 20 69 6e 74 6f 20 61 20 73 69 6e  erged into a sin
22940 67 6c 65 20 73 65 67 6d 65 6e 74 2e 20 49 66 20  gle segment. If 
22950 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 69 74  .** possible, it
22960 20 6d 6f 76 65 73 20 74 68 65 20 63 6f 6e 74 65   moves the conte
22970 6e 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  nts of a single 
22980 62 6c 6f 63 6b 20 66 72 6f 6d 20 74 68 65 20 65  block from the e
22990 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  nd of the.** fil
229a0 65 20 74 6f 20 61 20 66 72 65 65 2d 62 6c 6f 63  e to a free-bloc
229b0 6b 20 74 68 61 74 20 6c 69 65 73 20 63 6c 6f 73  k that lies clos
229c0 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
229d0 6f 66 20 74 68 65 20 66 69 6c 65 20 28 61 6c 6c  of the file (all
229e0 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c  owing.** the fil
229f0 65 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c  e to be eventual
22a00 6c 79 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a  ly truncated)..*
22a10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72  /.static int sor
22a20 74 65 64 4d 6f 76 65 42 6c 6f 63 6b 28 6c 73 6d  tedMoveBlock(lsm
22a30 5f 64 62 20 2a 70 44 62 2c 20 69 6e 74 20 2a 70  _db *pDb, int *p
22a40 6e 57 72 69 74 65 29 7b 0a 20 20 53 6e 61 70 73  nWrite){.  Snaps
22a50 68 6f 74 20 2a 70 20 3d 20 70 44 62 2d 3e 70 57  hot *p = pDb->pW
22a60 6f 72 6b 65 72 3b 0a 20 20 4c 65 76 65 6c 20 2a  orker;.  Level *
22a70 70 4c 76 6c 20 3d 20 6c 73 6d 44 62 53 6e 61 70  pLvl = lsmDbSnap
22a80 73 68 6f 74 4c 65 76 65 6c 28 70 29 3b 0a 20 20  shotLevel(p);.  
22a90 69 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20  int iFrom;      
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ab0 2f 2a 20 42 6c 6f 63 6b 20 74 6f 20 6d 6f 76 65  /* Block to move
22ac0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6f 3b 20 20   */.  int iTo;  
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ae0 20 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61        /* Destina
22af0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 62 6c 6f  tion to move blo
22b00 63 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 72  ck to */.  int r
22b10 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
22b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
22b30 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
22b40 4d 6f 76 65 42 6c 6f 63 6b 43 74 78 20 73 43 74  MoveBlockCtx sCt
22b50 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  x;..  assert( pL
22b60 76 6c 2d 3e 70 4e 65 78 74 3d 3d 30 20 26 26 20  vl->pNext==0 && 
22b70 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 3d 3d 30 20  pLvl->nRight==0 
22b80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
22b90 72 65 64 69 72 65 63 74 2e 6e 3c 3d 4c 53 4d 5f  redirect.n<=LSM_
22ba0 4d 41 58 5f 42 4c 4f 43 4b 5f 52 45 44 49 52 45  MAX_BLOCK_REDIRE
22bb0 43 54 53 20 29 3b 0a 0a 20 20 2a 70 6e 57 72 69  CTS );..  *pnWri
22bc0 74 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68  te = 0;..  /* Ch
22bd0 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 64  eck that the red
22be0 69 72 65 63 74 20 61 72 72 61 79 20 69 73 20 6e  irect array is n
22bf0 6f 74 20 61 6c 72 65 61 64 79 20 66 75 6c 6c 2e  ot already full.
22c00 20 49 66 20 69 74 20 69 73 2c 20 72 65 74 75 72   If it is, retur
22c10 6e 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 6d  n.  ** without m
22c20 6f 76 69 6e 67 20 61 6e 79 20 64 61 74 61 62 61  oving any databa
22c30 73 65 20 63 6f 6e 74 65 6e 74 2e 20 20 2a 2f 0a  se content.  */.
22c40 20 20 69 66 28 20 70 2d 3e 72 65 64 69 72 65 63    if( p->redirec
22c50 74 2e 6e 3e 3d 4c 53 4d 5f 4d 41 58 5f 42 4c 4f  t.n>=LSM_MAX_BLO
22c60 43 4b 5f 52 45 44 49 52 45 43 54 53 20 29 20 72  CK_REDIRECTS ) r
22c70 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20  eturn LSM_OK;.. 
22c80 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6c 61 73   /* Find the las
22c90 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 6e 74 65  t block of conte
22ca0 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  nt in the databa
22cb0 73 65 20 66 69 6c 65 2e 20 44 6f 20 74 68 69 73  se file. Do this
22cc0 20 62 79 20 0a 20 20 2a 2a 20 74 72 61 76 65 72   by .  ** traver
22cd0 73 69 6e 67 20 74 68 65 20 66 72 65 65 2d 6c 69  sing the free-li
22ce0 73 74 20 69 6e 20 72 65 76 65 72 73 65 20 28 64  st in reverse (d
22cf0 65 73 63 65 6e 64 69 6e 67 20 62 6c 6f 63 6b 20  escending block 
22d00 6e 75 6d 62 65 72 29 20 6f 72 64 65 72 2e 0a 20  number) order.. 
22d10 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 6c   ** The first bl
22d20 6f 63 6b 20 6e 6f 74 20 6f 6e 20 74 68 65 20 66  ock not on the f
22d30 72 65 65 20 6c 69 73 74 20 69 73 20 74 68 65 20  ree list is the 
22d40 6f 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  one that will be
22d50 20 6d 6f 76 65 64 2e 0a 20 20 2a 2a 20 53 69 6e   moved..  ** Sin
22d60 63 65 20 74 68 65 20 64 62 20 63 6f 6e 73 69 73  ce the db consis
22d70 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 73  ts of a single s
22d80 65 67 6d 65 6e 74 2c 20 74 68 65 72 65 20 69 73  egment, there is
22d90 20 6e 6f 20 61 6d 62 69 67 75 69 74 79 20 61 73   no ambiguity as
22da0 0a 20 20 2a 2a 20 74 6f 20 77 68 69 63 68 20 73  .  ** to which s
22db0 65 67 6d 65 6e 74 20 74 68 65 20 62 6c 6f 63 6b  egment the block
22dc0 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 20 20 2a 2f   belongs to.  */
22dd0 0a 20 20 73 43 74 78 2e 69 53 65 65 6e 20 3d 20  .  sCtx.iSeen = 
22de0 70 2d 3e 6e 42 6c 6f 63 6b 2b 31 3b 0a 20 20 73  p->nBlock+1;.  s
22df0 43 74 78 2e 69 46 72 6f 6d 20 3d 20 30 3b 0a 20  Ctx.iFrom = 0;. 
22e00 20 72 63 20 3d 20 6c 73 6d 57 61 6c 6b 46 72 65   rc = lsmWalkFre
22e10 65 6c 69 73 74 28 70 44 62 2c 20 31 2c 20 6d 6f  elist(pDb, 1, mo
22e20 76 65 42 6c 6f 63 6b 43 62 2c 20 26 73 43 74 78  veBlockCb, &sCtx
22e30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 4c 53 4d  );.  if( rc!=LSM
22e40 5f 4f 4b 20 7c 7c 20 73 43 74 78 2e 69 46 72 6f  _OK || sCtx.iFro
22e50 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  m==0 ) return rc
22e60 3b 0a 20 20 69 46 72 6f 6d 20 3d 20 73 43 74 78  ;.  iFrom = sCtx
22e70 2e 69 46 72 6f 6d 3b 0a 0a 20 20 2f 2a 20 46 69  .iFrom;..  /* Fi
22e80 6e 64 20 74 68 65 20 66 69 72 73 74 20 66 72 65  nd the first fre
22e90 65 20 62 6c 6f 63 6b 20 69 6e 20 74 68 65 20 64  e block in the d
22ea0 61 74 61 62 61 73 65 2c 20 69 67 6e 6f 72 69 6e  atabase, ignorin
22eb0 67 20 62 6c 6f 63 6b 20 31 2e 20 42 6c 6f 63 6b  g block 1. Block
22ec0 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 69 63 6b  .  ** 1 is trick
22ed0 79 20 61 73 20 69 74 20 69 73 20 73 6d 61 6c 6c  y as it is small
22ee0 65 72 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65  er than the othe
22ef0 72 20 62 6c 6f 63 6b 73 2e 20 20 2a 2f 0a 20 20  r blocks.  */.  
22f00 72 63 20 3d 20 6c 73 6d 42 6c 6f 63 6b 41 6c 6c  rc = lsmBlockAll
22f10 6f 63 61 74 65 28 70 44 62 2c 20 69 46 72 6f 6d  ocate(pDb, iFrom
22f20 2c 20 26 69 54 6f 29 3b 0a 20 20 69 66 28 20 72  , &iTo);.  if( r
22f30 63 21 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 69 54 6f  c!=LSM_OK || iTo
22f40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  ==0 ) return rc;
22f50 0a 20 20 61 73 73 65 72 74 28 20 69 54 6f 21 3d  .  assert( iTo!=
22f60 31 20 26 26 20 69 54 6f 3c 69 46 72 6f 6d 20 29  1 && iTo<iFrom )
22f70 3b 0a 0a 20 20 72 63 20 3d 20 6c 73 6d 46 73 4d  ;..  rc = lsmFsM
22f80 6f 76 65 42 6c 6f 63 6b 28 70 44 62 2d 3e 70 46  oveBlock(pDb->pF
22f90 53 2c 20 26 70 4c 76 6c 2d 3e 6c 68 73 2c 20 69  S, &pLvl->lhs, i
22fa0 54 6f 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 69 66  To, iFrom);.  if
22fb0 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
22fc0 20 20 20 20 69 66 28 20 70 2d 3e 72 65 64 69 72      if( p->redir
22fd0 65 63 74 2e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  ect.a==0 ){.    
22fe0 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
22ff0 7a 65 6f 66 28 73 74 72 75 63 74 20 52 65 64 69  zeof(struct Redi
23000 72 65 63 74 45 6e 74 72 79 29 20 2a 20 4c 53 4d  rectEntry) * LSM
23010 5f 4d 41 58 5f 42 4c 4f 43 4b 5f 52 45 44 49 52  _MAX_BLOCK_REDIR
23020 45 43 54 53 3b 0a 20 20 20 20 20 20 70 2d 3e 72  ECTS;.      p->r
23030 65 64 69 72 65 63 74 2e 61 20 3d 20 6c 73 6d 4d  edirect.a = lsmM
23040 61 6c 6c 6f 63 5a 65 72 6f 52 63 28 70 44 62 2d  allocZeroRc(pDb-
23050 3e 70 45 6e 76 2c 20 6e 42 79 74 65 2c 20 26 72  >pEnv, nByte, &r
23060 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  c);.    }.    if
23070 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
23080 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
23090 69 66 20 74 68 65 20 62 6c 6f 63 6b 20 6a 75 73  if the block jus
230a0 74 20 6d 6f 76 65 64 20 77 61 73 20 61 6c 72 65  t moved was alre
230b0 61 64 79 20 72 65 64 69 72 65 63 74 65 64 2e 20  ady redirected. 
230c0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  */.      int i;.
230d0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
230e0 3c 70 2d 3e 72 65 64 69 72 65 63 74 2e 6e 3b 20  <p->redirect.n; 
230f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
23100 28 20 70 2d 3e 72 65 64 69 72 65 63 74 2e 61 5b  ( p->redirect.a[
23110 69 5d 2e 69 54 6f 3d 3d 69 46 72 6f 6d 20 29 20  i].iTo==iFrom ) 
23120 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
23130 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 2d 3e        if( i==p->
23140 72 65 64 69 72 65 63 74 2e 6e 20 29 7b 0a 20 20  redirect.n ){.  
23150 20 20 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69        /* Block i
23160 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 6c 72  From was not alr
23170 65 61 64 79 20 72 65 64 69 72 65 63 74 65 64 2e  eady redirected.
23180 20 41 64 64 20 61 20 6e 65 77 20 61 72 72 61 79   Add a new array
23190 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 20 20 20   entry. */.     
231a0 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 2d 3e 72     memmove(&p->r
231b0 65 64 69 72 65 63 74 2e 61 5b 31 5d 2c 20 26 70  edirect.a[1], &p
231c0 2d 3e 72 65 64 69 72 65 63 74 2e 61 5b 30 5d 2c  ->redirect.a[0],
231d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 69   .            si
231e0 7a 65 6f 66 28 73 74 72 75 63 74 20 52 65 64 69  zeof(struct Redi
231f0 72 65 63 74 45 6e 74 72 79 29 20 2a 20 70 2d 3e  rectEntry) * p->
23200 72 65 64 69 72 65 63 74 2e 6e 0a 20 20 20 20 20  redirect.n.     
23210 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
23220 20 20 70 2d 3e 72 65 64 69 72 65 63 74 2e 61 5b    p->redirect.a[
23230 30 5d 2e 69 46 72 6f 6d 20 3d 20 69 46 72 6f 6d  0].iFrom = iFrom
23240 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65 64  ;.        p->red
23250 69 72 65 63 74 2e 61 5b 30 5d 2e 69 54 6f 20 3d  irect.a[0].iTo =
23260 20 69 54 6f 3b 0a 20 20 20 20 20 20 20 20 70 2d   iTo;.        p-
23270 3e 72 65 64 69 72 65 63 74 2e 6e 2b 2b 3b 0a 20  >redirect.n++;. 
23280 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23290 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 46 72      /* Block iFr
232a0 6f 6d 20 77 61 73 20 61 6c 72 65 61 64 79 20 72  om was already r
232b0 65 64 69 72 65 63 74 65 64 2e 20 4f 76 65 72 77  edirected. Overw
232c0 72 69 74 65 20 65 78 69 73 74 69 6e 67 20 65 6e  rite existing en
232d0 74 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  try. */.        
232e0 70 2d 3e 72 65 64 69 72 65 63 74 2e 61 5b 69 5d  p->redirect.a[i]
232f0 2e 69 54 6f 20 3d 20 69 54 6f 3b 0a 20 20 20 20  .iTo = iTo;.    
23300 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20    }..      rc = 
23310 6c 73 6d 42 6c 6f 63 6b 46 72 65 65 28 70 44 62  lsmBlockFree(pDb
23320 2c 20 69 46 72 6f 6d 29 3b 0a 0a 20 20 20 20 20  , iFrom);..     
23330 20 2a 70 6e 57 72 69 74 65 20 3d 20 6c 73 6d 46   *pnWrite = lsmF
23340 73 42 6c 6f 63 6b 53 69 7a 65 28 70 44 62 2d 3e  sBlockSize(pDb->
23350 70 46 53 29 20 2f 20 6c 73 6d 46 73 50 61 67 65  pFS) / lsmFsPage
23360 53 69 7a 65 28 70 44 62 2d 3e 70 46 53 29 3b 0a  Size(pDb->pFS);.
23370 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6c 68 73 2e        pLvl->lhs.
23380 70 52 65 64 69 72 65 63 74 20 3d 20 26 70 2d 3e  pRedirect = &p->
23390 72 65 64 69 72 65 63 74 3b 0a 20 20 20 20 7d 0a  redirect;.    }.
233a0 20 20 7d 0a 0a 23 69 66 20 4c 53 4d 5f 4c 4f 47    }..#if LSM_LOG
233b0 5f 53 54 52 55 43 54 55 52 45 0a 20 20 69 66 28  _STRUCTURE.  if(
233c0 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20   rc==LSM_OK ){. 
233d0 20 20 20 63 68 61 72 20 61 42 75 66 5b 36 34 5d     char aBuf[64]
233e0 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 61 42  ;.    sprintf(aB
233f0 75 66 2c 20 22 6d 6f 76 65 2d 62 6c 6f 63 6b 20  uf, "move-block 
23400 25 64 2f 25 64 22 2c 20 70 2d 3e 72 65 64 69 72  %d/%d", p->redir
23410 65 63 74 2e 6e 2d 31 2c 20 4c 53 4d 5f 4d 41 58  ect.n-1, LSM_MAX
23420 5f 42 4c 4f 43 4b 5f 52 45 44 49 52 45 43 54 53  _BLOCK_REDIRECTS
23430 29 3b 0a 20 20 20 20 6c 73 6d 53 6f 72 74 65 64  );.    lsmSorted
23440 44 75 6d 70 53 74 72 75 63 74 75 72 65 28 70 44  DumpStructure(pD
23450 62 2c 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2c  b, pDb->pWorker,
23460 20 4c 53 4d 5f 4c 4f 47 5f 44 41 54 41 2c 20 30   LSM_LOG_DATA, 0
23470 2c 20 61 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e  , aBuf);.  }.#en
23480 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  dif.  return rc;
23490 0a 7d 0a 0a 2f 2a 0a 2a 2f 0a 73 74 61 74 69 63  .}../*.*/.static
234a0 20 69 6e 74 20 6d 65 72 67 65 49 6e 73 65 72 74   int mergeInsert
234b0 46 72 65 65 6c 69 73 74 53 65 67 6d 65 6e 74 73  FreelistSegments
234c0 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c  (.  lsm_db *pDb,
234d0 20 0a 20 20 69 6e 74 20 6e 46 72 65 65 2c 0a 20   .  int nFree,. 
234e0 20 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d   MergeWorker *pM
234f0 57 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  W.){.  int rc = 
23500 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 66 28 20 6e 46  LSM_OK;.  if( nF
23510 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 4d 75 6c  ree>0 ){.    Mul
23520 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d  tiCursor *pCsr =
23530 20 70 4d 57 2d 3e 70 43 73 72 3b 0a 20 20 20 20   pMW->pCsr;.    
23540 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 70 4d  Level *pLvl = pM
23550 57 2d 3e 70 4c 65 76 65 6c 3b 0a 20 20 20 20 53  W->pLevel;.    S
23560 65 67 6d 65 6e 74 50 74 72 20 2a 61 4e 65 77 31  egmentPtr *aNew1
23570 3b 0a 20 20 20 20 53 65 67 6d 65 6e 74 20 2a 61  ;.    Segment *a
23580 4e 65 77 32 3b 0a 0a 20 20 20 20 4c 65 76 65 6c  New2;..    Level
23590 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 4c 65 76   *pIter;.    Lev
235a0 65 6c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69  el *pNext;.    i
235b0 6e 74 20 69 20 3d 20 30 3b 0a 0a 20 20 20 20 61  nt i = 0;..    a
235c0 4e 65 77 31 20 3d 20 28 53 65 67 6d 65 6e 74 50  New1 = (SegmentP
235d0 74 72 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a 65  tr *)lsmMallocZe
235e0 72 6f 52 63 28 0a 20 20 20 20 20 20 20 20 70 44  roRc(.        pD
235f0 62 2d 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28  b->pEnv, sizeof(
23600 53 65 67 6d 65 6e 74 50 74 72 29 20 2a 20 28 70  SegmentPtr) * (p
23610 43 73 72 2d 3e 6e 50 74 72 2b 6e 46 72 65 65 29  Csr->nPtr+nFree)
23620 2c 20 26 72 63 0a 20 20 20 20 29 3b 0a 20 20 20  , &rc.    );.   
23630 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
23640 20 72 63 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28   rc;.    memcpy(
23650 26 61 4e 65 77 31 5b 6e 46 72 65 65 5d 2c 20 70  &aNew1[nFree], p
23660 43 73 72 2d 3e 61 50 74 72 2c 20 73 69 7a 65 6f  Csr->aPtr, sizeo
23670 66 28 53 65 67 6d 65 6e 74 50 74 72 29 2a 70 43  f(SegmentPtr)*pC
23680 73 72 2d 3e 6e 50 74 72 29 3b 0a 20 20 20 20 70  sr->nPtr);.    p
23690 43 73 72 2d 3e 6e 50 74 72 20 2b 3d 20 6e 46 72  Csr->nPtr += nFr
236a0 65 65 3b 0a 20 20 20 20 6c 73 6d 46 72 65 65 28  ee;.    lsmFree(
236b0 70 44 62 2d 3e 70 45 6e 76 2c 20 70 43 73 72 2d  pDb->pEnv, pCsr-
236c0 3e 61 54 72 65 65 29 3b 0a 20 20 20 20 6c 73 6d  >aTree);.    lsm
236d0 46 72 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20  Free(pDb->pEnv, 
236e0 70 43 73 72 2d 3e 61 50 74 72 29 3b 0a 20 20 20  pCsr->aPtr);.   
236f0 20 70 43 73 72 2d 3e 61 54 72 65 65 20 3d 20 30   pCsr->aTree = 0
23700 3b 0a 20 20 20 20 70 43 73 72 2d 3e 61 50 74 72  ;.    pCsr->aPtr
23710 20 3d 20 61 4e 65 77 31 3b 0a 0a 20 20 20 20 61   = aNew1;..    a
23720 4e 65 77 32 20 3d 20 28 53 65 67 6d 65 6e 74 20  New2 = (Segment 
23730 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52  *)lsmMallocZeroR
23740 63 28 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  c(.        pDb->
23750 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28 53 65 67  pEnv, sizeof(Seg
23760 6d 65 6e 74 29 20 2a 20 28 70 4c 76 6c 2d 3e 6e  ment) * (pLvl->n
23770 52 69 67 68 74 2b 6e 46 72 65 65 29 2c 20 26 72  Right+nFree), &r
23780 63 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  c.    );.    if(
23790 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
237a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4e 65  .    memcpy(&aNe
237b0 77 32 5b 6e 46 72 65 65 5d 2c 20 70 4c 76 6c 2d  w2[nFree], pLvl-
237c0 3e 61 52 68 73 2c 20 73 69 7a 65 6f 66 28 53 65  >aRhs, sizeof(Se
237d0 67 6d 65 6e 74 29 2a 70 4c 76 6c 2d 3e 6e 52 69  gment)*pLvl->nRi
237e0 67 68 74 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  ght);.    pLvl->
237f0 6e 52 69 67 68 74 20 2b 3d 20 6e 46 72 65 65 3b  nRight += nFree;
23800 0a 20 20 20 20 6c 73 6d 46 72 65 65 28 70 44 62  .    lsmFree(pDb
23810 2d 3e 70 45 6e 76 2c 20 70 4c 76 6c 2d 3e 61 52  ->pEnv, pLvl->aR
23820 68 73 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61  hs);.    pLvl->a
23830 52 68 73 20 3d 20 61 4e 65 77 32 3b 0a 0a 20 20  Rhs = aNew2;..  
23840 20 20 66 6f 72 28 70 49 74 65 72 3d 70 44 62 2d    for(pIter=pDb-
23850 3e 70 57 6f 72 6b 65 72 2d 3e 70 4c 65 76 65 6c  >pWorker->pLevel
23860 3b 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20  ; rc==LSM_OK && 
23870 70 49 74 65 72 21 3d 70 4c 76 6c 3b 20 70 49 74  pIter!=pLvl; pIt
23880 65 72 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  er=pNext){.     
23890 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d   Segment *pSeg =
238a0 20 26 70 4c 76 6c 2d 3e 61 52 68 73 5b 69 5d 3b   &pLvl->aRhs[i];
238b0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 53  .      memcpy(pS
238c0 65 67 2c 20 26 70 49 74 65 72 2d 3e 6c 68 73 2c  eg, &pIter->lhs,
238d0 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 29   sizeof(Segment)
238e0 29 3b 0a 0a 20 20 20 20 20 20 70 43 73 72 2d 3e  );..      pCsr->
238f0 61 50 74 72 5b 69 5d 2e 70 53 65 67 20 3d 20 70  aPtr[i].pSeg = p
23900 53 65 67 3b 0a 20 20 20 20 20 20 70 43 73 72 2d  Seg;.      pCsr-
23910 3e 61 50 74 72 5b 69 5d 2e 70 4c 65 76 65 6c 20  >aPtr[i].pLevel 
23920 3d 20 70 4c 76 6c 3b 0a 20 20 20 20 20 20 72 63  = pLvl;.      rc
23930 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 45 6e 64   = segmentPtrEnd
23940 28 70 43 73 72 2c 20 26 70 43 73 72 2d 3e 61 50  (pCsr, &pCsr->aP
23950 74 72 5b 69 5d 2c 20 30 29 3b 0a 0a 20 20 20 20  tr[i], 0);..    
23960 20 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2d 3e    pDb->pWorker->
23970 70 4c 65 76 65 6c 20 3d 20 70 4e 65 78 74 20 3d  pLevel = pNext =
23980 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 3b 0a 20   pIter->pNext;. 
23990 20 20 20 20 20 73 6f 72 74 65 64 46 72 65 65 4c       sortedFreeL
239a0 65 76 65 6c 28 70 44 62 2d 3e 70 45 6e 76 2c 20  evel(pDb->pEnv, 
239b0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69 2b  pIter);.      i+
239c0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  +;.    }.    ass
239d0 65 72 74 28 20 69 3d 3d 6e 46 72 65 65 20 29 3b  ert( i==nFree );
239e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
239f0 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 70 44 62 2d 3e  =LSM_OK || pDb->
23a00 70 57 6f 72 6b 65 72 2d 3e 70 4c 65 76 65 6c 3d  pWorker->pLevel=
23a10 3d 70 4c 76 6c 20 29 3b 0a 0a 20 20 20 20 66 6f  =pLvl );..    fo
23a20 72 28 69 3d 6e 46 72 65 65 3b 20 69 3c 70 43 73  r(i=nFree; i<pCs
23a30 72 2d 3e 6e 50 74 72 3b 20 69 2b 2b 29 7b 0a 20  r->nPtr; i++){. 
23a40 20 20 20 20 20 70 43 73 72 2d 3e 61 50 74 72 5b       pCsr->aPtr[
23a50 69 5d 2e 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d  i].pSeg = &pLvl-
23a60 3e 61 52 68 73 5b 69 5d 3b 0a 20 20 20 20 7d 0a  >aRhs[i];.    }.
23a70 0a 20 20 20 20 6c 73 6d 46 72 65 65 28 70 44 62  .    lsmFree(pDb
23a80 2d 3e 70 45 6e 76 2c 20 70 4d 57 2d 3e 61 47 6f  ->pEnv, pMW->aGo
23a90 62 62 6c 65 29 3b 0a 20 20 20 20 70 4d 57 2d 3e  bble);.    pMW->
23aa0 61 47 6f 62 62 6c 65 20 3d 20 30 3b 0a 20 20 7d  aGobble = 0;.  }
23ab0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23ac0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74  .static int sort
23ad0 65 64 57 6f 72 6b 28 0a 20 20 6c 73 6d 5f 64 62  edWork(.  lsm_db
23ae0 20 2a 70 44 62 2c 20 20 20 20 20 20 20 20 20 20   *pDb,          
23af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
23b00 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 4d 75  abase handle. Mu
23b10 73 74 20 62 65 20 77 6f 72 6b 65 72 2e 20 2a 2f  st be worker. */
23b20 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 2c 20 20 20  .  int nWork,   
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23b50 70 61 67 65 73 20 6f 66 20 77 6f 72 6b 20 74 6f  pages of work to
23b60 20 64 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65   do */.  int nMe
23b70 72 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rge,            
23b80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 79 20           /* Try 
23b90 74 6f 20 6d 65 72 67 65 20 74 68 69 73 20 6d 61  to merge this ma
23ba0 6e 79 20 6c 65 76 65 6c 73 20 61 74 20 6f 6e 63  ny levels at onc
23bb0 65 20 2a 2f 0a 20 20 69 6e 74 20 62 46 6c 75 73  e */.  int bFlus
23bc0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
23bd0 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69 66         /* Set if
23be0 20 63 61 6c 6c 20 69 73 20 74 6f 20 6d 61 6b 65   call is to make
23bf0 20 72 6f 6f 6d 20 66 6f 72 20 61 20 66 6c 75 73   room for a flus
23c00 68 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 57 72  h */.  int *pnWr
23c10 69 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ite             
23c20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41         /* OUT: A
23c30 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ctual number of 
23c40 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a 2f  pages written */
23c50 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c  .){.  int rc = L
23c60 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  SM_OK;          
23c70 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
23c80 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  Code */.  int nR
23c90 65 6d 61 69 6e 69 6e 67 20 3d 20 6e 57 6f 72 6b  emaining = nWork
23ca0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69  ;         /* Uni
23cb0 74 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f  ts of work to do
23cc0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
23cd0 67 20 2a 2f 0a 20 20 53 6e 61 70 73 68 6f 74 20  g */.  Snapshot 
23ce0 2a 70 57 6f 72 6b 65 72 20 3d 20 70 44 62 2d 3e  *pWorker = pDb->
23cf0 70 57 6f 72 6b 65 72 3b 0a 0a 20 20 61 73 73 65  pWorker;..  asse
23d00 72 74 28 20 70 57 6f 72 6b 65 72 20 29 3b 0a 20  rt( pWorker );. 
23d10 20 69 66 28 20 6c 73 6d 44 62 53 6e 61 70 73 68   if( lsmDbSnapsh
23d20 6f 74 4c 65 76 65 6c 28 70 57 6f 72 6b 65 72 29  otLevel(pWorker)
23d30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 4c 53 4d  ==0 ) return LSM
23d40 5f 4f 4b 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  _OK;..  while( n
23d50 52 65 6d 61 69 6e 69 6e 67 3e 30 20 29 7b 0a 20  Remaining>0 ){. 
23d60 20 20 20 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c     Level *pLevel
23d70 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69   = 0;..    /* Fi
23d80 6e 64 20 61 20 6c 65 76 65 6c 20 74 6f 20 77 6f  nd a level to wo
23d90 72 6b 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72 63  rk on. */.    rc
23da0 20 3d 20 73 6f 72 74 65 64 53 65 6c 65 63 74 4c   = sortedSelectL
23db0 65 76 65 6c 28 70 44 62 2c 20 6e 4d 65 72 67 65  evel(pDb, nMerge
23dc0 2c 20 26 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20  , &pLevel);.    
23dd0 61 73 73 65 72 74 28 20 72 63 3d 3d 4c 53 4d 5f  assert( rc==LSM_
23de0 4f 4b 20 7c 7c 20 70 4c 65 76 65 6c 3d 3d 30 20  OK || pLevel==0 
23df0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 76  );..    if( pLev
23e00 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  el==0 ){.      i
23e10 6e 74 20 6e 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  nt nDone = 0;.  
23e20 20 20 20 20 4c 65 76 65 6c 20 2a 70 54 6f 70 4c      Level *pTopL
23e30 65 76 65 6c 20 3d 20 6c 73 6d 44 62 53 6e 61 70  evel = lsmDbSnap
23e40 73 68 6f 74 4c 65 76 65 6c 28 70 44 62 2d 3e 70  shotLevel(pDb->p
23e50 57 6f 72 6b 65 72 29 3b 0a 20 20 20 20 20 20 69  Worker);.      i
23e60 66 28 20 62 46 6c 75 73 68 3d 3d 30 20 26 26 20  f( bFlush==0 && 
23e70 6e 4d 65 72 67 65 3d 3d 31 20 26 26 20 70 54 6f  nMerge==1 && pTo
23e80 70 4c 65 76 65 6c 20 26 26 20 70 54 6f 70 4c 65  pLevel && pTopLe
23e90 76 65 6c 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b  vel->pNext==0 ){
23ea0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 6f  .        rc = so
23eb0 72 74 65 64 4d 6f 76 65 42 6c 6f 63 6b 28 70 44  rtedMoveBlock(pD
23ec0 62 2c 20 26 6e 44 6f 6e 65 29 3b 0a 20 20 20 20  b, &nDone);.    
23ed0 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 6d 61 69    }.      nRemai
23ee0 6e 69 6e 67 20 2d 3d 20 6e 44 6f 6e 65 3b 0a 0a  ning -= nDone;..
23ef0 20 20 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e        /* Could n
23f00 6f 74 20 66 69 6e 64 20 61 6e 79 20 77 6f 72 6b  ot find any work
23f10 20 74 6f 20 64 6f 2e 20 46 69 6e 69 73 68 65 64   to do. Finished
23f20 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e  . */.      if( n
23f30 44 6f 6e 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Done==0 ) break;
23f40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23f50 20 20 69 6e 74 20 62 53 61 76 65 20 3d 20 30 3b    int bSave = 0;
23f60 0a 20 20 20 20 20 20 46 72 65 65 6c 69 73 74 20  .      Freelist 
23f70 66 72 65 65 6c 69 73 74 20 3d 20 7b 30 2c 20 30  freelist = {0, 0
23f80 2c 20 30 7d 3b 0a 20 20 20 20 20 20 4d 65 72 67  , 0};.      Merg
23f90 65 57 6f 72 6b 65 72 20 6d 65 72 67 65 77 6f 72  eWorker mergewor
23fa0 6b 65 72 3b 20 20 20 20 2f 2a 20 53 74 61 74 65  ker;    /* State
23fb0 20 75 73 65 64 20 74 6f 20 77 6f 72 6b 20 6f 6e   used to work on
23fc0 20 74 68 65 20 6c 65 76 65 6c 20 6d 65 72 67 65   the level merge
23fd0 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
23fe0 74 28 20 70 44 62 2d 3e 62 49 6e 63 72 4d 65 72  t( pDb->bIncrMer
23ff0 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ge==0 );.      a
24000 73 73 65 72 74 28 20 70 44 62 2d 3e 70 46 72 65  ssert( pDb->pFre
24010 65 6c 69 73 74 3d 3d 30 20 26 26 20 70 44 62 2d  elist==0 && pDb-
24020 3e 62 55 73 65 46 72 65 65 6c 69 73 74 3d 3d 30  >bUseFreelist==0
24030 20 29 3b 0a 0a 20 20 20 20 20 20 70 44 62 2d 3e   );..      pDb->
24040 62 49 6e 63 72 4d 65 72 67 65 20 3d 20 31 3b 0a  bIncrMerge = 1;.
24050 20 20 20 20 20 20 72 63 20 3d 20 6d 65 72 67 65        rc = merge
24060 57 6f 72 6b 65 72 49 6e 69 74 28 70 44 62 2c 20  WorkerInit(pDb, 
24070 70 4c 65 76 65 6c 2c 20 26 6d 65 72 67 65 77 6f  pLevel, &mergewo
24080 72 6b 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  rker);.      ass
24090 65 72 74 28 20 6d 65 72 67 65 77 6f 72 6b 65 72  ert( mergeworker
240a0 2e 6e 57 6f 72 6b 3d 3d 30 20 29 3b 0a 20 20 20  .nWork==0 );.   
240b0 20 20 20 0a 20 20 20 20 20 20 77 68 69 6c 65 28     .      while(
240c0 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 0a 20 20 20   rc==LSM_OK .   
240d0 20 20 20 20 20 20 20 26 26 20 30 3d 3d 6d 65 72         && 0==mer
240e0 67 65 57 6f 72 6b 65 72 44 6f 6e 65 28 26 6d 65  geWorkerDone(&me
240f0 72 67 65 77 6f 72 6b 65 72 29 20 0a 20 20 20 20  rgeworker) .    
24100 20 20 20 20 20 20 26 26 20 28 6d 65 72 67 65 77        && (mergew
24110 6f 72 6b 65 72 2e 6e 57 6f 72 6b 3c 6e 52 65 6d  orker.nWork<nRem
24120 61 69 6e 69 6e 67 20 7c 7c 20 70 44 62 2d 3e 62  aining || pDb->b
24130 55 73 65 46 72 65 65 6c 69 73 74 29 0a 20 20 20  UseFreelist).   
24140 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
24150 74 20 65 54 79 70 65 20 3d 20 72 74 54 6f 70 69  t eType = rtTopi
24160 63 28 6d 65 72 67 65 77 6f 72 6b 65 72 2e 70 43  c(mergeworker.pC
24170 73 72 2d 3e 65 54 79 70 65 29 3b 0a 20 20 20 20  sr->eType);.    
24180 20 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57 6f      rc = mergeWo
24190 72 6b 65 72 53 74 65 70 28 26 6d 65 72 67 65 77  rkerStep(&mergew
241a0 6f 72 6b 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  orker);..       
241b0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
241c0 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20  r now points at 
241d0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
241e0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
241f0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  the.        ** u
24200 73 65 72 20 64 61 74 61 20 28 69 2e 65 2e 20 65  ser data (i.e. e
24210 69 74 68 65 72 20 74 6f 20 45 4f 46 20 6f 72 20  ither to EOF or 
24220 74 6f 20 74 68 65 20 66 69 72 73 74 20 66 72 65  to the first fre
24230 65 2d 6c 69 73 74 20 65 6e 74 72 79 0a 20 20 20  e-list entry.   
24240 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c       ** that wil
24250 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
24260 65 20 72 75 6e 29 2c 20 74 68 65 6e 20 63 68 65  e run), then che
24270 63 6b 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ck if it is poss
24280 69 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 20 20  ible to.        
24290 2a 2a 20 6d 65 72 67 65 20 69 6e 20 61 6e 79 20  ** merge in any 
242a0 66 72 65 65 2d 6c 69 73 74 20 65 6e 74 72 69 65  free-list entrie
242b0 73 20 74 68 61 74 20 61 72 65 20 65 69 74 68 65  s that are eithe
242c0 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 72 20 69  r in-memory or i
242d0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 65  n.        ** fre
242e0 65 2d 6c 69 73 74 2d 6f 6e 6c 79 20 62 6c 6f 63  e-list-only bloc
242f0 6b 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ks.  */.        
24300 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26  if( rc==LSM_OK &
24310 26 20 6e 4d 65 72 67 65 3d 3d 31 20 26 26 20 65  & nMerge==1 && e
24320 54 79 70 65 3d 3d 30 0a 20 20 20 20 20 20 20 20  Type==0.        
24330 20 26 26 20 28 72 74 54 6f 70 69 63 28 6d 65 72   && (rtTopic(mer
24340 67 65 77 6f 72 6b 65 72 2e 70 43 73 72 2d 3e 65  geworker.pCsr->e
24350 54 79 70 65 29 20 7c 7c 20 6d 65 72 67 65 57 6f  Type) || mergeWo
24360 72 6b 65 72 44 6f 6e 65 28 26 6d 65 72 67 65 77  rkerDone(&mergew
24370 6f 72 6b 65 72 29 29 0a 20 20 20 20 20 20 20 20  orker)).        
24380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
24390 20 6e 46 72 65 65 20 3d 20 30 3b 20 20 20 20 20   nFree = 0;     
243a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
243b0 66 20 66 72 65 65 2d 6c 69 73 74 2d 6f 6e 6c 79  f free-list-only
243c0 20 6c 65 76 65 6c 73 20 74 6f 20 6d 65 72 67 65   levels to merge
243d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4c 65   */.          Le
243e0 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 20  vel *pLvl;.     
243f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62       assert( pDb
24400 2d 3e 70 46 72 65 65 6c 69 73 74 3d 3d 30 20 26  ->pFreelist==0 &
24410 26 20 70 44 62 2d 3e 62 55 73 65 46 72 65 65 6c  & pDb->bUseFreel
24420 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  ist==0 );..     
24430 20 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63       /* Now chec
24440 6b 20 69 66 20 61 6c 6c 20 6c 65 76 65 6c 73 20  k if all levels 
24450 63 6f 6e 74 61 69 6e 69 6e 67 20 64 61 74 61 20  containing data 
24460 6e 65 77 65 72 20 74 68 61 6e 20 74 68 69 73 20  newer than this 
24470 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  one.          **
24480 20 61 72 65 20 73 69 6e 67 6c 65 2d 73 65 67 6d   are single-segm
24490 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e  ent free-list on
244a0 6c 79 20 6c 65 76 65 6c 73 2e 20 49 66 20 73 6f  ly levels. If so
244b0 2c 20 74 68 65 79 20 77 69 6c 6c 20 62 65 0a 20  , they will be. 
244c0 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 72 67           ** merg
244d0 65 64 20 69 6e 20 6e 6f 77 2e 20 20 2a 2f 0a 20  ed in now.  */. 
244e0 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 4c 76           for(pLv
244f0 6c 3d 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2d 3e  l=pDb->pWorker->
24500 70 4c 65 76 65 6c 3b 20 0a 20 20 20 20 20 20 20  pLevel; .       
24510 20 20 20 20 20 20 20 70 4c 76 6c 21 3d 6d 65 72         pLvl!=mer
24520 67 65 77 6f 72 6b 65 72 2e 70 4c 65 76 65 6c 20  geworker.pLevel 
24530 26 26 20 28 70 4c 76 6c 2d 3e 66 6c 61 67 73 20  && (pLvl->flags 
24540 26 20 4c 45 56 45 4c 5f 46 52 45 45 4c 49 53 54  & LEVEL_FREELIST
24550 5f 4f 4e 4c 59 29 3b 20 0a 20 20 20 20 20 20 20  _ONLY); .       
24560 20 20 20 20 20 20 20 70 4c 76 6c 3d 70 4c 76 6c         pLvl=pLvl
24570 2d 3e 70 4e 65 78 74 0a 20 20 20 20 20 20 20 20  ->pNext.        
24580 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
24590 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e   assert( pLvl->n
245a0 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
245b0 20 20 20 20 20 20 20 20 6e 46 72 65 65 2b 2b 3b          nFree++;
245c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
245d0 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 3d         if( pLvl=
245e0 3d 6d 65 72 67 65 77 6f 72 6b 65 72 2e 70 4c 65  =mergeworker.pLe
245f0 76 65 6c 20 29 7b 0a 0a 20 20 20 20 20 20 20 20  vel ){..        
24600 20 20 20 20 72 63 20 3d 20 6d 65 72 67 65 49 6e      rc = mergeIn
24610 73 65 72 74 46 72 65 65 6c 69 73 74 53 65 67 6d  sertFreelistSegm
24620 65 6e 74 73 28 70 44 62 2c 20 6e 46 72 65 65 2c  ents(pDb, nFree,
24630 20 26 6d 65 72 67 65 77 6f 72 6b 65 72 29 3b 0a   &mergeworker);.
24640 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24650 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
24660 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
24670 20 6d 75 6c 74 69 43 75 72 73 6f 72 56 69 73 69   multiCursorVisi
24680 74 46 72 65 65 6c 69 73 74 28 6d 65 72 67 65 77  tFreelist(mergew
24690 6f 72 6b 65 72 2e 70 43 73 72 29 3b 0a 20 20 20  orker.pCsr);.   
246a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
246b0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c         if( rc==L
246c0 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  SM_OK ){.       
246d0 20 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74         rc = mult
246e0 69 43 75 72 73 6f 72 53 65 74 75 70 54 72 65 65  iCursorSetupTree
246f0 28 6d 65 72 67 65 77 6f 72 6b 65 72 2e 70 43 73  (mergeworker.pCs
24700 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
24710 20 20 20 20 20 70 44 62 2d 3e 70 46 72 65 65 6c       pDb->pFreel
24720 69 73 74 20 3d 20 26 66 72 65 65 6c 69 73 74 3b  ist = &freelist;
24730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
24740 44 62 2d 3e 62 55 73 65 46 72 65 65 6c 69 73 74  Db->bUseFreelist
24750 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
24760 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
24770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24780 7d 0a 20 20 20 20 20 20 6e 52 65 6d 61 69 6e 69  }.      nRemaini
24790 6e 67 20 2d 3d 20 4c 53 4d 5f 4d 41 58 28 6d 65  ng -= LSM_MAX(me
247a0 72 67 65 77 6f 72 6b 65 72 2e 6e 57 6f 72 6b 2c  rgeworker.nWork,
247b0 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   1);..      if( 
247c0 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
247d0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69        /* Check i
247e0 66 20 74 68 65 20 6d 65 72 67 65 20 6f 70 65 72  f the merge oper
247f0 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ation is complet
24800 65 6c 79 20 66 69 6e 69 73 68 65 64 2e 20 49 66  ely finished. If
24810 20 6e 6f 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a   not,.        **
24820 20 67 6f 62 62 6c 65 20 75 70 20 28 64 65 63 6c   gobble up (decl
24830 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72  are eligible for
24840 20 72 65 63 79 63 6c 69 6e 67 29 20 61 6e 79 20   recycling) any 
24850 70 61 67 65 73 20 66 72 6f 6d 20 72 68 73 0a 20  pages from rhs. 
24860 20 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e         ** segmen
24870 74 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ts for which the
24880 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
24890 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6d 65 72  n completely mer
248a0 67 65 64 20 69 6e 74 6f 20 0a 20 20 20 20 20 20  ged into .      
248b0 20 20 2a 2a 20 74 68 65 20 6c 68 73 20 6f 66 20    ** the lhs of 
248c0 74 68 65 20 6c 65 76 65 6c 2e 20 20 2a 2f 0a 20  the level.  */. 
248d0 20 20 20 20 20 20 20 69 66 28 20 6d 65 72 67 65         if( merge
248e0 57 6f 72 6b 65 72 44 6f 6e 65 28 26 6d 65 72 67  WorkerDone(&merg
248f0 65 77 6f 72 6b 65 72 29 3d 3d 30 20 29 7b 0a 20  eworker)==0 ){. 
24900 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
24910 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
24920 30 3b 20 69 3c 70 4c 65 76 65 6c 2d 3e 6e 52 69  0; i<pLevel->nRi
24930 67 68 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ght; i++){.     
24940 20 20 20 20 20 20 20 53 65 67 6d 65 6e 74 50 74         SegmentPt
24950 72 20 2a 70 47 6f 62 62 6c 65 20 3d 20 26 6d 65  r *pGobble = &me
24960 72 67 65 77 6f 72 6b 65 72 2e 70 43 73 72 2d 3e  rgeworker.pCsr->
24970 61 50 74 72 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aPtr[i];.       
24980 20 20 20 20 20 69 66 28 20 70 47 6f 62 62 6c 65       if( pGobble
24990 2d 3e 70 53 65 67 2d 3e 69 52 6f 6f 74 20 29 7b  ->pSeg->iRoot ){
249a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
249b0 63 20 3d 20 73 6f 72 74 65 64 42 74 72 65 65 47  c = sortedBtreeG
249c0 6f 62 62 6c 65 28 70 44 62 2c 20 6d 65 72 67 65  obble(pDb, merge
249d0 77 6f 72 6b 65 72 2e 70 43 73 72 2c 20 69 29 3b  worker.pCsr, i);
249e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
249f0 73 65 20 69 66 28 20 6d 65 72 67 65 77 6f 72 6b  se if( mergework
24a00 65 72 2e 61 47 6f 62 62 6c 65 5b 69 5d 20 29 7b  er.aGobble[i] ){
24a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
24a20 73 6d 46 73 47 6f 62 62 6c 65 28 70 44 62 2c 20  smFsGobble(pDb, 
24a30 70 47 6f 62 62 6c 65 2d 3e 70 53 65 67 2c 20 26  pGobble->pSeg, &
24a40 6d 65 72 67 65 77 6f 72 6b 65 72 2e 61 47 6f 62  mergeworker.aGob
24a50 62 6c 65 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20  ble[i], 1);.    
24a60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24a70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
24a80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
24a90 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
24aa0 69 6e 74 20 62 45 6d 70 74 79 3b 0a 20 20 20 20  int bEmpty;.    
24ab0 20 20 20 20 20 20 6d 65 72 67 65 57 6f 72 6b 65        mergeWorke
24ac0 72 53 68 75 74 64 6f 77 6e 28 26 6d 65 72 67 65  rShutdown(&merge
24ad0 77 6f 72 6b 65 72 2c 20 26 72 63 29 3b 0a 20 20  worker, &rc);.  
24ae0 20 20 20 20 20 20 20 20 62 45 6d 70 74 79 20 3d          bEmpty =
24af0 20 28 70 4c 65 76 65 6c 2d 3e 6c 68 73 2e 69 46   (pLevel->lhs.iF
24b00 69 72 73 74 3d 3d 30 29 3b 0a 0a 20 20 20 20 20  irst==0);..     
24b10 20 20 20 20 20 69 66 28 20 62 45 6d 70 74 79 3d       if( bEmpty=
24b20 3d 30 20 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  =0 && rc==LSM_OK
24b30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24b40 72 63 20 3d 20 6c 73 6d 46 73 53 6f 72 74 65 64  rc = lsmFsSorted
24b50 46 69 6e 69 73 68 28 70 44 62 2d 3e 70 46 53 2c  Finish(pDb->pFS,
24b60 20 26 70 4c 65 76 65 6c 2d 3e 6c 68 73 29 3b 0a   &pLevel->lhs);.
24b70 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
24b80 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e         if( pDb->
24b90 62 55 73 65 46 72 65 65 6c 69 73 74 20 29 7b 0a  bUseFreelist ){.
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 46 72 65 65              Free
24bb0 6c 69 73 74 20 2a 70 20 3d 20 26 70 44 62 2d 3e  list *p = &pDb->
24bc0 70 57 6f 72 6b 65 72 2d 3e 66 72 65 65 6c 69 73  pWorker->freelis
24bd0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  t;.            l
24be0 73 6d 46 72 65 65 28 70 44 62 2d 3e 70 45 6e 76  smFree(pDb->pEnv
24bf0 2c 20 70 2d 3e 61 45 6e 74 72 79 29 3b 0a 20 20  , p->aEntry);.  
24c00 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
24c10 28 70 2c 20 26 66 72 65 65 6c 69 73 74 2c 20 73  (p, &freelist, s
24c20 69 7a 65 6f 66 28 66 72 65 65 6c 69 73 74 29 29  izeof(freelist))
24c30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  ;.            pD
24c40 62 2d 3e 62 55 73 65 46 72 65 65 6c 69 73 74 20  b->bUseFreelist 
24c50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
24c60 20 70 44 62 2d 3e 70 46 72 65 65 6c 69 73 74 20   pDb->pFreelist 
24c70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
24c80 20 62 53 61 76 65 20 3d 20 31 3b 0a 20 20 20 20   bSave = 1;.    
24c90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
24ca0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
24cb0 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3b 20 69 2b  evel->nRight; i+
24cc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
24cd0 6c 73 6d 46 73 53 6f 72 74 65 64 44 65 6c 65 74  lsmFsSortedDelet
24ce0 65 28 70 44 62 2d 3e 70 46 53 2c 20 70 57 6f 72  e(pDb->pFS, pWor
24cf0 6b 65 72 2c 20 31 2c 20 26 70 4c 65 76 65 6c 2d  ker, 1, &pLevel-
24d00 3e 61 52 68 73 5b 69 5d 29 3b 0a 20 20 20 20 20  >aRhs[i]);.     
24d10 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
24d20 20 20 69 66 28 20 62 45 6d 70 74 79 20 29 7b 0a    if( bEmpty ){.
24d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
24d40 66 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 20  f the new level 
24d50 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  is completely em
24d60 70 74 79 2c 20 72 65 6d 6f 76 65 20 69 74 20 66  pty, remove it f
24d70 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
24d80 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
24d90 20 73 6e 61 70 73 68 6f 74 2e 20 54 68 69 73 20   snapshot. This 
24da0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
24db0 69 66 20 61 6c 6c 20 69 6e 70 75 74 20 6b 65 79  if all input key
24dc0 73 20 77 65 72 65 0a 20 20 20 20 20 20 20 20 20  s were.         
24dd0 20 20 20 2a 2a 20 61 6e 6e 69 68 69 6c 61 74 65     ** annihilate
24de0 64 2e 20 53 69 6e 63 65 20 6b 65 79 73 20 61 72  d. Since keys ar
24df0 65 20 6f 6e 6c 79 20 61 6e 6e 69 68 69 6c 61 74  e only annihilat
24e00 65 64 20 69 66 20 74 68 65 20 6e 65 77 20 6c 65  ed if the new le
24e10 76 65 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  vel.            
24e20 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 69  ** is the last i
24e30 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
24e40 74 20 28 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  t (contains the 
24e50 6d 6f 73 74 20 61 6e 63 69 65 6e 74 20 6f 66 0a  most ancient of.
24e60 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64              ** d
24e70 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 29  atabase content)
24e80 2c 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65  , this guarantee
24e90 73 20 74 68 61 74 20 70 4c 65 76 65 6c 2d 3e 70  s that pLevel->p
24ea0 4e 65 78 74 3d 3d 30 2e 20 20 2a 2f 20 0a 20 20  Next==0.  */ .  
24eb0 20 20 20 20 20 20 20 20 20 20 4c 65 76 65 6c 20            Level 
24ec0 2a 70 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  *pTop;          
24ed0 2f 2a 20 54 6f 70 20 6c 65 76 65 6c 20 6f 66 20  /* Top level of 
24ee0 77 6f 72 6b 65 72 20 73 6e 61 70 73 68 6f 74 20  worker snapshot 
24ef0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 4c  */.            L
24f00 65 76 65 6c 20 2a 2a 70 70 3b 20 20 20 20 20 20  evel **pp;      
24f10 20 20 20 20 20 2f 2a 20 52 65 61 64 2f 77 72 69       /* Read/wri
24f20 74 65 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20  te iterator for 
24f30 4c 65 76 65 6c 2e 70 4e 65 78 74 20 6c 69 73 74  Level.pNext list
24f40 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
24f50 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
24f60 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 0a 20 20  >pNext==0 );..  
24f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
24f80 6f 76 65 20 74 68 65 20 6c 65 76 65 6c 20 66 72  ove the level fr
24f90 6f 6d 20 74 68 65 20 77 6f 72 6b 65 72 20 73 6e  om the worker sn
24fa0 61 70 73 68 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  apshot. */.     
24fb0 20 20 20 20 20 20 20 70 54 6f 70 20 3d 20 6c 73         pTop = ls
24fc0 6d 44 62 53 6e 61 70 73 68 6f 74 4c 65 76 65 6c  mDbSnapshotLevel
24fd0 28 70 57 6f 72 6b 65 72 29 3b 0a 20 20 20 20 20  (pWorker);.     
24fe0 20 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70         for(pp=&p
24ff0 54 6f 70 3b 20 2a 70 70 21 3d 70 4c 65 76 65 6c  Top; *pp!=pLevel
25000 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e  ; pp=&((*pp)->pN
25010 65 78 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ext));.         
25020 20 20 20 2a 70 70 20 3d 20 70 4c 65 76 65 6c 2d     *pp = pLevel-
25030 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
25040 20 20 20 20 6c 73 6d 44 62 53 6e 61 70 73 68 6f      lsmDbSnapsho
25050 74 53 65 74 4c 65 76 65 6c 28 70 57 6f 72 6b 65  tSetLevel(pWorke
25060 72 2c 20 70 54 6f 70 29 3b 0a 0a 20 20 20 20 20  r, pTop);..     
25070 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74         /* Free t
25080 68 65 20 4c 65 76 65 6c 20 73 74 72 75 63 74 75  he Level structu
25090 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re. */.         
250a0 20 20 20 73 6f 72 74 65 64 46 72 65 65 4c 65 76     sortedFreeLev
250b0 65 6c 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70 4c  el(pDb->pEnv, pL
250c0 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  evel);.         
250d0 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 20 20 20   }else{..       
250e0 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65       /* Free the
250f0 20 73 65 70 61 72 61 74 6f 72 73 20 6f 66 20 74   separators of t
25100 68 65 20 6e 65 78 74 20 6c 65 76 65 6c 2c 20 69  he next level, i
25110 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
25120 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
25130 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65 2d 3e 6e  Level->pMerge->n
25140 49 6e 70 75 74 20 3e 20 70 4c 65 76 65 6c 2d 3e  Input > pLevel->
25150 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  nRight ){.      
25160 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25170 70 4c 65 76 65 6c 2d 3e 70 4e 65 78 74 2d 3e 6c  pLevel->pNext->l
25180 68 73 2e 69 52 6f 6f 74 20 29 3b 0a 20 20 20 20  hs.iRoot );.    
25190 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c            pLevel
251a0 2d 3e 70 4e 65 78 74 2d 3e 6c 68 73 2e 69 52 6f  ->pNext->lhs.iRo
251b0 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ot = 0;.        
251c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
251d0 20 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 72     /* Zero the r
251e0 69 67 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f  ight-hand-side o
251f0 66 20 70 4c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  f pLevel */.    
25200 20 20 20 20 20 20 20 20 6c 73 6d 46 72 65 65 28          lsmFree(
25210 70 44 62 2d 3e 70 45 6e 76 2c 20 70 4c 65 76 65  pDb->pEnv, pLeve
25220 6c 2d 3e 61 52 68 73 29 3b 0a 20 20 20 20 20 20  l->aRhs);.      
25230 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 52        pLevel->nR
25240 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
25250 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 52        pLevel->aR
25260 68 73 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  hs = 0;..       
25270 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65       /* Free the
25280 20 4d 65 72 67 65 20 6f 62 6a 65 63 74 20 2a 2f   Merge object */
25290 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 73 6d  .            lsm
252a0 46 72 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20  Free(pDb->pEnv, 
252b0 70 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65 29 3b  pLevel->pMerge);
252c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65  .            pLe
252d0 76 65 6c 2d 3e 70 4d 65 72 67 65 20 3d 20 30 3b  vel->pMerge = 0;
252e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
252f0 20 20 20 20 20 20 20 20 69 66 28 20 62 53 61 76          if( bSav
25300 65 20 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20  e && rc==LSM_OK 
25310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
25320 44 62 2d 3e 62 49 6e 63 72 4d 65 72 67 65 20 3d  Db->bIncrMerge =
25330 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
25340 72 63 20 3d 20 6c 73 6d 53 61 76 65 57 6f 72 6b  rc = lsmSaveWork
25350 65 72 28 70 44 62 2c 20 30 29 3b 0a 20 20 20 20  er(pDb, 0);.    
25360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25370 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
25380 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65   /* Clean up the
25390 20 4d 65 72 67 65 57 6f 72 6b 65 72 20 6f 62 6a   MergeWorker obj
253a0 65 63 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ect initialized 
253b0 61 62 6f 76 65 2e 20 49 66 20 6e 6f 20 65 72 72  above. If no err
253c0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  or.      ** has 
253d0 6f 63 63 75 72 72 65 64 2c 20 69 6e 76 6f 6b 65  occurred, invoke
253e0 20 74 68 65 20 77 6f 72 6b 2d 68 6f 6f 6b 20 74   the work-hook t
253f0 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 61 70 70  o inform the app
25400 6c 69 63 61 74 69 6f 6e 20 74 68 61 74 0a 20 20  lication that.  
25410 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
25420 61 73 65 20 73 74 72 75 63 74 75 72 65 20 68 61  ase structure ha
25430 73 20 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 20 20  s changed. */.  
25440 20 20 20 20 6d 65 72 67 65 57 6f 72 6b 65 72 53      mergeWorkerS
25450 68 75 74 64 6f 77 6e 28 26 6d 65 72 67 65 77 6f  hutdown(&mergewo
25460 72 6b 65 72 2c 20 26 72 63 29 3b 0a 20 20 20 20  rker, &rc);.    
25470 20 20 70 44 62 2d 3e 62 49 6e 63 72 4d 65 72 67    pDb->bIncrMerg
25480 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  e = 0;.      if(
25490 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 73 6f   rc==LSM_OK ) so
254a0 72 74 65 64 49 6e 76 6f 6b 65 57 6f 72 6b 48 6f  rtedInvokeWorkHo
254b0 6f 6b 28 70 44 62 29 3b 0a 0a 23 69 66 20 4c 53  ok(pDb);..#if LS
254c0 4d 5f 4c 4f 47 5f 53 54 52 55 43 54 55 52 45 0a  M_LOG_STRUCTURE.
254d0 20 20 20 20 20 20 6c 73 6d 53 6f 72 74 65 64 44        lsmSortedD
254e0 75 6d 70 53 74 72 75 63 74 75 72 65 28 70 44 62  umpStructure(pDb
254f0 2c 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2c 20  , pDb->pWorker, 
25500 4c 53 4d 5f 4c 4f 47 5f 44 41 54 41 2c 20 30 2c  LSM_LOG_DATA, 0,
25510 20 22 77 6f 72 6b 22 29 3b 0a 23 65 6e 64 69 66   "work");.#endif
25520 0a 20 20 20 20 20 20 61 73 73 65 72 74 42 74 72  .      assertBtr
25530 65 65 4f 6b 28 70 44 62 2c 20 26 70 4c 65 76 65  eeOk(pDb, &pLeve
25540 6c 2d 3e 6c 68 73 29 3b 0a 20 20 20 20 20 20 61  l->lhs);.      a
25550 73 73 65 72 74 52 75 6e 49 6e 4f 72 64 65 72 28  ssertRunInOrder(
25560 70 44 62 2c 20 26 70 4c 65 76 65 6c 2d 3e 6c 68  pDb, &pLevel->lh
25570 73 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  s);..      /* If
25580 20 62 46 6c 75 73 68 20 69 73 20 74 72 75 65 20   bFlush is true 
25590 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
255a0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f   is no longer co
255b0 6e 73 69 64 65 72 65 64 20 22 66 75 6c 6c 22 2c  nsidered "full",
255c0 0a 20 20 20 20 20 20 2a 2a 20 62 72 65 61 6b 20  .      ** break 
255d0 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
255e0 65 76 65 6e 20 69 66 20 6e 52 65 6d 61 69 6e 69  even if nRemaini
255f0 6e 67 20 69 73 20 73 74 69 6c 6c 20 67 72 65 61  ng is still grea
25600 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ter than.      *
25610 2a 20 7a 65 72 6f 2e 20 54 68 65 20 63 61 6c 6c  * zero. The call
25620 65 72 20 68 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  er has an in-mem
25630 6f 72 79 20 74 72 65 65 20 74 6f 20 66 6c 75 73  ory tree to flus
25640 68 20 74 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a 20  h to disk.  */. 
25650 20 20 20 20 20 69 66 28 20 62 46 6c 75 73 68 20       if( bFlush 
25660 26 26 20 73 6f 72 74 65 64 44 62 49 73 46 75 6c  && sortedDbIsFul
25670 6c 28 70 44 62 29 3d 3d 30 20 29 20 62 72 65 61  l(pDb)==0 ) brea
25680 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
25690 69 66 28 20 70 6e 57 72 69 74 65 20 29 20 2a 70  if( pnWrite ) *p
256a0 6e 57 72 69 74 65 20 3d 20 28 6e 57 6f 72 6b 20  nWrite = (nWork 
256b0 2d 20 6e 52 65 6d 61 69 6e 69 6e 67 29 3b 0a 20  - nRemaining);. 
256c0 20 70 57 6f 72 6b 65 72 2d 3e 6e 57 72 69 74 65   pWorker->nWrite
256d0 20 2b 3d 20 28 6e 57 6f 72 6b 20 2d 20 6e 52 65   += (nWork - nRe
256e0 6d 61 69 6e 69 6e 67 29 3b 0a 0a 23 69 66 64 65  maining);..#ifde
256f0 66 20 4c 53 4d 5f 4c 4f 47 5f 57 4f 52 4b 0a 20  f LSM_LOG_WORK. 
25700 20 6c 73 6d 4c 6f 67 4d 65 73 73 61 67 65 28 70   lsmLogMessage(p
25710 44 62 2c 20 72 63 2c 20 22 73 6f 72 74 65 64 57  Db, rc, "sortedW
25720 6f 72 6b 28 29 3a 20 25 64 20 70 61 67 65 73 22  ork(): %d pages"
25730 2c 20 28 6e 57 6f 72 6b 2d 6e 52 65 6d 61 69 6e  , (nWork-nRemain
25740 69 6e 67 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ing));.#endif.  
25750 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25760 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65  .** The database
25770 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 61 73 73   connection pass
25780 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
25790 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
257a0 20 61 20 77 6f 72 6b 65 72 0a 2a 2a 20 63 6f 6e   a worker.** con
257b0 6e 65 63 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  nection. This fu
257c0 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
257d0 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 6e   there exists an
257e0 20 22 6f 6c 64 22 20 69 6e 2d 6d 65 6d 6f 72 79   "old" in-memory
257f0 20 74 72 65 65 0a 2a 2a 20 72 65 61 64 79 20 74   tree.** ready t
25800 6f 20 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20  o be flushed to 
25810 64 69 73 6b 2e 20 49 66 20 73 6f 2c 20 74 72 75  disk. If so, tru
25820 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
25830 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a  therwise false..
25840 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
25850 72 20 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69  r occurs, *pRc i
25860 73 20 73 65 74 20 74 6f 20 61 6e 20 4c 53 4d 20  s set to an LSM 
25870 65 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72  error code befor
25880 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20  e returning..** 
25890 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
258a0 61 74 20 2a 70 52 63 20 69 73 20 73 65 74 20 74  at *pRc is set t
258b0 6f 20 4c 53 4d 5f 4f 4b 20 77 68 65 6e 20 74 68  o LSM_OK when th
258c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
258d0 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
258e0 20 69 6e 74 20 73 6f 72 74 65 64 54 72 65 65 48   int sortedTreeH
258f0 61 73 4f 6c 64 28 6c 73 6d 5f 64 62 20 2a 70 44  asOld(lsm_db *pD
25900 62 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20  b, int *pRc){.  
25910 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b  int rc = LSM_OK;
25920 0a 20 20 69 6e 74 20 62 52 65 74 20 3d 20 30 3b  .  int bRet = 0;
25930 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ..  assert( pDb-
25940 3e 70 57 6f 72 6b 65 72 20 29 3b 0a 20 20 69 66  >pWorker );.  if
25950 28 20 2a 70 52 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  ( *pRc==LSM_OK )
25960 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53  {.    if( rc==LS
25970 4d 5f 4f 4b 20 0a 20 20 20 20 20 20 20 20 26 26  M_OK .        &&
25980 20 70 44 62 2d 3e 74 72 65 65 68 64 72 2e 69 4f   pDb->treehdr.iO
25990 6c 64 53 68 6d 69 64 0a 20 20 20 20 20 20 20 20  ldShmid.        
259a0 26 26 20 70 44 62 2d 3e 74 72 65 65 68 64 72 2e  && pDb->treehdr.
259b0 69 4f 6c 64 4c 6f 67 21 3d 70 44 62 2d 3e 70 57  iOldLog!=pDb->pW
259c0 6f 72 6b 65 72 2d 3e 69 4c 6f 67 4f 66 66 20 0a  orker->iLogOff .
259d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62        ){.      b
259e0 52 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Ret = 1;.    }el
259f0 73 65 7b 0a 20 20 20 20 20 20 62 52 65 74 20 3d  se{.      bRet =
25a00 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70   0;.    }.    *p
25a10 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 61  Rc = rc;.  }.  a
25a20 73 73 65 72 74 28 20 2a 70 52 63 3d 3d 4c 53 4d  ssert( *pRc==LSM
25a30 5f 4f 4b 20 7c 7c 20 62 52 65 74 3d 3d 30 20 29  _OK || bRet==0 )
25a40 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 3b  ;.  return bRet;
25a50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
25a60 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74   a new free-list
25a70 20 6f 6e 6c 79 20 74 6f 70 2d 6c 65 76 65 6c 20   only top-level 
25a80 73 65 67 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  segment. Return 
25a90 4c 53 4d 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  LSM_OK if succes
25aa0 73 66 75 6c 0a 2a 2a 20 6f 72 20 61 6e 20 4c 53  sful.** or an LS
25ab0 4d 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  M error code if 
25ac0 73 6f 6d 65 20 65 72 72 6f 72 20 6f 63 63 75 72  some error occur
25ad0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
25ae0 20 73 6f 72 74 65 64 4e 65 77 46 72 65 65 6c 69   sortedNewFreeli
25af0 73 74 4f 6e 6c 79 28 6c 73 6d 5f 64 62 20 2a 70  stOnly(lsm_db *p
25b00 44 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 6f  Db){.  return so
25b10 72 74 65 64 4e 65 77 54 6f 70 6c 65 76 65 6c 28  rtedNewToplevel(
25b20 70 44 62 2c 20 54 52 45 45 5f 4e 4f 4e 45 2c 20  pDb, TREE_NONE, 
25b30 30 29 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 53 61  0);.}..int lsmSa
25b40 76 65 57 6f 72 6b 65 72 28 6c 73 6d 5f 64 62 20  veWorker(lsm_db 
25b50 2a 70 44 62 2c 20 69 6e 74 20 62 46 6c 75 73 68  *pDb, int bFlush
25b60 29 7b 0a 20 20 53 6e 61 70 73 68 6f 74 20 2a 70  ){.  Snapshot *p
25b70 20 3d 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 3b   = pDb->pWorker;
25b80 0a 20 20 69 66 28 20 70 2d 3e 66 72 65 65 6c 69  .  if( p->freeli
25b90 73 74 2e 6e 45 6e 74 72 79 3e 70 44 62 2d 3e 6e  st.nEntry>pDb->n
25ba0 4d 61 78 46 72 65 65 6c 69 73 74 20 29 7b 0a 20  MaxFreelist ){. 
25bb0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 6f 72 74     int rc = sort
25bc0 65 64 4e 65 77 46 72 65 65 6c 69 73 74 4f 6e 6c  edNewFreelistOnl
25bd0 79 28 70 44 62 29 3b 0a 20 20 20 20 69 66 28 20  y(pDb);.    if( 
25be0 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72 65 74  rc!=LSM_OK ) ret
25bf0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  urn rc;.  }.  re
25c00 74 75 72 6e 20 6c 73 6d 43 68 65 63 6b 70 6f 69  turn lsmCheckpoi
25c10 6e 74 53 61 76 65 57 6f 72 6b 65 72 28 70 44 62  ntSaveWorker(pDb
25c20 2c 20 62 46 6c 75 73 68 29 3b 0a 7d 0a 0a 73 74  , bFlush);.}..st
25c30 61 74 69 63 20 69 6e 74 20 64 6f 4c 73 6d 53 69  atic int doLsmSi
25c40 6e 67 6c 65 57 6f 72 6b 28 0a 20 20 6c 73 6d 5f  ngleWork(.  lsm_
25c50 64 62 20 2a 70 44 62 2c 20 0a 20 20 69 6e 74 20  db *pDb, .  int 
25c60 62 53 68 75 74 64 6f 77 6e 2c 0a 20 20 69 6e 74  bShutdown,.  int
25c70 20 6e 4d 65 72 67 65 2c 20 20 20 20 20 20 20 20   nMerge,        
25c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25c90 4d 69 6e 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73  Minimum segments
25ca0 20 74 6f 20 6d 65 72 67 65 20 74 6f 67 65 74 68   to merge togeth
25cb0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  er */.  int nPag
25cc0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
25cd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
25ce0 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 77 72  r of pages to wr
25cf0 69 74 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  ite to disk */. 
25d00 20 69 6e 74 20 2a 70 6e 57 72 69 74 65 2c 20 20   int *pnWrite,  
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 73 20 61   /* OUT: Pages a
25d30 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20  ctually written 
25d40 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 6e 74  to disk */.  int
25d50 20 2a 70 62 43 6b 70 74 20 20 20 20 20 20 20 20   *pbCkpt        
25d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d70 4f 55 54 3a 20 54 72 75 65 20 69 66 20 61 6e 20  OUT: True if an 
25d80 61 75 74 6f 2d 63 68 65 63 6b 70 6f 69 6e 74 20  auto-checkpoint 
25d90 69 73 20 72 65 71 2e 20 2a 2f 0a 29 7b 0a 20 20  is req. */.){.  
25da0 53 6e 61 70 73 68 6f 74 20 2a 70 57 6f 72 6b 65  Snapshot *pWorke
25db0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
25dc0 2f 2a 20 57 6f 72 6b 65 72 20 73 6e 61 70 73 68  /* Worker snapsh
25dd0 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ot */.  int rc =
25de0 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20   LSM_OK;        
25df0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
25e00 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
25e10 62 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 6e  bDirty = 0;.  in
25e20 74 20 6e 4d 61 78 20 3d 20 6e 50 61 67 65 3b 20  t nMax = nPage; 
25e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25e40 20 4d 61 78 69 6d 75 6d 20 70 61 67 65 73 20 74   Maximum pages t
25e50 6f 20 77 72 69 74 65 20 74 6f 20 64 69 73 6b 20  o write to disk 
25e60 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  */.  int nRem = 
25e70 6e 50 61 67 65 3b 0a 20 20 69 6e 74 20 62 43 6b  nPage;.  int bCk
25e80 70 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  pt = 0;..  asser
25e90 74 28 20 6e 50 61 67 65 3e 30 20 29 3b 0a 0a 20  t( nPage>0 );.. 
25ea0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 77 6f 72   /* Open the wor
25eb0 6b 65 72 20 27 74 72 61 6e 73 61 63 74 69 6f 6e  ker 'transaction
25ec0 27 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6c  '. It will be cl
25ed0 6f 73 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  osed before this
25ee0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 72   function.  ** r
25ef0 65 74 75 72 6e 73 2e 20 20 2a 2f 0a 20 20 61 73  eturns.  */.  as
25f00 73 65 72 74 28 20 70 44 62 2d 3e 70 57 6f 72 6b  sert( pDb->pWork
25f10 65 72 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  er==0 );.  rc = 
25f20 6c 73 6d 42 65 67 69 6e 57 6f 72 6b 28 70 44 62  lsmBeginWork(pDb
25f30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 4c 53 4d  );.  if( rc!=LSM
25f40 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
25f50 0a 20 20 70 57 6f 72 6b 65 72 20 3d 20 70 44 62  .  pWorker = pDb
25f60 2d 3e 70 57 6f 72 6b 65 72 3b 0a 0a 20 20 2f 2a  ->pWorker;..  /*
25f70 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   If this connect
25f80 69 6f 6e 20 69 73 20 64 6f 69 6e 67 20 61 75 74  ion is doing aut
25f90 6f 2d 63 68 65 63 6b 70 6f 69 6e 74 73 2c 20 73  o-checkpoints, s
25fa0 65 74 20 6e 4d 61 78 20 28 61 6e 64 20 6e 52 65  et nMax (and nRe
25fb0 6d 29 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  m) so.  ** that 
25fc0 74 68 69 73 20 63 61 6c 6c 20 73 74 6f 70 73 20  this call stops 
25fd0 77 72 69 74 69 6e 67 20 77 68 65 6e 20 74 68 65  writing when the
25fe0 20 61 75 74 6f 2d 63 68 65 63 6b 70 6f 69 6e 74   auto-checkpoint
25ff0 20 69 73 20 64 75 65 2e 20 54 68 65 0a 20 20 2a   is due. The.  *
26000 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 6f  * caller will do
26010 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c   the checkpoint,
26020 20 74 68 65 6e 20 70 6f 73 73 69 62 6c 79 20 63   then possibly c
26030 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
26040 6e 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66  n again. */.  if
26050 28 20 62 53 68 75 74 64 6f 77 6e 3d 3d 30 20 26  ( bShutdown==0 &
26060 26 20 70 44 62 2d 3e 6e 41 75 74 6f 63 6b 70 74  & pDb->nAutockpt
26070 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 53 79 6e   ){.    u32 nSyn
26080 63 3b 0a 20 20 20 20 75 33 32 20 6e 55 6e 73 79  c;.    u32 nUnsy
26090 6e 63 3b 0a 20 20 20 20 69 6e 74 20 6e 50 67 73  nc;.    int nPgs
260a0 7a 3b 0a 0a 20 20 20 20 6c 73 6d 43 68 65 63 6b  z;..    lsmCheck
260b0 70 6f 69 6e 74 53 79 6e 63 65 64 28 70 44 62 2c  pointSynced(pDb,
260c0 20 30 2c 20 30 2c 20 26 6e 53 79 6e 63 29 3b 0a   0, 0, &nSync);.
260d0 20 20 20 20 6e 55 6e 73 79 6e 63 20 3d 20 6c 73      nUnsync = ls
260e0 6d 43 68 65 63 6b 70 6f 69 6e 74 4e 57 72 69 74  mCheckpointNWrit
260f0 65 28 70 44 62 2d 3e 70 53 68 6d 68 64 72 2d 3e  e(pDb->pShmhdr->
26100 61 53 6e 61 70 31 2c 20 30 29 3b 0a 20 20 20 20  aSnap1, 0);.    
26110 6e 50 67 73 7a 20 3d 20 6c 73 6d 43 68 65 63 6b  nPgsz = lsmCheck
26120 70 6f 69 6e 74 50 67 73 7a 28 70 44 62 2d 3e 70  pointPgsz(pDb->p
26130 53 68 6d 68 64 72 2d 3e 61 53 6e 61 70 31 29 3b  Shmhdr->aSnap1);
26140 0a 0a 20 20 20 20 6e 4d 61 78 20 3d 20 28 69 6e  ..    nMax = (in
26150 74 29 4c 53 4d 5f 4d 49 4e 28 6e 4d 61 78 2c 20  t)LSM_MIN(nMax, 
26160 28 70 44 62 2d 3e 6e 41 75 74 6f 63 6b 70 74 2f  (pDb->nAutockpt/
26170 6e 50 67 73 7a 29 20 2d 20 28 69 6e 74 29 28 6e  nPgsz) - (int)(n
26180 55 6e 73 79 6e 63 2d 6e 53 79 6e 63 29 29 3b 0a  Unsync-nSync));.
26190 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 6e 52 65      if( nMax<nRe
261a0 6d 20 29 7b 0a 20 20 20 20 20 20 62 43 6b 70 74  m ){.      bCkpt
261b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 52 65 6d   = 1;.      nRem
261c0 20 3d 20 4c 53 4d 5f 4d 41 58 28 6e 4d 61 78 2c   = LSM_MAX(nMax,
261d0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   0);.    }.  }..
261e0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 65 78    /* If there ex
261f0 69 73 74 73 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  ists in-memory d
26200 61 74 61 20 72 65 61 64 79 20 74 6f 20 62 65 20  ata ready to be 
26210 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2c  flushed to disk,
26220 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f   attempt.  ** to
26230 20 66 6c 75 73 68 20 69 74 20 6e 6f 77 2e 20 20   flush it now.  
26240 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 6e 54  */.  if( pDb->nT
26250 72 61 6e 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  ransOpen==0 ){. 
26260 20 20 20 72 63 20 3d 20 6c 73 6d 54 72 65 65 4c     rc = lsmTreeL
26270 6f 61 64 48 65 61 64 65 72 28 70 44 62 2c 20 30  oadHeader(pDb, 0
26280 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6f 72  );.  }.  if( sor
26290 74 65 64 54 72 65 65 48 61 73 4f 6c 64 28 70 44  tedTreeHasOld(pD
262a0 62 2c 20 26 72 63 29 20 29 7b 0a 20 20 20 20 2f  b, &rc) ){.    /
262b0 2a 20 73 6f 72 74 65 64 44 62 49 73 46 75 6c 6c  * sortedDbIsFull
262c0 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  () returns non-z
262d0 65 72 6f 20 69 66 20 65 69 74 68 65 72 20 28 61  ero if either (a
262e0 29 20 74 68 65 72 65 20 61 72 65 20 74 6f 6f 20  ) there are too 
262f0 6d 61 6e 79 0a 20 20 20 20 2a 2a 20 6c 65 76 65  many.    ** leve
26300 6c 73 20 69 6e 20 74 6f 74 61 6c 20 69 6e 20 74  ls in total in t
26310 68 65 20 64 62 2c 20 6f 72 20 28 62 29 20 74 68  he db, or (b) th
26320 65 72 65 20 61 72 65 20 74 6f 6f 20 6d 61 6e 79  ere are too many
26330 20 6c 65 76 65 6c 73 20 77 69 74 68 20 74 68 65   levels with the
26340 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  .    ** the same
26350 20 61 67 65 20 69 6e 20 74 68 65 20 64 62 2e 20   age in the db. 
26360 45 69 74 68 65 72 20 77 61 79 2c 20 63 61 6c 6c  Either way, call
26370 20 73 6f 72 74 65 64 57 6f 72 6b 28 29 20 74 6f   sortedWork() to
26380 20 6d 65 72 67 65 20 0a 20 20 20 20 2a 2a 20 65   merge .    ** e
26390 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 73  xisting segments
263a0 20 74 6f 67 65 74 68 65 72 20 75 6e 74 69 6c 20   together until 
263b0 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
263c0 73 20 63 6c 65 61 72 65 64 2e 20 20 2a 2f 0a 20  s cleared.  */. 
263d0 20 20 20 69 66 28 20 73 6f 72 74 65 64 44 62 49     if( sortedDbI
263e0 73 46 75 6c 6c 28 70 44 62 29 20 29 7b 0a 20 20  sFull(pDb) ){.  
263f0 20 20 20 20 69 6e 74 20 6e 50 67 20 3d 20 30 3b      int nPg = 0;
26400 0a 20 20 20 20 20 20 72 63 20 3d 20 73 6f 72 74  .      rc = sort
26410 65 64 57 6f 72 6b 28 70 44 62 2c 20 6e 52 65 6d  edWork(pDb, nRem
26420 2c 20 6e 4d 65 72 67 65 2c 20 31 2c 20 26 6e 50  , nMerge, 1, &nP
26430 67 29 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d  g);.      nRem -
26440 3d 20 6e 50 67 3b 0a 20 20 20 20 20 20 61 73 73  = nPg;.      ass
26450 65 72 74 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20  ert( rc!=LSM_OK 
26460 7c 7c 20 6e 52 65 6d 3c 3d 30 20 7c 7c 20 21 73  || nRem<=0 || !s
26470 6f 72 74 65 64 44 62 49 73 46 75 6c 6c 28 70 44  ortedDbIsFull(pD
26480 62 29 20 29 3b 0a 20 20 20 20 20 20 62 44 69 72  b) );.      bDir
26490 74 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  ty = 1;.    }.. 
264a0 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
264b0 4b 20 26 26 20 6e 52 65 6d 3e 30 20 29 7b 0a 20  K && nRem>0 ){. 
264c0 20 20 20 20 20 69 6e 74 20 6e 50 67 20 3d 20 30       int nPg = 0
264d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 6f 72  ;.      rc = sor
264e0 74 65 64 4e 65 77 54 6f 70 6c 65 76 65 6c 28 70  tedNewToplevel(p
264f0 44 62 2c 20 54 52 45 45 5f 4f 4c 44 2c 20 26 6e  Db, TREE_OLD, &n
26500 50 67 29 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20  Pg);.      nRem 
26510 2d 3d 20 6e 50 67 3b 0a 20 20 20 20 20 20 69 66  -= nPg;.      if
26520 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
26530 20 20 20 20 20 20 20 20 69 66 28 20 70 44 62 2d          if( pDb-
26540 3e 6e 54 72 61 6e 73 4f 70 65 6e 3e 30 20 29 7b  >nTransOpen>0 ){
26550 0a 20 20 20 20 20 20 20 20 20 20 6c 73 6d 54 72  .          lsmTr
26560 65 65 44 69 73 63 61 72 64 4f 6c 64 28 70 44 62  eeDiscardOld(pDb
26570 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
26580 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 53 61 76       rc = lsmSav
26590 65 57 6f 72 6b 65 72 28 70 44 62 2c 20 31 29 3b  eWorker(pDb, 1);
265a0 0a 20 20 20 20 20 20 20 20 62 44 69 72 74 79 20  .        bDirty 
265b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
265c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
265d0 6e 50 61 67 65 20 69 73 20 73 74 69 6c 6c 20 67  nPage is still g
265e0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
265f0 2c 20 64 6f 20 73 6f 6d 65 20 6d 65 72 67 69 6e  , do some mergin
26600 67 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  g. */.  if( rc==
26610 4c 53 4d 5f 4f 4b 20 26 26 20 6e 52 65 6d 3e 30  LSM_OK && nRem>0
26620 20 26 26 20 62 53 68 75 74 64 6f 77 6e 3d 3d 30   && bShutdown==0
26630 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 67 20   ){.    int nPg 
26640 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 6f  = 0;.    rc = so
26650 72 74 65 64 57 6f 72 6b 28 70 44 62 2c 20 6e 52  rtedWork(pDb, nR
26660 65 6d 2c 20 6e 4d 65 72 67 65 2c 20 30 2c 20 26  em, nMerge, 0, &
26670 6e 50 67 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d  nPg);.    nRem -
26680 3d 20 6e 50 67 3b 0a 20 20 20 20 69 66 28 20 6e  = nPg;.    if( n
26690 50 67 20 29 20 62 44 69 72 74 79 20 3d 20 31 3b  Pg ) bDirty = 1;
266a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
266b0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 72 74  e in-memory part
266c0 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
266d0 74 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  t is too large, 
266e0 77 72 69 74 65 20 61 20 6e 65 77 20 0a 20 20 2a  write a new .  *
266f0 2a 20 74 6f 70 2d 6c 65 76 65 6c 20 63 6f 6e 74  * top-level cont
26700 61 69 6e 69 6e 67 20 6a 75 73 74 20 74 68 65 20  aining just the 
26710 69 6e 2d 6d 65 6d 6f 72 79 20 66 72 65 65 2d 6c  in-memory free-l
26720 69 73 74 20 65 6e 74 72 69 65 73 20 74 6f 20 64  ist entries to d
26730 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  isk. */.  if( rc
26740 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 44 62 2d  ==LSM_OK && pDb-
26750 3e 70 57 6f 72 6b 65 72 2d 3e 66 72 65 65 6c 69  >pWorker->freeli
26760 73 74 2e 6e 45 6e 74 72 79 20 3e 20 70 44 62 2d  st.nEntry > pDb-
26770 3e 6e 4d 61 78 46 72 65 65 6c 69 73 74 20 29 7b  >nMaxFreelist ){
26780 0a 20 20 20 20 69 6e 74 20 6e 50 67 20 3d 20 30  .    int nPg = 0
26790 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
267a0 3d 4c 53 4d 5f 4f 4b 20 26 26 20 6c 73 6d 44 61  =LSM_OK && lsmDa
267b0 74 61 62 61 73 65 46 75 6c 6c 28 70 44 62 29 20  tabaseFull(pDb) 
267c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 6f  ){.      rc = so
267d0 72 74 65 64 57 6f 72 6b 28 70 44 62 2c 20 31 36  rtedWork(pDb, 16
267e0 2c 20 6e 4d 65 72 67 65 2c 20 31 2c 20 26 6e 50  , nMerge, 1, &nP
267f0 67 29 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d  g);.      nRem -
26800 3d 20 6e 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = nPg;.    }.   
26810 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
26820 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 6f  ){.      rc = so
26830 72 74 65 64 4e 65 77 46 72 65 65 6c 69 73 74 4f  rtedNewFreelistO
26840 6e 6c 79 28 70 44 62 29 3b 0a 20 20 20 20 7d 0a  nly(pDb);.    }.
26850 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 50 67 3b      nRem -= nPg;
26860 0a 20 20 20 20 69 66 28 20 6e 50 67 20 29 20 62  .    if( nPg ) b
26870 44 69 72 74 79 20 3d 20 31 3b 0a 20 20 7d 0a 0a  Dirty = 1;.  }..
26880 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b    if( rc==LSM_OK
26890 20 29 7b 0a 20 20 20 20 2a 70 6e 57 72 69 74 65   ){.    *pnWrite
268a0 20 3d 20 28 6e 4d 61 78 20 2d 20 6e 52 65 6d 29   = (nMax - nRem)
268b0 3b 0a 20 20 20 20 2a 70 62 43 6b 70 74 20 3d 20  ;.    *pbCkpt = 
268c0 28 62 43 6b 70 74 20 26 26 20 6e 52 65 6d 3c 3d  (bCkpt && nRem<=
268d0 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 4d 65 72  0);.    if( nMer
268e0 67 65 3d 3d 31 20 26 26 20 70 44 62 2d 3e 6e 41  ge==1 && pDb->nA
268f0 75 74 6f 63 6b 70 74 3e 30 20 26 26 20 2a 70 6e  utockpt>0 && *pn
26900 57 72 69 74 65 3e 30 0a 20 20 20 20 20 26 26 20  Write>0.     && 
26910 70 57 6f 72 6b 65 72 2d 3e 70 4c 65 76 65 6c 20  pWorker->pLevel 
26920 0a 20 20 20 20 20 26 26 20 70 57 6f 72 6b 65 72  .     && pWorker
26930 2d 3e 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74  ->pLevel->nRight
26940 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 57 6f  ==0 .     && pWo
26950 72 6b 65 72 2d 3e 70 4c 65 76 65 6c 2d 3e 70 4e  rker->pLevel->pN
26960 65 78 74 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ext==0 .    ){. 
26970 20 20 20 20 20 2a 70 62 43 6b 70 74 20 3d 20 31       *pbCkpt = 1
26980 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
26990 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  f( rc==LSM_OK &&
269a0 20 62 44 69 72 74 79 20 29 7b 0a 20 20 20 20 6c   bDirty ){.    l
269b0 73 6d 46 69 6e 69 73 68 57 6f 72 6b 28 70 44 62  smFinishWork(pDb
269c0 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 7d 65 6c  , 0, &rc);.  }el
269d0 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 64 75  se{.    int rcdu
269e0 6d 6d 79 20 3d 20 4c 53 4d 5f 42 55 53 59 3b 0a  mmy = LSM_BUSY;.
269f0 20 20 20 20 6c 73 6d 46 69 6e 69 73 68 57 6f 72      lsmFinishWor
26a00 6b 28 70 44 62 2c 20 30 2c 20 26 72 63 64 75 6d  k(pDb, 0, &rcdum
26a10 6d 79 29 3b 0a 20 20 20 20 2a 70 6e 57 72 69 74  my);.    *pnWrit
26a20 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
26a30 65 72 74 28 20 70 44 62 2d 3e 70 57 6f 72 6b 65  ert( pDb->pWorke
26a40 72 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r==0 );.  return
26a50 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
26a60 6e 74 20 64 6f 4c 73 6d 57 6f 72 6b 28 6c 73 6d  nt doLsmWork(lsm
26a70 5f 64 62 20 2a 70 44 62 2c 20 69 6e 74 20 6e 4d  _db *pDb, int nM
26a80 65 72 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 2c  erge, int nPage,
26a90 20 69 6e 74 20 2a 70 6e 57 72 69 74 65 29 7b 0a   int *pnWrite){.
26aa0 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f    int rc = LSM_O
26ab0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
26ac0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
26ad0 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   */.  int nWrite
26ae0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
26af0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
26b00 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
26b10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e   */..  assert( n
26b20 4d 65 72 67 65 3e 3d 31 20 29 3b 0a 0a 20 20 69  Merge>=1 );..  i
26b30 66 28 20 6e 50 61 67 65 21 3d 30 20 29 7b 0a 20  f( nPage!=0 ){. 
26b40 20 20 20 69 6e 74 20 62 43 6b 70 74 20 3d 20 30     int bCkpt = 0
26b50 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
26b60 20 69 6e 74 20 6e 54 68 69 73 20 3d 20 30 3b 0a   int nThis = 0;.
26b70 20 20 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d        int nReq =
26b80 20 28 6e 50 61 67 65 3e 3d 30 29 20 3f 20 28 6e   (nPage>=0) ? (n
26b90 50 61 67 65 2d 6e 57 72 69 74 65 29 20 3a 20 28  Page-nWrite) : (
26ba0 28 69 6e 74 29 30 78 37 46 46 46 46 46 46 46 29  (int)0x7FFFFFFF)
26bb0 3b 0a 0a 20 20 20 20 20 20 62 43 6b 70 74 20 3d  ;..      bCkpt =
26bc0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 64   0;.      rc = d
26bd0 6f 4c 73 6d 53 69 6e 67 6c 65 57 6f 72 6b 28 70  oLsmSingleWork(p
26be0 44 62 2c 20 30 2c 20 6e 4d 65 72 67 65 2c 20 6e  Db, 0, nMerge, n
26bf0 52 65 71 2c 20 26 6e 54 68 69 73 2c 20 26 62 43  Req, &nThis, &bC
26c00 6b 70 74 29 3b 0a 20 20 20 20 20 20 6e 57 72 69  kpt);.      nWri
26c10 74 65 20 2b 3d 20 6e 54 68 69 73 3b 0a 20 20 20  te += nThis;.   
26c20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
26c30 4b 20 26 26 20 62 43 6b 70 74 20 29 7b 0a 20 20  K && bCkpt ){.  
26c40 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 5f 63        rc = lsm_c
26c50 68 65 63 6b 70 6f 69 6e 74 28 70 44 62 2c 20 30  heckpoint(pDb, 0
26c60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
26c70 77 68 69 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f  while( rc==LSM_O
26c80 4b 20 26 26 20 62 43 6b 70 74 20 26 26 20 28 6e  K && bCkpt && (n
26c90 57 72 69 74 65 3c 6e 50 61 67 65 20 7c 7c 20 6e  Write<nPage || n
26ca0 50 61 67 65 3c 30 29 20 29 3b 0a 20 20 7d 0a 0a  Page<0) );.  }..
26cb0 20 20 69 66 28 20 70 6e 57 72 69 74 65 20 29 7b    if( pnWrite ){
26cc0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d  .    if( rc==LSM
26cd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e  _OK ){.      *pn
26ce0 57 72 69 74 65 20 3d 20 6e 57 72 69 74 65 3b 0a  Write = nWrite;.
26cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26d00 20 2a 70 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20   *pnWrite = 0;. 
26d10 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
26d20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
26d30 65 72 66 6f 72 6d 20 77 6f 72 6b 20 74 6f 20 6d  erform work to m
26d40 65 72 67 65 20 64 61 74 61 62 61 73 65 20 73 65  erge database se
26d50 67 6d 65 6e 74 73 20 74 6f 67 65 74 68 65 72 2e  gments together.
26d60 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 5f 77 6f 72 6b  .*/.int lsm_work
26d70 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 69 6e  (lsm_db *pDb, in
26d80 74 20 6e 4d 65 72 67 65 2c 20 69 6e 74 20 6e 4b  t nMerge, int nK
26d90 42 2c 20 69 6e 74 20 2a 70 6e 57 72 69 74 65 29  B, int *pnWrite)
26da0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dc0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
26dd0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 73  de */.  int nPgs
26de0 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
26df0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6d 69 6e          /* Nomin
26e00 61 6c 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20  al page size in 
26e10 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  bytes */.  int n
26e20 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
26e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71             /* Eq
26e40 75 69 76 61 6c 65 6e 74 20 6f 66 20 6e 4b 42 20  uivalent of nKB 
26e50 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
26e60 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20 20 20  t nWrite = 0;   
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26e80 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
26e90 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f   written */..  /
26ea0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26eb0 6d 61 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  may not be calle
26ec0 64 20 69 66 20 70 44 62 20 68 61 73 20 61 6e 20  d if pDb has an 
26ed0 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69  open read or wri
26ee0 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
26ef0 69 6f 6e 2e 20 52 65 74 75 72 6e 20 4c 53 4d 5f  ion. Return LSM_
26f00 4d 49 53 55 53 45 20 69 66 20 61 6e 20 61 70 70  MISUSE if an app
26f10 6c 69 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  lication attempt
26f20 73 20 74 68 69 73 2e 20 20 2a 2f 0a 20 20 69 66  s this.  */.  if
26f30 28 20 70 44 62 2d 3e 6e 54 72 61 6e 73 4f 70 65  ( pDb->nTransOpe
26f40 6e 20 7c 7c 20 70 44 62 2d 3e 70 43 73 72 20 29  n || pDb->pCsr )
26f50 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4d 49 53 55   return LSM_MISU
26f60 53 45 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 6e  SE_BKPT;.  if( n
26f70 4d 65 72 67 65 3c 3d 30 20 29 20 6e 4d 65 72 67  Merge<=0 ) nMerg
26f80 65 20 3d 20 70 44 62 2d 3e 6e 4d 65 72 67 65 3b  e = pDb->nMerge;
26f90 0a 0a 20 20 6c 73 6d 46 73 50 75 72 67 65 43 61  ..  lsmFsPurgeCa
26fa0 63 68 65 28 70 44 62 2d 3e 70 46 53 29 3b 0a 0a  che(pDb->pFS);..
26fb0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 66 72 6f    /* Convert fro
26fc0 6d 20 4b 42 20 74 6f 20 70 61 67 65 73 20 2a 2f  m KB to pages */
26fd0 0a 20 20 6e 50 67 73 7a 20 3d 20 6c 73 6d 46 73  .  nPgsz = lsmFs
26fe0 50 61 67 65 53 69 7a 65 28 70 44 62 2d 3e 70 46  PageSize(pDb->pF
26ff0 53 29 3b 0a 20 20 69 66 28 20 6e 4b 42 3e 3d 30  S);.  if( nKB>=0
27000 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
27010 28 28 69 36 34 29 6e 4b 42 20 2a 20 31 30 32 34  ((i64)nKB * 1024
27020 20 2b 20 6e 50 67 73 7a 20 2d 20 31 29 20 2f 20   + nPgsz - 1) / 
27030 6e 50 67 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nPgsz;.  }else{.
27040 20 20 20 20 6e 50 61 67 65 20 3d 20 2d 31 3b 0a      nPage = -1;.
27050 20 20 7d 0a 0a 20 20 72 63 20 3d 20 64 6f 4c 73    }..  rc = doLs
27060 6d 57 6f 72 6b 28 70 44 62 2c 20 6e 4d 65 72 67  mWork(pDb, nMerg
27070 65 2c 20 6e 50 61 67 65 2c 20 26 6e 57 72 69 74  e, nPage, &nWrit
27080 65 29 3b 0a 20 20 0a 20 20 69 66 28 20 70 6e 57  e);.  .  if( pnW
27090 72 69 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43  rite ){.    /* C
270a0 6f 6e 76 65 72 74 20 62 61 63 6b 20 66 72 6f 6d  onvert back from
270b0 20 70 61 67 65 73 20 74 6f 20 4b 42 20 2a 2f 0a   pages to KB */.
270c0 20 20 20 20 2a 70 6e 57 72 69 74 65 20 3d 20 28      *pnWrite = (
270d0 69 6e 74 29 28 28 28 69 36 34 29 6e 57 72 69 74  int)(((i64)nWrit
270e0 65 20 2a 20 31 30 32 34 20 2b 20 6e 50 67 73 7a  e * 1024 + nPgsz
270f0 20 2d 20 31 29 20 2f 20 6e 50 67 73 7a 29 3b 0a   - 1) / nPgsz);.
27100 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27110 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 5f 66 6c 75 73  .}..int lsm_flus
27120 68 28 6c 73 6d 5f 64 62 20 2a 64 62 29 7b 0a 20  h(lsm_db *db){. 
27130 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
27140 64 62 2d 3e 6e 54 72 61 6e 73 4f 70 65 6e 3e 30  db->nTransOpen>0
27150 20 7c 7c 20 64 62 2d 3e 70 43 73 72 20 29 7b 0a   || db->pCsr ){.
27160 20 20 20 20 72 63 20 3d 20 4c 53 4d 5f 4d 49 53      rc = LSM_MIS
27170 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  USE_BKPT;.  }els
27180 65 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 42  e{.    rc = lsmB
27190 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 28 64  eginWriteTrans(d
271a0 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  b);.    if( rc==
271b0 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  LSM_OK ){.      
271c0 6c 73 6d 46 6c 75 73 68 54 72 65 65 54 6f 44 69  lsmFlushTreeToDi
271d0 73 6b 28 64 62 29 3b 0a 20 20 20 20 20 20 6c 73  sk(db);.      ls
271e0 6d 54 72 65 65 44 69 73 63 61 72 64 4f 6c 64 28  mTreeDiscardOld(
271f0 64 62 29 3b 0a 20 20 20 20 20 20 6c 73 6d 54 72  db);.      lsmTr
27200 65 65 4d 61 6b 65 4f 6c 64 28 64 62 29 3b 0a 20  eeMakeOld(db);. 
27210 20 20 20 20 20 6c 73 6d 54 72 65 65 44 69 73 63       lsmTreeDisc
27220 61 72 64 4f 6c 64 28 64 62 29 3b 0a 20 20 20 20  ardOld(db);.    
27230 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c  }..    if( rc==L
27240 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  SM_OK ){.      r
27250 63 20 3d 20 6c 73 6d 46 69 6e 69 73 68 57 72 69  c = lsmFinishWri
27260 74 65 54 72 61 6e 73 28 64 62 2c 20 31 29 3b 0a  teTrans(db, 1);.
27270 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27280 20 6c 73 6d 46 69 6e 69 73 68 57 72 69 74 65 54   lsmFinishWriteT
27290 72 61 6e 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  rans(db, 0);.   
272a0 20 7d 0a 20 20 20 20 6c 73 6d 46 69 6e 69 73 68   }.    lsmFinish
272b0 52 65 61 64 54 72 61 6e 73 28 64 62 29 3b 0a 20  ReadTrans(db);. 
272c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
272d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
272e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
272f0 64 20 69 6e 20 61 75 74 6f 2d 77 6f 72 6b 20 6d  d in auto-work m
27300 6f 64 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 6d  ode to perform m
27310 65 72 67 69 6e 67 20 77 6f 72 6b 20 6f 6e 0a 2a  erging work on.*
27320 2a 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  * the data struc
27330 74 75 72 65 2e 20 49 74 20 70 65 72 66 6f 72 6d  ture. It perform
27340 73 20 65 6e 6f 75 67 68 20 6d 65 72 67 69 6e 67  s enough merging
27350 20 77 6f 72 6b 20 74 6f 20 70 72 65 76 65 6e 74   work to prevent
27360 20 74 68 65 0a 2a 2a 20 68 65 69 67 68 74 20 6f   the.** height o
27370 66 20 74 68 65 20 74 72 65 65 20 66 72 6f 6d 20  f the tree from 
27380 67 72 6f 77 69 6e 67 20 69 6e 64 65 66 69 6e 69  growing indefini
27390 74 65 6c 79 20 61 73 73 75 6d 69 6e 67 20 74 68  tely assuming th
273a0 61 74 20 72 6f 75 67 68 6c 79 0a 2a 2a 20 6e 55  at roughly.** nU
273b0 6e 69 74 20 64 61 74 61 62 61 73 65 20 70 61 67  nit database pag
273c0 65 73 20 77 6f 72 74 68 20 6f 66 20 64 61 74 61  es worth of data
273d0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
273e0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
273f0 73 65 0a 2a 2a 20 28 69 2e 65 2e 20 74 68 65 20  se.** (i.e. the 
27400 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65 29 20  in-memory tree) 
27410 73 69 6e 63 65 20 74 68 65 20 6c 61 73 74 20 63  since the last c
27420 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 53  all..*/.int lsmS
27430 6f 72 74 65 64 41 75 74 6f 57 6f 72 6b 28 0a 20  ortedAutoWork(. 
27440 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 20 20   lsm_db *pDb,   
27450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27460 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
27470 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 6e  dle */.  int nUn
27480 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
27490 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
274a0 73 20 6f 66 20 64 61 74 61 20 77 72 69 74 74 65  s of data writte
274b0 6e 20 74 6f 20 69 6e 2d 6d 65 6d 6f 72 79 20 74  n to in-memory t
274c0 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ree */.){.  int 
274d0 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20  rc = LSM_OK;    
274e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
274f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
27500 69 6e 74 20 6e 44 65 70 74 68 20 3d 20 30 3b 20  int nDepth = 0; 
27510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27520 2f 2a 20 43 75 72 72 65 6e 74 20 68 65 69 67 68  /* Current heigh
27530 74 20 6f 66 20 74 72 65 65 20 28 6c 6f 6e 67 65  t of tree (longe
27540 73 74 20 70 61 74 68 29 20 2a 2f 0a 20 20 4c 65  st path) */.  Le
27550 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20  vel *pLevel;    
27560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27570 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
27580 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
27590 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 74 6f 72  */.  int bRestor
275a0 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
275b0 28 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 3d 3d  ( pDb->pWorker==
275c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
275d0 44 62 2d 3e 6e 54 72 61 6e 73 4f 70 65 6e 3e 30  Db->nTransOpen>0
275e0 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d   );..  /* Determ
275f0 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 75 6e 69  ine how many uni
27600 74 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f  ts of work to do
27610 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
27620 67 2e 20 4f 6e 65 20 75 6e 69 74 20 6f 66 0a 20  g. One unit of. 
27630 20 2a 2a 20 77 6f 72 6b 20 69 73 20 61 63 68 69   ** work is achi
27640 65 76 65 64 20 62 79 20 77 72 69 74 69 6e 67 20  eved by writing 
27650 6f 6e 65 20 70 61 67 65 20 28 7e 34 4b 42 29 20  one page (~4KB) 
27660 6f 66 20 6d 65 72 67 65 64 20 64 61 74 61 2e 20  of merged data. 
27670 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 65 76 65 6c   */.  for(pLevel
27680 3d 6c 73 6d 44 62 53 6e 61 70 73 68 6f 74 4c 65  =lsmDbSnapshotLe
27690 76 65 6c 28 70 44 62 2d 3e 70 43 6c 69 65 6e 74  vel(pDb->pClient
276a0 29 3b 20 70 4c 65 76 65 6c 3b 20 70 4c 65 76 65  ); pLevel; pLeve
276b0 6c 3d 70 4c 65 76 65 6c 2d 3e 70 4e 65 78 74 29  l=pLevel->pNext)
276c0 7b 0a 20 20 20 20 2f 2a 20 6e 44 65 70 74 68 20  {.    /* nDepth 
276d0 2b 3d 20 4c 53 4d 5f 4d 41 58 28 31 2c 20 70 4c  += LSM_MAX(1, pL
276e0 65 76 65 6c 2d 3e 6e 52 69 67 68 74 29 3b 20 2a  evel->nRight); *
276f0 2f 0a 20 20 20 20 6e 44 65 70 74 68 20 2b 3d 20  /.    nDepth += 
27700 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 73 6d  1;.  }.  if( lsm
27710 54 72 65 65 48 61 73 4f 6c 64 28 70 44 62 29 20  TreeHasOld(pDb) 
27720 29 7b 0a 20 20 20 20 6e 44 65 70 74 68 20 2b 3d  ){.    nDepth +=
27730 20 31 3b 0a 20 20 20 20 62 52 65 73 74 6f 72 65   1;.    bRestore
27740 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 6c   = 1;.    rc = l
27750 73 6d 53 61 76 65 43 75 72 73 6f 72 73 28 70 44  smSaveCursors(pD
27760 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  b);.    if( rc!=
27770 4c 53 4d 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  LSM_OK ) return 
27780 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  rc;.  }..  if( n
27790 44 65 70 74 68 3e 30 20 29 7b 0a 20 20 20 20 69  Depth>0 ){.    i
277a0 6e 74 20 6e 52 65 6d 61 69 6e 69 6e 67 3b 20 20  nt nRemaining;  
277b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
277c0 55 6e 69 74 73 20 6f 66 20 77 6f 72 6b 20 74 6f  Units of work to
277d0 20 64 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72   do before retur
277e0 6e 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 52 65  ning */..    nRe
277f0 6d 61 69 6e 69 6e 67 20 3d 20 6e 55 6e 69 74 20  maining = nUnit 
27800 2a 20 6e 44 65 70 74 68 3b 0a 23 69 66 64 65 66  * nDepth;.#ifdef
27810 20 4c 53 4d 5f 4c 4f 47 5f 57 4f 52 4b 0a 20 20   LSM_LOG_WORK.  
27820 20 20 6c 73 6d 4c 6f 67 4d 65 73 73 61 67 65 28    lsmLogMessage(
27830 70 44 62 2c 20 72 63 2c 20 22 6c 73 6d 53 6f 72  pDb, rc, "lsmSor
27840 74 65 64 41 75 74 6f 57 6f 72 6b 28 29 3a 20 25  tedAutoWork(): %
27850 64 2a 25 64 20 3d 20 25 64 20 70 61 67 65 73 22  d*%d = %d pages"
27860 2c 20 0a 20 20 20 20 20 20 20 20 6e 55 6e 69 74  , .        nUnit
27870 2c 20 6e 44 65 70 74 68 2c 20 6e 52 65 6d 61 69  , nDepth, nRemai
27880 6e 69 6e 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ning);.#endif.  
27890 20 20 61 73 73 65 72 74 28 20 6e 52 65 6d 61 69    assert( nRemai
278a0 6e 69 6e 67 3e 3d 30 20 29 3b 0a 20 20 20 20 72  ning>=0 );.    r
278b0 63 20 3d 20 64 6f 4c 73 6d 57 6f 72 6b 28 70 44  c = doLsmWork(pD
278c0 62 2c 20 70 44 62 2d 3e 6e 4d 65 72 67 65 2c 20  b, pDb->nMerge, 
278d0 6e 52 65 6d 61 69 6e 69 6e 67 2c 20 30 29 3b 0a  nRemaining, 0);.
278e0 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f      if( rc==LSM_
278f0 42 55 53 59 20 29 20 72 63 20 3d 20 4c 53 4d 5f  BUSY ) rc = LSM_
27900 4f 4b 3b 0a 0a 20 20 20 20 69 66 28 20 62 52 65  OK;..    if( bRe
27910 73 74 6f 72 65 20 26 26 20 70 44 62 2d 3e 70 43  store && pDb->pC
27920 73 72 20 29 7b 0a 20 20 20 20 20 20 6c 73 6d 4d  sr ){.      lsmM
27930 43 75 72 73 6f 72 46 72 65 65 43 61 63 68 65 28  CursorFreeCache(
27940 70 44 62 29 3b 0a 20 20 20 20 20 20 6c 73 6d 46  pDb);.      lsmF
27950 72 65 65 53 6e 61 70 73 68 6f 74 28 70 44 62 2d  reeSnapshot(pDb-
27960 3e 70 45 6e 76 2c 20 70 44 62 2d 3e 70 43 6c 69  >pEnv, pDb->pCli
27970 65 6e 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ent);.      pDb-
27980 3e 70 43 6c 69 65 6e 74 20 3d 20 30 3b 0a 20 20  >pClient = 0;.  
27990 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f      if( rc==LSM_
279a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
279b0 20 3d 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74   = lsmCheckpoint
279c0 4c 6f 61 64 28 70 44 62 2c 20 30 29 3b 0a 20 20  Load(pDb, 0);.  
279d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
279e0 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
279f0 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 43 68        rc = lsmCh
27a00 65 63 6b 70 6f 69 6e 74 44 65 73 65 72 69 61 6c  eckpointDeserial
27a10 69 7a 65 28 70 44 62 2c 20 30 2c 20 70 44 62 2d  ize(pDb, 0, pDb-
27a20 3e 61 53 6e 61 70 73 68 6f 74 2c 20 26 70 44 62  >aSnapshot, &pDb
27a30 2d 3e 70 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20  ->pClient);.    
27a40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
27a50 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
27a60 20 20 20 20 72 63 20 3d 20 6c 73 6d 52 65 73 74      rc = lsmRest
27a70 6f 72 65 43 75 72 73 6f 72 73 28 70 44 62 29 3b  oreCursors(pDb);
27a80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27a90 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
27aa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
27ab0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
27ac0 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 73 79  called during sy
27ad0 73 74 65 6d 20 73 68 75 74 64 6f 77 6e 2e 20 54  stem shutdown. T
27ae0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a  he contents of.*
27af0 2a 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20  * any in-memory 
27b00 74 72 65 65 73 20 70 72 65 73 65 6e 74 20 28 6f  trees present (o
27b10 6c 64 20 6f 72 20 63 75 72 72 65 6e 74 29 20 61  ld or current) a
27b20 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  re written out t
27b30 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 6c  o disk..*/.int l
27b40 73 6d 46 6c 75 73 68 54 72 65 65 54 6f 44 69 73  smFlushTreeToDis
27b50 6b 28 6c 73 6d 5f 64 62 20 2a 70 44 62 29 7b 0a  k(lsm_db *pDb){.
27b60 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
27b70 3d 20 6c 73 6d 42 65 67 69 6e 57 6f 72 6b 28 70  = lsmBeginWork(p
27b80 44 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  Db);.  while( rc
27b90 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 73 6f 72 74  ==LSM_OK && sort
27ba0 65 64 44 62 49 73 46 75 6c 6c 28 70 44 62 29 20  edDbIsFull(pDb) 
27bb0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 6f 72 74  ){.    rc = sort
27bc0 65 64 57 6f 72 6b 28 70 44 62 2c 20 32 35 36 2c  edWork(pDb, 256,
27bd0 20 70 44 62 2d 3e 6e 4d 65 72 67 65 2c 20 31 2c   pDb->nMerge, 1,
27be0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   0);.  }..  if( 
27bf0 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
27c00 20 20 72 63 20 3d 20 73 6f 72 74 65 64 4e 65 77    rc = sortedNew
27c10 54 6f 70 6c 65 76 65 6c 28 70 44 62 2c 20 54 52  Toplevel(pDb, TR
27c20 45 45 5f 42 4f 54 48 2c 20 30 29 3b 0a 20 20 7d  EE_BOTH, 0);.  }
27c30 0a 0a 20 20 6c 73 6d 46 69 6e 69 73 68 57 6f 72  ..  lsmFinishWor
27c40 6b 28 70 44 62 2c 20 31 2c 20 26 72 63 29 3b 0a  k(pDb, 1, &rc);.
27c50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27c60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
27c70 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
27c80 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 67 6d  tion of the segm
27c90 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
27ca0 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
27cb0 0a 2a 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68  .** Space for th
27cc0 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
27cd0 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 75  g is allocated u
27ce0 73 69 6e 67 20 6c 73 6d 4d 61 6c 6c 6f 63 28 29  sing lsmMalloc()
27cf0 2c 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20  , and should.** 
27d00 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
27d10 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 6c 73 6d  caller using lsm
27d20 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Free()..*/.stati
27d30 63 20 63 68 61 72 20 2a 73 65 67 54 6f 53 74 72  c char *segToStr
27d40 69 6e 67 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e  ing(lsm_env *pEn
27d50 76 2c 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  v, Segment *pSeg
27d60 2c 20 69 6e 74 20 6e 4d 69 6e 29 7b 0a 20 20 69  , int nMin){.  i
27d70 6e 74 20 6e 53 69 7a 65 20 3d 20 70 53 65 67 2d  nt nSize = pSeg-
27d80 3e 6e 53 69 7a 65 3b 0a 20 20 50 67 6e 6f 20 69  >nSize;.  Pgno i
27d90 52 6f 6f 74 20 3d 20 70 53 65 67 2d 3e 69 52 6f  Root = pSeg->iRo
27da0 6f 74 3b 0a 20 20 50 67 6e 6f 20 69 46 69 72 73  ot;.  Pgno iFirs
27db0 74 20 3d 20 70 53 65 67 2d 3e 69 46 69 72 73 74  t = pSeg->iFirst
27dc0 3b 0a 20 20 50 67 6e 6f 20 69 4c 61 73 74 20 3d  ;.  Pgno iLast =
27dd0 20 70 53 65 67 2d 3e 69 4c 61 73 74 50 67 3b 0a   pSeg->iLastPg;.
27de0 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 63 68    char *z;..  ch
27df0 61 72 20 2a 7a 31 3b 0a 20 20 63 68 61 72 20 2a  ar *z1;.  char *
27e00 7a 32 3b 0a 20 20 69 6e 74 20 6e 50 61 64 3b 0a  z2;.  int nPad;.
27e10 0a 20 20 7a 31 20 3d 20 6c 73 6d 4d 61 6c 6c 6f  .  z1 = lsmMallo
27e20 63 50 72 69 6e 74 66 28 70 45 6e 76 2c 20 22 25  cPrintf(pEnv, "%
27e30 64 2e 25 64 22 2c 20 69 46 69 72 73 74 2c 20 69  d.%d", iFirst, i
27e40 4c 61 73 74 29 3b 0a 20 20 69 66 28 20 69 52 6f  Last);.  if( iRo
27e50 6f 74 20 29 7b 0a 20 20 20 20 7a 32 20 3d 20 6c  ot ){.    z2 = l
27e60 73 6d 4d 61 6c 6c 6f 63 50 72 69 6e 74 66 28 70  smMallocPrintf(p
27e70 45 6e 76 2c 20 22 72 6f 6f 74 3d 25 64 22 2c 20  Env, "root=%d", 
27e80 69 52 6f 6f 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  iRoot);.  }else{
27e90 0a 20 20 20 20 7a 32 20 3d 20 6c 73 6d 4d 61 6c  .    z2 = lsmMal
27ea0 6c 6f 63 50 72 69 6e 74 66 28 70 45 6e 76 2c 20  locPrintf(pEnv, 
27eb0 22 73 69 7a 65 3d 25 64 22 2c 20 6e 53 69 7a 65  "size=%d", nSize
27ec0 29 3b 0a 20 20 7d 0a 0a 20 20 6e 50 61 64 20 3d  );.  }..  nPad =
27ed0 20 6e 4d 69 6e 20 2d 20 32 20 2d 20 73 74 72 6c   nMin - 2 - strl
27ee0 65 6e 28 7a 31 29 20 2d 20 31 20 2d 20 73 74 72  en(z1) - 1 - str
27ef0 6c 65 6e 28 7a 32 29 3b 0a 20 20 6e 50 61 64 20  len(z2);.  nPad 
27f00 3d 20 4c 53 4d 5f 4d 41 58 28 30 2c 20 6e 50 61  = LSM_MAX(0, nPa
27f10 64 29 3b 0a 0a 20 20 69 66 28 20 69 52 6f 6f 74  d);..  if( iRoot
27f20 20 29 7b 0a 20 20 20 20 7a 20 3d 20 6c 73 6d 4d   ){.    z = lsmM
27f30 61 6c 6c 6f 63 50 72 69 6e 74 66 28 70 45 6e 76  allocPrintf(pEnv
27f40 2c 20 22 2f 25 73 20 25 2a 73 25 73 5c 5c 22 2c  , "/%s %*s%s\\",
27f50 20 7a 31 2c 20 6e 50 61 64 2c 20 22 22 2c 20 7a   z1, nPad, "", z
27f60 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  2);.  }else{.   
27f70 20 7a 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 50 72   z = lsmMallocPr
27f80 69 6e 74 66 28 70 45 6e 76 2c 20 22 7c 25 73 20  intf(pEnv, "|%s 
27f90 25 2a 73 25 73 7c 22 2c 20 7a 31 2c 20 6e 50 61  %*s%s|", z1, nPa
27fa0 64 2c 20 22 22 2c 20 7a 32 29 3b 0a 20 20 7d 0a  d, "", z2);.  }.
27fb0 20 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c 20    lsmFree(pEnv, 
27fc0 7a 31 29 3b 0a 20 20 6c 73 6d 46 72 65 65 28 70  z1);.  lsmFree(p
27fd0 45 6e 76 2c 20 7a 32 29 3b 0a 0a 20 20 72 65 74  Env, z2);..  ret
27fe0 75 72 6e 20 7a 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn z;.}..static
27ff0 20 69 6e 74 20 66 69 6c 65 54 6f 53 74 72 69 6e   int fileToStrin
28000 67 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62  g(.  lsm_db *pDb
28010 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28020 20 20 20 20 20 2f 2a 20 46 6f 72 20 78 4d 61 6c       /* For xMal
28030 6c 6f 63 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  loc() */.  char 
28040 2a 61 42 75 66 2c 20 0a 20 20 69 6e 74 20 6e 42  *aBuf, .  int nB
28050 75 66 2c 20 0a 20 20 69 6e 74 20 6e 4d 69 6e 2c  uf, .  int nMin,
28060 0a 20 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  .  Segment *pSeg
28070 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  .){.  int i = 0;
28080 0a 20 20 69 66 28 20 70 53 65 67 20 29 7b 0a 20  .  if( pSeg ){. 
28090 20 20 20 63 68 61 72 20 2a 7a 53 65 67 3b 0a 0a     char *zSeg;..
280a0 20 20 20 20 7a 53 65 67 20 3d 20 73 65 67 54 6f      zSeg = segTo
280b0 53 74 72 69 6e 67 28 70 44 62 2d 3e 70 45 6e 76  String(pDb->pEnv
280c0 2c 20 70 53 65 67 2c 20 6e 4d 69 6e 29 3b 0a 20  , pSeg, nMin);. 
280d0 20 20 20 73 6e 70 72 69 6e 74 66 28 26 61 42 75     snprintf(&aBu
280e0 66 5b 69 5d 2c 20 6e 42 75 66 2d 69 2c 20 22 25  f[i], nBuf-i, "%
280f0 73 22 2c 20 7a 53 65 67 29 3b 0a 20 20 20 20 69  s", zSeg);.    i
28100 20 2b 3d 20 73 74 72 6c 65 6e 28 26 61 42 75 66   += strlen(&aBuf
28110 5b 69 5d 29 3b 0a 20 20 20 20 6c 73 6d 46 72 65  [i]);.    lsmFre
28120 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20 7a 53 65  e(pDb->pEnv, zSe
28130 67 29 3b 0a 0a 23 69 66 64 65 66 20 4c 53 4d 5f  g);..#ifdef LSM_
28140 4c 4f 47 5f 46 52 45 45 4c 49 53 54 0a 20 20 20  LOG_FREELIST.   
28150 20 6c 73 6d 49 6e 66 6f 41 72 72 61 79 53 74 72   lsmInfoArrayStr
28160 75 63 74 75 72 65 28 70 44 62 2c 20 31 2c 20 70  ucture(pDb, 1, p
28170 53 65 67 2d 3e 69 46 69 72 73 74 2c 20 26 7a 53  Seg->iFirst, &zS
28180 65 67 29 3b 0a 20 20 20 20 73 6e 70 72 69 6e 74  eg);.    snprint
28190 66 28 26 61 42 75 66 5b 69 5d 2c 20 6e 42 75 66  f(&aBuf[i], nBuf
281a0 2d 31 2c 20 22 20 20 20 20 28 25 73 29 22 2c 20  -1, "    (%s)", 
281b0 7a 53 65 67 29 3b 0a 20 20 20 20 69 20 2b 3d 20  zSeg);.    i += 
281c0 73 74 72 6c 65 6e 28 26 61 42 75 66 5b 69 5d 29  strlen(&aBuf[i])
281d0 3b 0a 20 20 20 20 6c 73 6d 46 72 65 65 28 70 44  ;.    lsmFree(pD
281e0 62 2d 3e 70 45 6e 76 2c 20 7a 53 65 67 29 3b 0a  b->pEnv, zSeg);.
281f0 23 65 6e 64 69 66 0a 20 20 20 20 61 42 75 66 5b  #endif.    aBuf[
28200 6e 42 75 66 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c  nBuf] = 0;.  }el
28210 73 65 7b 0a 20 20 20 20 61 42 75 66 5b 30 5d 20  se{.    aBuf[0] 
28220 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 72  = '\0';.  }..  r
28230 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 76 6f 69 64  eturn i;.}..void
28240 20 73 6f 72 74 65 64 44 75 6d 70 50 61 67 65 28   sortedDumpPage(
28250 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 53 65 67  lsm_db *pDb, Seg
28260 6d 65 6e 74 20 2a 70 52 75 6e 2c 20 50 61 67 65  ment *pRun, Page
28270 20 2a 70 50 67 2c 20 69 6e 74 20 62 56 61 6c 73   *pPg, int bVals
28280 29 7b 0a 20 20 42 6c 6f 62 20 62 6c 6f 62 20 3d  ){.  Blob blob =
28290 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 20 20 20 20   {0, 0, 0};     
282a0 20 20 20 20 2f 2a 20 42 6c 6f 62 20 75 73 65 64      /* Blob used
282b0 20 66 6f 72 20 6b 65 79 73 20 2a 2f 0a 20 20 4c   for keys */.  L
282c0 73 6d 53 74 72 69 6e 67 20 73 3b 0a 20 20 69 6e  smString s;.  in
282d0 74 20 69 3b 0a 0a 20 20 69 6e 74 20 6e 52 65 63  t i;..  int nRec
282e0 3b 0a 20 20 69 6e 74 20 69 50 74 72 3b 0a 20 20  ;.  int iPtr;.  
282f0 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 75 38 20  int flags;.  u8 
28300 2a 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 44  *aData;.  int nD
28310 61 74 61 3b 0a 0a 20 20 61 44 61 74 61 20 3d 20  ata;..  aData = 
28320 66 73 50 61 67 65 44 61 74 61 28 70 50 67 2c 20  fsPageData(pPg, 
28330 26 6e 44 61 74 61 29 3b 0a 0a 20 20 6e 52 65 63  &nData);..  nRec
28340 20 3d 20 70 61 67 65 47 65 74 4e 52 65 63 28 61   = pageGetNRec(a
28350 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
28360 69 50 74 72 20 3d 20 28 69 6e 74 29 70 61 67 65  iPtr = (int)page
28370 47 65 74 50 74 72 28 61 44 61 74 61 2c 20 6e 44  GetPtr(aData, nD
28380 61 74 61 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20  ata);.  flags = 
28390 70 61 67 65 47 65 74 46 6c 61 67 73 28 61 44 61  pageGetFlags(aDa
283a0 74 61 2c 20 6e 44 61 74 61 29 3b 0a 0a 20 20 6c  ta, nData);..  l
283b0 73 6d 53 74 72 69 6e 67 49 6e 69 74 28 26 73 2c  smStringInit(&s,
283c0 20 70 44 62 2d 3e 70 45 6e 76 29 3b 0a 20 20 6c   pDb->pEnv);.  l
283d0 73 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66 28  smStringAppendf(
283e0 26 73 2c 22 6e 43 65 6c 6c 3d 25 64 20 69 50 74  &s,"nCell=%d iPt
283f0 72 3d 25 64 20 66 6c 61 67 73 3d 25 64 20 7b 22  r=%d flags=%d {"
28400 2c 20 6e 52 65 63 2c 20 69 50 74 72 2c 20 66 6c  , nRec, iPtr, fl
28410 61 67 73 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  ags);.  if( flag
28420 73 26 53 45 47 4d 45 4e 54 5f 42 54 52 45 45 5f  s&SEGMENT_BTREE_
28430 46 4c 41 47 20 29 20 69 50 74 72 20 3d 20 30 3b  FLAG ) iPtr = 0;
28440 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
28450 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  Rec; i++){.    P
28460 61 67 65 20 2a 70 52 65 66 20 3d 20 30 3b 20 20  age *pRef = 0;  
28470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28480 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
28490 69 52 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20  iRef */.    int 
284a0 69 43 68 61 72 3b 0a 20 20 20 20 75 38 20 2a 61  iChar;.    u8 *a
284b0 4b 65 79 3b 20 69 6e 74 20 6e 4b 65 79 20 3d 20  Key; int nKey = 
284c0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20  0;       /* Key 
284d0 2a 2f 0a 20 20 20 20 75 38 20 2a 61 56 61 6c 20  */.    u8 *aVal 
284e0 3d 20 30 3b 20 69 6e 74 20 6e 56 61 6c 20 3d 20  = 0; int nVal = 
284f0 30 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 2a 2f  0;   /* Value */
28500 0a 20 20 20 20 69 6e 74 20 69 54 6f 70 69 63 3b  .    int iTopic;
28510 0a 20 20 20 20 75 38 20 2a 61 43 65 6c 6c 3b 0a  .    u8 *aCell;.
28520 20 20 20 20 69 6e 74 20 69 50 67 50 74 72 3b 0a      int iPgPtr;.
28530 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a      int eType;..
28540 20 20 20 20 61 43 65 6c 6c 20 3d 20 70 61 67 65      aCell = page
28550 47 65 74 43 65 6c 6c 28 61 44 61 74 61 2c 20 6e  GetCell(aData, n
28560 44 61 74 61 2c 20 69 29 3b 0a 20 20 20 20 65 54  Data, i);.    eT
28570 79 70 65 20 3d 20 2a 61 43 65 6c 6c 2b 2b 3b 0a  ype = *aCell++;.
28580 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c 61      assert( (fla
28590 67 73 20 26 20 53 45 47 4d 45 4e 54 5f 42 54 52  gs & SEGMENT_BTR
285a0 45 45 5f 46 4c 41 47 29 20 7c 7c 20 65 54 79 70  EE_FLAG) || eTyp
285b0 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 43 65 6c  e!=0 );.    aCel
285c0 6c 20 2b 3d 20 6c 73 6d 56 61 72 69 6e 74 47 65  l += lsmVarintGe
285d0 74 33 32 28 61 43 65 6c 6c 2c 20 26 69 50 67 50  t32(aCell, &iPgP
285e0 74 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 54  tr);..    if( eT
285f0 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
28600 50 67 6e 6f 20 69 52 65 66 3b 20 20 20 20 20 20  Pgno iRef;      
28610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
28620 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  age number of re
28630 66 65 72 65 6e 63 65 64 20 70 61 67 65 20 2a 2f  ferenced page */
28640 0a 20 20 20 20 20 20 61 43 65 6c 6c 20 2b 3d 20  .      aCell += 
28650 6c 73 6d 56 61 72 69 6e 74 47 65 74 36 34 28 61  lsmVarintGet64(a
28660 43 65 6c 6c 2c 20 26 69 52 65 66 29 3b 0a 20 20  Cell, &iRef);.  
28670 20 20 20 20 6c 73 6d 46 73 44 62 50 61 67 65 47      lsmFsDbPageG
28680 65 74 28 70 44 62 2d 3e 70 46 53 2c 20 70 52 75  et(pDb->pFS, pRu
28690 6e 2c 20 69 52 65 66 2c 20 26 70 52 65 66 29 3b  n, iRef, &pRef);
286a0 0a 20 20 20 20 20 20 61 4b 65 79 20 3d 20 70 61  .      aKey = pa
286b0 67 65 47 65 74 4b 65 79 28 70 52 75 6e 2c 20 70  geGetKey(pRun, p
286c0 52 65 66 2c 20 30 2c 20 26 69 54 6f 70 69 63 2c  Ref, 0, &iTopic,
286d0 20 26 6e 4b 65 79 2c 20 26 62 6c 6f 62 29 3b 0a   &nKey, &blob);.
286e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
286f0 20 61 43 65 6c 6c 20 2b 3d 20 6c 73 6d 56 61 72   aCell += lsmVar
28700 69 6e 74 47 65 74 33 32 28 61 43 65 6c 6c 2c 20  intGet32(aCell, 
28710 26 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66  &nKey);.      if
28720 28 20 72 74 49 73 57 72 69 74 65 28 65 54 79 70  ( rtIsWrite(eTyp
28730 65 29 20 29 20 61 43 65 6c 6c 20 2b 3d 20 6c 73  e) ) aCell += ls
28740 6d 56 61 72 69 6e 74 47 65 74 33 32 28 61 43 65  mVarintGet32(aCe
28750 6c 6c 2c 20 26 6e 56 61 6c 29 3b 0a 20 20 20 20  ll, &nVal);.    
28760 20 20 73 6f 72 74 65 64 52 65 61 64 44 61 74 61    sortedReadData
28770 28 30 2c 20 70 50 67 2c 20 28 61 43 65 6c 6c 2d  (0, pPg, (aCell-
28780 61 44 61 74 61 29 2c 20 6e 4b 65 79 2b 6e 56 61  aData), nKey+nVa
28790 6c 2c 20 28 76 6f 69 64 20 2a 2a 29 26 61 4b 65  l, (void **)&aKe
287a0 79 2c 20 26 62 6c 6f 62 29 3b 0a 20 20 20 20 20  y, &blob);.     
287b0 20 61 56 61 6c 20 3d 20 26 61 4b 65 79 5b 6e 4b   aVal = &aKey[nK
287c0 65 79 5d 3b 0a 20 20 20 20 20 20 69 54 6f 70 69  ey];.      iTopi
287d0 63 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 7d  c = eType;.    }
287e0 0a 0a 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41  ..    lsmStringA
287f0 70 70 65 6e 64 66 28 26 73 2c 20 22 25 73 25 32  ppendf(&s, "%s%2
28800 58 3a 22 2c 20 28 69 3d 3d 30 3f 22 22 3a 22 20  X:", (i==0?"":" 
28810 22 29 2c 20 69 54 6f 70 69 63 29 3b 0a 20 20 20  "), iTopic);.   
28820 20 66 6f 72 28 69 43 68 61 72 3d 30 3b 20 69 43   for(iChar=0; iC
28830 68 61 72 3c 6e 4b 65 79 3b 20 69 43 68 61 72 2b  har<nKey; iChar+
28840 2b 29 7b 0a 20 20 20 20 20 20 6c 73 6d 53 74 72  +){.      lsmStr
28850 69 6e 67 41 70 70 65 6e 64 66 28 26 73 2c 20 22  ingAppendf(&s, "
28860 25 63 22 2c 20 69 73 61 6c 6e 75 6d 28 61 4b 65  %c", isalnum(aKe
28870 79 5b 69 43 68 61 72 5d 29 20 3f 20 61 4b 65 79  y[iChar]) ? aKey
28880 5b 69 43 68 61 72 5d 20 3a 20 27 2e 27 29 3b 0a  [iChar] : '.');.
28890 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 56      }.    if( nV
288a0 61 6c 3e 30 20 26 26 20 62 56 61 6c 73 20 29 7b  al>0 && bVals ){
288b0 0a 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67  .      lsmString
288c0 41 70 70 65 6e 64 66 28 26 73 2c 20 22 23 23 22  Appendf(&s, "##"
288d0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 43 68  );.      for(iCh
288e0 61 72 3d 30 3b 20 69 43 68 61 72 3c 6e 56 61 6c  ar=0; iChar<nVal
288f0 3b 20 69 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20  ; iChar++){.    
28900 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70      lsmStringApp
28910 65 6e 64 66 28 26 73 2c 20 22 25 63 22 2c 20 69  endf(&s, "%c", i
28920 73 61 6c 6e 75 6d 28 61 56 61 6c 5b 69 43 68 61  salnum(aVal[iCha
28930 72 5d 29 20 3f 20 61 56 61 6c 5b 69 43 68 61 72  r]) ? aVal[iChar
28940 5d 20 3a 20 27 2e 27 29 3b 0a 20 20 20 20 20 20  ] : '.');.      
28950 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c 73 6d  }.    }..    lsm
28960 53 74 72 69 6e 67 41 70 70 65 6e 64 66 28 26 73  StringAppendf(&s
28970 2c 20 22 20 25 64 22 2c 20 69 50 67 50 74 72 2b  , " %d", iPgPtr+
28980 69 50 74 72 29 3b 0a 20 20 20 20 6c 73 6d 46 73  iPtr);.    lsmFs
28990 50 61 67 65 52 65 6c 65 61 73 65 28 70 52 65 66  PageRelease(pRef
289a0 29 3b 0a 20 20 7d 0a 20 20 6c 73 6d 53 74 72 69  );.  }.  lsmStri
289b0 6e 67 41 70 70 65 6e 64 28 26 73 2c 20 22 7d 22  ngAppend(&s, "}"
289c0 2c 20 31 29 3b 0a 0a 20 20 6c 73 6d 4c 6f 67 4d  , 1);..  lsmLogM
289d0 65 73 73 61 67 65 28 70 44 62 2c 20 4c 53 4d 5f  essage(pDb, LSM_
289e0 4f 4b 2c 20 22 20 20 20 20 20 20 50 61 67 65 20  OK, "      Page 
289f0 25 64 3a 20 25 73 22 2c 20 6c 73 6d 46 73 50 61  %d: %s", lsmFsPa
28a00 67 65 4e 75 6d 62 65 72 28 70 50 67 29 2c 20 73  geNumber(pPg), s
28a10 2e 7a 29 3b 0a 20 20 6c 73 6d 53 74 72 69 6e 67  .z);.  lsmString
28a20 43 6c 65 61 72 28 26 73 29 3b 0a 0a 20 20 73 6f  Clear(&s);..  so
28a30 72 74 65 64 42 6c 6f 62 46 72 65 65 28 26 62 6c  rtedBlobFree(&bl
28a40 6f 62 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ob);.}..static v
28a50 6f 69 64 20 69 6e 66 6f 43 65 6c 6c 44 75 6d 70  oid infoCellDump
28a60 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c  (.  lsm_db *pDb,
28a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a80 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
28a90 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d  handle */.  Segm
28aa0 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 20  ent *pSeg,      
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
28ac0 65 67 6d 65 6e 74 20 70 61 67 65 20 62 65 6c 6f  egment page belo
28ad0 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ngs to */.  int 
28ae0 62 49 6e 64 69 72 65 63 74 2c 20 20 20 20 20 20  bIndirect,      
28af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28b00 72 75 65 20 74 6f 20 66 6f 6c 6c 6f 77 20 69 6e  rue to follow in
28b10 64 69 72 65 63 74 20 72 65 66 73 20 2a 2f 0a 20  direct refs */. 
28b20 20 50 61 67 65 20 2a 70 50 67 2c 0a 20 20 69 6e   Page *pPg,.  in
28b30 74 20 69 43 65 6c 6c 2c 0a 20 20 69 6e 74 20 2a  t iCell,.  int *
28b40 70 65 54 79 70 65 2c 0a 20 20 69 6e 74 20 2a 70  peType,.  int *p
28b50 69 50 67 50 74 72 2c 0a 20 20 75 38 20 2a 2a 70  iPgPtr,.  u8 **p
28b60 61 4b 65 79 2c 20 69 6e 74 20 2a 70 6e 4b 65 79  aKey, int *pnKey
28b70 2c 0a 20 20 75 38 20 2a 2a 70 61 56 61 6c 2c 20  ,.  u8 **paVal, 
28b80 69 6e 74 20 2a 70 6e 56 61 6c 2c 0a 20 20 42 6c  int *pnVal,.  Bl
28b90 6f 62 20 2a 70 42 6c 6f 62 0a 29 7b 0a 20 20 75  ob *pBlob.){.  u
28ba0 38 20 2a 61 44 61 74 61 3b 20 69 6e 74 20 6e 44  8 *aData; int nD
28bb0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ata;           /
28bc0 2a 20 50 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  * Page data */. 
28bd0 20 75 38 20 2a 61 4b 65 79 3b 20 69 6e 74 20 6e   u8 *aKey; int n
28be0 4b 65 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Key = 0;        
28bf0 20 2f 2a 20 4b 65 79 20 2a 2f 0a 20 20 75 38 20   /* Key */.  u8 
28c00 2a 61 56 61 6c 20 3d 20 30 3b 20 69 6e 74 20 6e  *aVal = 0; int n
28c10 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Val = 0;     /* 
28c20 56 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65  Value */.  int e
28c30 54 79 70 65 3b 0a 20 20 69 6e 74 20 69 50 67 50  Type;.  int iPgP
28c40 74 72 3b 0a 20 20 50 61 67 65 20 2a 70 52 65 66  tr;.  Page *pRef
28c50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
28c60 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
28c70 20 74 6f 20 70 61 67 65 20 69 52 65 66 20 2a 2f   to page iRef */
28c80 0a 20 20 75 38 20 2a 61 43 65 6c 6c 3b 0a 0a 20  .  u8 *aCell;.. 
28c90 20 61 44 61 74 61 20 3d 20 66 73 50 61 67 65 44   aData = fsPageD
28ca0 61 74 61 28 70 50 67 2c 20 26 6e 44 61 74 61 29  ata(pPg, &nData)
28cb0 3b 0a 0a 20 20 61 43 65 6c 6c 20 3d 20 70 61 67  ;..  aCell = pag
28cc0 65 47 65 74 43 65 6c 6c 28 61 44 61 74 61 2c 20  eGetCell(aData, 
28cd0 6e 44 61 74 61 2c 20 69 43 65 6c 6c 29 3b 0a 20  nData, iCell);. 
28ce0 20 65 54 79 70 65 20 3d 20 2a 61 43 65 6c 6c 2b   eType = *aCell+
28cf0 2b 3b 0a 20 20 61 43 65 6c 6c 20 2b 3d 20 6c 73  +;.  aCell += ls
28d00 6d 56 61 72 69 6e 74 47 65 74 33 32 28 61 43 65  mVarintGet32(aCe
28d10 6c 6c 2c 20 26 69 50 67 50 74 72 29 3b 0a 0a 20  ll, &iPgPtr);.. 
28d20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b   if( eType==0 ){
28d30 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a  .    int dummy;.
28d40 20 20 20 20 50 67 6e 6f 20 69 52 65 66 3b 20 20      Pgno iRef;  
28d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d60 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
28d70 66 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  f referenced pag
28d80 65 20 2a 2f 0a 20 20 20 20 61 43 65 6c 6c 20 2b  e */.    aCell +
28d90 3d 20 6c 73 6d 56 61 72 69 6e 74 47 65 74 36 34  = lsmVarintGet64
28da0 28 61 43 65 6c 6c 2c 20 26 69 52 65 66 29 3b 0a  (aCell, &iRef);.
28db0 20 20 20 20 69 66 28 20 62 49 6e 64 69 72 65 63      if( bIndirec
28dc0 74 20 29 7b 0a 20 20 20 20 20 20 6c 73 6d 46 73  t ){.      lsmFs
28dd0 44 62 50 61 67 65 47 65 74 28 70 44 62 2d 3e 70  DbPageGet(pDb->p
28de0 46 53 2c 20 70 53 65 67 2c 20 69 52 65 66 2c 20  FS, pSeg, iRef, 
28df0 26 70 52 65 66 29 3b 0a 20 20 20 20 20 20 70 61  &pRef);.      pa
28e00 67 65 47 65 74 4b 65 79 43 6f 70 79 28 70 44 62  geGetKeyCopy(pDb
28e10 2d 3e 70 45 6e 76 2c 20 70 53 65 67 2c 20 70 52  ->pEnv, pSeg, pR
28e20 65 66 2c 20 30 2c 20 26 64 75 6d 6d 79 2c 20 70  ef, 0, &dummy, p
28e30 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 61 4b 65  Blob);.      aKe
28e40 79 20 3d 20 28 75 38 20 2a 29 70 42 6c 6f 62 2d  y = (u8 *)pBlob-
28e50 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 6e 4b  >pData;.      nK
28e60 65 79 20 3d 20 70 42 6c 6f 62 2d 3e 6e 44 61 74  ey = pBlob->nDat
28e70 61 3b 0a 20 20 20 20 20 20 6c 73 6d 46 73 50 61  a;.      lsmFsPa
28e80 67 65 52 65 6c 65 61 73 65 28 70 52 65 66 29 3b  geRelease(pRef);
28e90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28ea0 20 20 61 4b 65 79 20 3d 20 28 75 38 20 2a 29 22    aKey = (u8 *)"
28eb0 3c 69 6e 64 69 72 65 63 74 3e 22 3b 0a 20 20 20  <indirect>";.   
28ec0 20 20 20 6e 4b 65 79 20 3d 20 31 31 3b 0a 20 20     nKey = 11;.  
28ed0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
28ee0 20 61 43 65 6c 6c 20 2b 3d 20 6c 73 6d 56 61 72   aCell += lsmVar
28ef0 69 6e 74 47 65 74 33 32 28 61 43 65 6c 6c 2c 20  intGet32(aCell, 
28f00 26 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  &nKey);.    if( 
28f10 72 74 49 73 57 72 69 74 65 28 65 54 79 70 65 29  rtIsWrite(eType)
28f20 20 29 20 61 43 65 6c 6c 20 2b 3d 20 6c 73 6d 56   ) aCell += lsmV
28f30 61 72 69 6e 74 47 65 74 33 32 28 61 43 65 6c 6c  arintGet32(aCell
28f40 2c 20 26 6e 56 61 6c 29 3b 0a 20 20 20 20 73 6f  , &nVal);.    so
28f50 72 74 65 64 52 65 61 64 44 61 74 61 28 70 53 65  rtedReadData(pSe
28f60 67 2c 20 70 50 67 2c 20 28 61 43 65 6c 6c 2d 61  g, pPg, (aCell-a
28f70 44 61 74 61 29 2c 20 6e 4b 65 79 2b 6e 56 61 6c  Data), nKey+nVal
28f80 2c 20 28 76 6f 69 64 20 2a 2a 29 26 61 4b 65 79  , (void **)&aKey
28f90 2c 20 70 42 6c 6f 62 29 3b 0a 20 20 20 20 61 56  , pBlob);.    aV
28fa0 61 6c 20 3d 20 26 61 4b 65 79 5b 6e 4b 65 79 5d  al = &aKey[nKey]
28fb0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 65 54  ;.  }..  if( peT
28fc0 79 70 65 20 29 20 2a 70 65 54 79 70 65 20 3d 20  ype ) *peType = 
28fd0 65 54 79 70 65 3b 0a 20 20 69 66 28 20 70 69 50  eType;.  if( piP
28fe0 67 50 74 72 20 29 20 2a 70 69 50 67 50 74 72 20  gPtr ) *piPgPtr 
28ff0 3d 20 69 50 67 50 74 72 3b 0a 20 20 69 66 28 20  = iPgPtr;.  if( 
29000 70 61 4b 65 79 20 29 20 2a 70 61 4b 65 79 20 3d  paKey ) *paKey =
29010 20 61 4b 65 79 3b 0a 20 20 69 66 28 20 70 61 56   aKey;.  if( paV
29020 61 6c 20 29 20 2a 70 61 56 61 6c 20 3d 20 61 56  al ) *paVal = aV
29030 61 6c 3b 0a 20 20 69 66 28 20 70 6e 4b 65 79 20  al;.  if( pnKey 
29040 29 20 2a 70 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b  ) *pnKey = nKey;
29050 0a 20 20 69 66 28 20 70 6e 56 61 6c 20 29 20 2a  .  if( pnVal ) *
29060 70 6e 56 61 6c 20 3d 20 6e 56 61 6c 3b 0a 7d 0a  pnVal = nVal;.}.
29070 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 66 6f  .static int info
29080 41 70 70 65 6e 64 42 6c 6f 62 28 4c 73 6d 53 74  AppendBlob(LsmSt
29090 72 69 6e 67 20 2a 70 53 74 72 2c 20 69 6e 74 20  ring *pStr, int 
290a0 62 48 65 78 2c 20 75 38 20 2a 7a 2c 20 69 6e 74  bHex, u8 *z, int
290b0 20 6e 29 7b 0a 20 20 69 6e 74 20 69 43 68 61 72   n){.  int iChar
290c0 3b 0a 20 20 66 6f 72 28 69 43 68 61 72 3d 30 3b  ;.  for(iChar=0;
290d0 20 69 43 68 61 72 3c 6e 3b 20 69 43 68 61 72 2b   iChar<n; iChar+
290e0 2b 29 7b 0a 20 20 20 20 69 66 28 20 62 48 65 78  +){.    if( bHex
290f0 20 29 7b 0a 20 20 20 20 20 20 6c 73 6d 53 74 72   ){.      lsmStr
29100 69 6e 67 41 70 70 65 6e 64 66 28 70 53 74 72 2c  ingAppendf(pStr,
29110 20 22 25 30 32 58 22 2c 20 7a 5b 69 43 68 61 72   "%02X", z[iChar
29120 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
29130 20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70       lsmStringAp
29140 70 65 6e 64 66 28 70 53 74 72 2c 20 22 25 63 22  pendf(pStr, "%c"
29150 2c 20 69 73 61 6c 6e 75 6d 28 7a 5b 69 43 68 61  , isalnum(z[iCha
29160 72 5d 29 20 3f 7a 5b 69 43 68 61 72 5d 20 3a 20  r]) ?z[iChar] : 
29170 27 2e 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  '.');.    }.  }.
29180 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b    return LSM_OK;
29190 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 49 4e 46 4f  .}..#define INFO
291a0 5f 50 41 47 45 5f 44 55 4d 50 5f 44 41 54 41 20  _PAGE_DUMP_DATA 
291b0 20 20 20 20 30 78 30 31 0a 23 64 65 66 69 6e 65      0x01.#define
291c0 20 49 4e 46 4f 5f 50 41 47 45 5f 44 55 4d 50 5f   INFO_PAGE_DUMP_
291d0 56 41 4c 55 45 53 20 20 20 30 78 30 32 0a 23 64  VALUES   0x02.#d
291e0 65 66 69 6e 65 20 49 4e 46 4f 5f 50 41 47 45 5f  efine INFO_PAGE_
291f0 44 55 4d 50 5f 48 45 58 20 20 20 20 20 20 30 78  DUMP_HEX      0x
29200 30 34 0a 23 64 65 66 69 6e 65 20 49 4e 46 4f 5f  04.#define INFO_
29210 50 41 47 45 5f 44 55 4d 50 5f 49 4e 44 49 52 45  PAGE_DUMP_INDIRE
29220 43 54 20 30 78 30 38 0a 0a 73 74 61 74 69 63 20  CT 0x08..static 
29230 69 6e 74 20 69 6e 66 6f 50 61 67 65 44 75 6d 70  int infoPageDump
29240 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c  (.  lsm_db *pDb,
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29260 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
29270 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  handle */.  Pgno
29280 20 69 50 67 2c 20 20 20 20 20 20 20 20 20 20 20   iPg,           
29290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
292a0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  age number of pa
292b0 67 65 20 74 6f 20 64 75 6d 70 20 2a 2f 0a 20 20  ge to dump */.  
292c0 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 63 68 61  int flags,.  cha
292d0 72 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20 20  r **pzOut       
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
292f0 4f 55 54 3a 20 6c 73 6d 4d 61 6c 6c 6f 63 27 64  OUT: lsmMalloc'd
29300 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
29310 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b  int rc = LSM_OK;
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29330 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
29340 2f 0a 20 20 50 61 67 65 20 2a 70 50 67 20 3d 20  /.  Page *pPg = 
29350 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
29360 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
29370 72 20 70 61 67 65 20 69 50 67 20 2a 2f 0a 20 20  r page iPg */.  
29380 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
29390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293a0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
293b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
293c0 70 65 72 4c 69 6e 65 20 3d 20 31 36 3b 20 20 20  perLine = 16;   
293d0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 70        /* Bytes p
293e0 65 72 20 6c 69 6e 65 20 69 6e 20 74 68 65 20 72  er line in the r
293f0 61 77 20 68 65 78 20 64 75 6d 70 20 2a 2f 0a 20  aw hex dump */. 
29400 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d   Segment *pSeg =
29410 20 30 3b 0a 20 20 53 6e 61 70 73 68 6f 74 20 2a   0;.  Snapshot *
29420 70 53 6e 61 70 3b 0a 0a 20 20 69 6e 74 20 62 56  pSnap;..  int bV
29430 61 6c 75 65 73 20 3d 20 28 66 6c 61 67 73 20 26  alues = (flags &
29440 20 49 4e 46 4f 5f 50 41 47 45 5f 44 55 4d 50 5f   INFO_PAGE_DUMP_
29450 56 41 4c 55 45 53 29 3b 0a 20 20 69 6e 74 20 62  VALUES);.  int b
29460 48 65 78 20 3d 20 28 66 6c 61 67 73 20 26 20 49  Hex = (flags & I
29470 4e 46 4f 5f 50 41 47 45 5f 44 55 4d 50 5f 48 45  NFO_PAGE_DUMP_HE
29480 58 29 3b 0a 20 20 69 6e 74 20 62 44 61 74 61 20  X);.  int bData 
29490 3d 20 28 66 6c 61 67 73 20 26 20 49 4e 46 4f 5f  = (flags & INFO_
294a0 50 41 47 45 5f 44 55 4d 50 5f 44 41 54 41 29 3b  PAGE_DUMP_DATA);
294b0 0a 20 20 69 6e 74 20 62 49 6e 64 69 72 65 63 74  .  int bIndirect
294c0 20 3d 20 28 66 6c 61 67 73 20 26 20 49 4e 46 4f   = (flags & INFO
294d0 5f 50 41 47 45 5f 44 55 4d 50 5f 49 4e 44 49 52  _PAGE_DUMP_INDIR
294e0 45 43 54 29 3b 0a 0a 20 20 2a 70 7a 4f 75 74 20  ECT);..  *pzOut 
294f0 3d 20 30 3b 0a 20 20 69 66 28 20 69 50 67 3d 3d  = 0;.  if( iPg==
29500 30 20 29 20 72 65 74 75 72 6e 20 4c 53 4d 5f 45  0 ) return LSM_E
29510 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28  RROR;..  assert(
29520 20 70 44 62 2d 3e 70 43 6c 69 65 6e 74 20 7c 7c   pDb->pClient ||
29530 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 20 29 3b   pDb->pWorker );
29540 0a 20 20 70 53 6e 61 70 20 3d 20 70 44 62 2d 3e  .  pSnap = pDb->
29550 70 43 6c 69 65 6e 74 3b 0a 20 20 69 66 28 20 70  pClient;.  if( p
29560 53 6e 61 70 3d 3d 30 20 29 20 70 53 6e 61 70 20  Snap==0 ) pSnap 
29570 3d 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 3b 0a  = pDb->pWorker;.
29580 20 20 69 66 28 20 70 53 6e 61 70 2d 3e 72 65 64    if( pSnap->red
29590 69 72 65 63 74 2e 6e 3e 30 20 29 7b 0a 20 20 20  irect.n>0 ){.   
295a0 20 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20   Level *pLvl;.  
295b0 20 20 69 6e 74 20 62 55 73 65 20 3d 20 30 3b 0a    int bUse = 0;.
295c0 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d 70 53 6e      for(pLvl=pSn
295d0 61 70 2d 3e 70 4c 65 76 65 6c 3b 20 70 4c 76 6c  ap->pLevel; pLvl
295e0 2d 3e 70 4e 65 78 74 3b 20 70 4c 76 6c 3d 70 4c  ->pNext; pLvl=pL
295f0 76 6c 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20  vl->pNext);.    
29600 70 53 65 67 20 3d 20 28 70 4c 76 6c 2d 3e 6e 52  pSeg = (pLvl->nR
29610 69 67 68 74 3d 3d 30 20 3f 20 26 70 4c 76 6c 2d  ight==0 ? &pLvl-
29620 3e 6c 68 73 20 3a 20 26 70 4c 76 6c 2d 3e 61 52  >lhs : &pLvl->aR
29630 68 73 5b 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 2d  hs[pLvl->nRight-
29640 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 6c 73  1]);.    rc = ls
29650 6d 46 73 53 65 67 6d 65 6e 74 43 6f 6e 74 61 69  mFsSegmentContai
29660 6e 73 50 67 28 70 44 62 2d 3e 70 46 53 2c 20 70  nsPg(pDb->pFS, p
29670 53 65 67 2c 20 69 50 67 2c 20 26 62 55 73 65 29  Seg, iPg, &bUse)
29680 3b 0a 20 20 20 20 69 66 28 20 62 55 73 65 3d 3d  ;.    if( bUse==
29690 30 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20  0 ){.      pSeg 
296a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
296b0 20 20 2f 2a 20 69 50 67 20 69 73 20 61 20 72 65    /* iPg is a re
296c0 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  al page number (
296d0 6e 6f 74 20 73 75 62 6a 65 63 74 20 74 6f 20 72  not subject to r
296e0 65 64 69 72 65 63 74 69 6f 6e 29 2e 20 53 6f 20  edirection). So 
296f0 69 74 20 69 73 20 73 61 66 65 20 0a 20 20 2a 2a  it is safe .  **
29700 20 74 6f 20 70 61 73 73 20 61 20 4e 55 4c 4c 20   to pass a NULL 
29710 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  in place of the 
29720 73 65 67 6d 65 6e 74 20 70 6f 69 6e 74 65 72 20  segment pointer 
29730 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
29740 67 75 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 6c  gument.  ** to l
29750 73 6d 46 73 44 62 50 61 67 65 47 65 74 28 29 20  smFsDbPageGet() 
29760 68 65 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  here.  */.  if( 
29770 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
29780 20 20 72 63 20 3d 20 6c 73 6d 46 73 44 62 50 61    rc = lsmFsDbPa
29790 67 65 47 65 74 28 70 44 62 2d 3e 70 46 53 2c 20  geGet(pDb->pFS, 
297a0 30 2c 20 69 50 67 2c 20 26 70 50 67 29 3b 0a 20  0, iPg, &pPg);. 
297b0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53   }..  if( rc==LS
297c0 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 6c 6f 62  M_OK ){.    Blob
297d0 20 62 6c 6f 62 20 3d 20 7b 30 2c 20 30 2c 20 30   blob = {0, 0, 0
297e0 2c 20 30 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 4b  , 0};.    int nK
297f0 65 79 57 69 64 74 68 20 3d 20 30 3b 0a 20 20 20  eyWidth = 0;.   
29800 20 4c 73 6d 53 74 72 69 6e 67 20 73 74 72 3b 0a   LsmString str;.
29810 20 20 20 20 69 6e 74 20 6e 52 65 63 3b 0a 20 20      int nRec;.  
29820 20 20 69 6e 74 20 69 50 74 72 3b 0a 20 20 20 20    int iPtr;.    
29830 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20 69  int flags;.    i
29840 6e 74 20 69 43 65 6c 6c 3b 0a 20 20 20 20 75 38  nt iCell;.    u8
29850 20 2a 61 44 61 74 61 3b 20 69 6e 74 20 6e 44 61   *aData; int nDa
29860 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ta;         /* P
29870 61 67 65 20 64 61 74 61 20 61 6e 64 20 73 69 7a  age data and siz
29880 65 20 74 68 65 72 65 6f 66 20 2a 2f 0a 0a 20 20  e thereof */..  
29890 20 20 61 44 61 74 61 20 3d 20 66 73 50 61 67 65    aData = fsPage
298a0 44 61 74 61 28 70 50 67 2c 20 26 6e 44 61 74 61  Data(pPg, &nData
298b0 29 3b 0a 20 20 20 20 6e 52 65 63 20 3d 20 70 61  );.    nRec = pa
298c0 67 65 47 65 74 4e 52 65 63 28 61 44 61 74 61 2c  geGetNRec(aData,
298d0 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 50 74   nData);.    iPt
298e0 72 20 3d 20 28 69 6e 74 29 70 61 67 65 47 65 74  r = (int)pageGet
298f0 50 74 72 28 61 44 61 74 61 2c 20 6e 44 61 74 61  Ptr(aData, nData
29900 29 3b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 70  );.    flags = p
29910 61 67 65 47 65 74 46 6c 61 67 73 28 61 44 61 74  ageGetFlags(aDat
29920 61 2c 20 6e 44 61 74 61 29 3b 0a 0a 20 20 20 20  a, nData);..    
29930 6c 73 6d 53 74 72 69 6e 67 49 6e 69 74 28 26 73  lsmStringInit(&s
29940 74 72 2c 20 70 44 62 2d 3e 70 45 6e 76 29 3b 0a  tr, pDb->pEnv);.
29950 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70      lsmStringApp
29960 65 6e 64 66 28 26 73 74 72 2c 20 22 50 61 67 65  endf(&str, "Page
29970 20 3a 20 25 6c 6c 64 20 20 28 25 64 20 62 79 74   : %lld  (%d byt
29980 65 73 29 5c 6e 22 2c 20 69 50 67 2c 20 6e 44 61  es)\n", iPg, nDa
29990 74 61 29 3b 0a 20 20 20 20 6c 73 6d 53 74 72 69  ta);.    lsmStri
299a0 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c 20  ngAppendf(&str, 
299b0 22 6e 52 65 63 20 3a 20 25 64 5c 6e 22 2c 20 6e  "nRec : %d\n", n
299c0 52 65 63 29 3b 0a 20 20 20 20 6c 73 6d 53 74 72  Rec);.    lsmStr
299d0 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c  ingAppendf(&str,
299e0 20 22 69 50 74 72 20 3a 20 25 64 5c 6e 22 2c 20   "iPtr : %d\n", 
299f0 69 50 74 72 29 3b 0a 20 20 20 20 6c 73 6d 53 74  iPtr);.    lsmSt
29a00 72 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72  ringAppendf(&str
29a10 2c 20 22 66 6c 61 67 73 3a 20 25 30 34 78 5c 6e  , "flags: %04x\n
29a20 22 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 6c  ", flags);.    l
29a30 73 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66 28  smStringAppendf(
29a40 26 73 74 72 2c 20 22 5c 6e 22 29 3b 0a 0a 20 20  &str, "\n");..  
29a50 20 20 66 6f 72 28 69 43 65 6c 6c 3d 30 3b 20 69    for(iCell=0; i
29a60 43 65 6c 6c 3c 6e 52 65 63 3b 20 69 43 65 6c 6c  Cell<nRec; iCell
29a70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
29a80 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 66 6f 43  Key;.      infoC
29a90 65 6c 6c 44 75 6d 70 28 0a 20 20 20 20 20 20 20  ellDump(.       
29aa0 20 20 20 70 44 62 2c 20 70 53 65 67 2c 20 62 49     pDb, pSeg, bI
29ab0 6e 64 69 72 65 63 74 2c 20 70 50 67 2c 20 69 43  ndirect, pPg, iC
29ac0 65 6c 6c 2c 20 30 2c 20 30 2c 20 30 2c 20 26 6e  ell, 0, 0, 0, &n
29ad0 4b 65 79 2c 20 30 2c 20 30 2c 20 26 62 6c 6f 62  Key, 0, 0, &blob
29ae0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
29af0 69 66 28 20 6e 4b 65 79 3e 6e 4b 65 79 57 69 64  if( nKey>nKeyWid
29b00 74 68 20 29 20 6e 4b 65 79 57 69 64 74 68 20 3d  th ) nKeyWidth =
29b10 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 20   nKey;.    }.   
29b20 20 69 66 28 20 62 48 65 78 20 29 20 6e 4b 65 79   if( bHex ) nKey
29b30 57 69 64 74 68 20 3d 20 6e 4b 65 79 57 69 64 74  Width = nKeyWidt
29b40 68 20 2a 20 32 3b 0a 0a 20 20 20 20 66 6f 72 28  h * 2;..    for(
29b50 69 43 65 6c 6c 3d 30 3b 20 69 43 65 6c 6c 3c 6e  iCell=0; iCell<n
29b60 52 65 63 3b 20 69 43 65 6c 6c 2b 2b 29 7b 0a 20  Rec; iCell++){. 
29b70 20 20 20 20 20 75 38 20 2a 61 4b 65 79 3b 20 69       u8 *aKey; i
29b80 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 20 20 20 20  nt nKey = 0;    
29b90 20 20 20 2f 2a 20 4b 65 79 20 2a 2f 0a 20 20 20     /* Key */.   
29ba0 20 20 20 75 38 20 2a 61 56 61 6c 3b 20 69 6e 74     u8 *aVal; int
29bb0 20 6e 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20   nVal = 0;      
29bc0 20 2f 2a 20 56 61 6c 75 65 20 2a 2f 0a 20 20 20   /* Value */.   
29bd0 20 20 20 69 6e 74 20 69 50 67 50 74 72 3b 0a 20     int iPgPtr;. 
29be0 20 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a       int eType;.
29bf0 20 20 20 20 20 20 50 67 6e 6f 20 69 41 62 73 50        Pgno iAbsP
29c00 74 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a  tr;.      char z
29c10 46 6c 61 67 73 5b 38 5d 3b 0a 0a 20 20 20 20 20  Flags[8];..     
29c20 20 69 6e 66 6f 43 65 6c 6c 44 75 6d 70 28 70 44   infoCellDump(pD
29c30 62 2c 20 70 53 65 67 2c 20 62 49 6e 64 69 72 65  b, pSeg, bIndire
29c40 63 74 2c 20 70 50 67 2c 20 69 43 65 6c 6c 2c 20  ct, pPg, iCell, 
29c50 26 65 54 79 70 65 2c 20 26 69 50 67 50 74 72 2c  &eType, &iPgPtr,
29c60 0a 20 20 20 20 20 20 20 20 20 20 26 61 4b 65 79  .          &aKey
29c70 2c 20 26 6e 4b 65 79 2c 20 26 61 56 61 6c 2c 20  , &nKey, &aVal, 
29c80 26 6e 56 61 6c 2c 20 26 62 6c 6f 62 0a 20 20 20  &nVal, &blob.   
29c90 20 20 20 29 3b 0a 20 20 20 20 20 20 69 41 62 73     );.      iAbs
29ca0 50 74 72 20 3d 20 69 50 67 50 74 72 20 2b 20 28  Ptr = iPgPtr + (
29cb0 28 66 6c 61 67 73 20 26 20 53 45 47 4d 45 4e 54  (flags & SEGMENT
29cc0 5f 42 54 52 45 45 5f 46 4c 41 47 29 20 3f 20 30  _BTREE_FLAG) ? 0
29cd0 20 3a 20 69 50 74 72 29 3b 0a 0a 20 20 20 20 20   : iPtr);..     
29ce0 20 6c 73 6d 46 6c 61 67 73 54 6f 53 74 72 69 6e   lsmFlagsToStrin
29cf0 67 28 65 54 79 70 65 2c 20 7a 46 6c 61 67 73 29  g(eType, zFlags)
29d00 3b 0a 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e  ;.      lsmStrin
29d10 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22  gAppendf(&str, "
29d20 25 73 20 25 64 20 28 25 73 29 20 22 2c 20 0a 20  %s %d (%s) ", . 
29d30 20 20 20 20 20 20 20 20 20 7a 46 6c 61 67 73 2c           zFlags,
29d40 20 69 41 62 73 50 74 72 2c 20 28 72 74 54 6f 70   iAbsPtr, (rtTop
29d50 69 63 28 65 54 79 70 65 29 20 3f 20 22 73 79 73  ic(eType) ? "sys
29d60 22 20 3a 20 22 75 73 72 22 29 0a 20 20 20 20 20  " : "usr").     
29d70 20 29 3b 0a 20 20 20 20 20 20 69 6e 66 6f 41 70   );.      infoAp
29d80 70 65 6e 64 42 6c 6f 62 28 26 73 74 72 2c 20 62  pendBlob(&str, b
29d90 48 65 78 2c 20 61 4b 65 79 2c 20 6e 4b 65 79 29  Hex, aKey, nKey)
29da0 3b 20 0a 20 20 20 20 20 20 69 66 28 20 6e 56 61  ; .      if( nVa
29db0 6c 3e 30 20 26 26 20 62 56 61 6c 75 65 73 20 29  l>0 && bValues )
29dc0 7b 0a 20 20 20 20 20 20 20 20 6c 73 6d 53 74 72  {.        lsmStr
29dd0 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c  ingAppendf(&str,
29de0 20 22 25 2a 73 22 2c 20 6e 4b 65 79 57 69 64 74   "%*s", nKeyWidt
29df0 68 20 2d 20 28 6e 4b 65 79 2a 28 31 2b 62 48 65  h - (nKey*(1+bHe
29e00 78 29 29 2c 20 22 22 29 3b 0a 20 20 20 20 20 20  x)), "");.      
29e10 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70 65 6e    lsmStringAppen
29e20 64 66 28 26 73 74 72 2c 20 22 20 22 29 3b 0a 20  df(&str, " ");. 
29e30 20 20 20 20 20 20 20 69 6e 66 6f 41 70 70 65 6e         infoAppen
29e40 64 42 6c 6f 62 28 26 73 74 72 2c 20 62 48 65 78  dBlob(&str, bHex
29e50 2c 20 61 56 61 6c 2c 20 6e 56 61 6c 29 3b 20 0a  , aVal, nVal); .
29e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
29e70 28 20 72 74 54 6f 70 69 63 28 65 54 79 70 65 29  ( rtTopic(eType)
29e80 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
29e90 69 42 6c 6b 20 3d 20 28 69 6e 74 29 7e 6c 73 6d  iBlk = (int)~lsm
29ea0 47 65 74 55 33 32 28 61 4b 65 79 29 3b 0a 20 20  GetU32(aKey);.  
29eb0 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41        lsmStringA
29ec0 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22 20 20  ppendf(&str, "  
29ed0 28 62 6c 6f 63 6b 3d 25 64 22 2c 20 69 42 6c 6b  (block=%d", iBlk
29ee0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
29ef0 56 61 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Val>0 ){.       
29f00 20 20 20 69 36 34 20 69 53 6e 61 70 20 3d 20 6c     i64 iSnap = l
29f10 73 6d 47 65 74 55 36 34 28 61 56 61 6c 29 3b 0a  smGetU64(aVal);.
29f20 20 20 20 20 20 20 20 20 20 20 6c 73 6d 53 74 72            lsmStr
29f30 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c  ingAppendf(&str,
29f40 20 22 20 73 6e 61 70 73 68 6f 74 3d 25 6c 6c 64   " snapshot=%lld
29f50 22 2c 20 69 53 6e 61 70 29 3b 0a 20 20 20 20 20  ", iSnap);.     
29f60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 73 6d     }.        lsm
29f70 53 74 72 69 6e 67 41 70 70 65 6e 64 66 28 26 73  StringAppendf(&s
29f80 74 72 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20  tr, ")");.      
29f90 7d 0a 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e  }.      lsmStrin
29fa0 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22  gAppendf(&str, "
29fb0 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  \n");.    }..   
29fc0 20 69 66 28 20 62 44 61 74 61 20 29 7b 0a 20 20   if( bData ){.  
29fd0 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70      lsmStringApp
29fe0 65 6e 64 66 28 26 73 74 72 2c 20 22 5c 6e 2d 2d  endf(&str, "\n--
29ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a000 2d 22 20 0a 20 20 20 20 20 20 20 20 20 20 22 2d  -" .          "-
2a010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29  ------------\n")
2a050 3b 0a 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e  ;.      lsmStrin
2a060 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22  gAppendf(&str, "
2a070 50 61 67 65 20 25 64 5c 6e 22 2c 0a 20 20 20 20  Page %d\n",.    
2a080 20 20 20 20 20 20 69 50 67 2c 20 28 69 50 67 2d        iPg, (iPg-
2a090 31 29 2a 6e 44 61 74 61 2c 20 69 50 67 2a 6e 44  1)*nData, iPg*nD
2a0a0 61 74 61 20 2d 20 31 29 3b 0a 20 20 20 20 20 20  ata - 1);.      
2a0b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 61 74 61  for(i=0; i<nData
2a0c0 3b 20 69 20 2b 3d 20 70 65 72 4c 69 6e 65 29 7b  ; i += perLine){
2a0d0 0a 20 20 20 20 20 20 20 20 6c 73 6d 53 74 72 69  .        lsmStri
2a0e0 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c 20  ngAppendf(&str, 
2a0f0 22 25 30 34 78 3a 20 22 2c 20 69 29 3b 0a 20 20  "%04x: ", i);.  
2a100 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2a110 3c 70 65 72 4c 69 6e 65 3b 20 6a 2b 2b 29 7b 0a  <perLine; j++){.
2a120 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b            if( i+
2a130 6a 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20  j>nData ){.     
2a140 20 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67         lsmString
2a150 41 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22 20  Appendf(&str, " 
2a160 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20    ");.          
2a170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2a180 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70 65     lsmStringAppe
2a190 6e 64 66 28 26 73 74 72 2c 20 22 25 30 32 78 20  ndf(&str, "%02x 
2a1a0 22 2c 20 61 44 61 74 61 5b 69 2b 6a 5d 29 3b 0a  ", aData[i+j]);.
2a1b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a1c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 73      }.        ls
2a1d0 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66 28 26  mStringAppendf(&
2a1e0 73 74 72 2c 20 22 20 20 22 29 3b 0a 20 20 20 20  str, "  ");.    
2a1f0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2a200 65 72 4c 69 6e 65 3b 20 6a 2b 2b 29 7b 0a 20 20  erLine; j++){.  
2a210 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6a 3e          if( i+j>
2a220 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  nData ){.       
2a230 20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70       lsmStringAp
2a240 70 65 6e 64 66 28 26 73 74 72 2c 20 22 20 22 29  pendf(&str, " ")
2a250 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2a260 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  e{.            l
2a270 73 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66 28  smStringAppendf(
2a280 26 73 74 72 2c 22 25 63 22 2c 20 69 73 70 72 69  &str,"%c", ispri
2a290 6e 74 28 61 44 61 74 61 5b 69 2b 6a 5d 29 20 3f  nt(aData[i+j]) ?
2a2a0 20 61 44 61 74 61 5b 69 2b 6a 5d 20 3a 20 27 2e   aData[i+j] : '.
2a2b0 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
2a2c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a2d0 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70 65 6e    lsmStringAppen
2a2e0 64 66 28 26 73 74 72 2c 22 5c 6e 22 29 3b 0a 20  df(&str,"\n");. 
2a2f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2a300 20 20 2a 70 7a 4f 75 74 20 3d 20 73 74 72 2e 7a    *pzOut = str.z
2a310 3b 0a 20 20 20 20 73 6f 72 74 65 64 42 6c 6f 62  ;.    sortedBlob
2a320 46 72 65 65 28 26 62 6c 6f 62 29 3b 0a 20 20 20  Free(&blob);.   
2a330 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73   lsmFsPageReleas
2a340 65 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  e(pPg);.  }..  r
2a350 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74  eturn rc;.}..int
2a360 20 6c 73 6d 49 6e 66 6f 50 61 67 65 44 75 6d 70   lsmInfoPageDump
2a370 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c  (.  lsm_db *pDb,
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a390 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2a3a0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  handle */.  Pgno
2a3b0 20 69 50 67 2c 20 20 20 20 20 20 20 20 20 20 20   iPg,           
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2a3d0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  age number of pa
2a3e0 67 65 20 74 6f 20 64 75 6d 70 20 2a 2f 0a 20 20  ge to dump */.  
2a3f0 69 6e 74 20 62 48 65 78 2c 20 20 20 20 20 20 20  int bHex,       
2a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a410 2f 2a 20 54 72 75 65 20 74 6f 20 6f 75 74 70 75  /* True to outpu
2a420 74 20 6b 65 79 2f 76 61 6c 75 65 20 69 6e 20 68  t key/value in h
2a430 65 78 20 66 6f 72 6d 20 2a 2f 0a 20 20 63 68 61  ex form */.  cha
2a440 72 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20 20  r **pzOut       
2a450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a460 4f 55 54 3a 20 6c 73 6d 4d 61 6c 6c 6f 63 27 64  OUT: lsmMalloc'd
2a470 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   string */.){.  
2a480 69 6e 74 20 66 6c 61 67 73 20 3d 20 49 4e 46 4f  int flags = INFO
2a490 5f 50 41 47 45 5f 44 55 4d 50 5f 44 41 54 41 20  _PAGE_DUMP_DATA 
2a4a0 7c 20 49 4e 46 4f 5f 50 41 47 45 5f 44 55 4d 50  | INFO_PAGE_DUMP
2a4b0 5f 56 41 4c 55 45 53 3b 0a 20 20 69 66 28 20 62  _VALUES;.  if( b
2a4c0 48 65 78 20 29 20 66 6c 61 67 73 20 7c 3d 20 49  Hex ) flags |= I
2a4d0 4e 46 4f 5f 50 41 47 45 5f 44 55 4d 50 5f 48 45  NFO_PAGE_DUMP_HE
2a4e0 58 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f  X;.  return info
2a4f0 50 61 67 65 44 75 6d 70 28 70 44 62 2c 20 69 50  PageDump(pDb, iP
2a500 67 2c 20 66 6c 61 67 73 2c 20 70 7a 4f 75 74 29  g, flags, pzOut)
2a510 3b 0a 7d 0a 0a 76 6f 69 64 20 73 6f 72 74 65 64  ;.}..void sorted
2a520 44 75 6d 70 53 65 67 6d 65 6e 74 28 6c 73 6d 5f  DumpSegment(lsm_
2a530 64 62 20 2a 70 44 62 2c 20 53 65 67 6d 65 6e 74  db *pDb, Segment
2a540 20 2a 70 52 75 6e 2c 20 69 6e 74 20 62 56 61 6c   *pRun, int bVal
2a550 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 44  s){.  assert( pD
2a560 62 2d 3e 78 4c 6f 67 20 29 3b 0a 20 20 69 66 28  b->xLog );.  if(
2a570 20 70 52 75 6e 20 26 26 20 70 52 75 6e 2d 3e 69   pRun && pRun->i
2a580 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 6e 74  First ){.    int
2a590 20 66 6c 61 67 73 20 3d 20 28 62 56 61 6c 73 20   flags = (bVals 
2a5a0 3f 20 49 4e 46 4f 5f 50 41 47 45 5f 44 55 4d 50  ? INFO_PAGE_DUMP
2a5b0 5f 56 41 4c 55 45 53 20 3a 20 30 29 3b 0a 20 20  _VALUES : 0);.  
2a5c0 20 20 63 68 61 72 20 2a 7a 53 65 67 3b 0a 20 20    char *zSeg;.  
2a5d0 20 20 50 61 67 65 20 2a 70 50 67 3b 0a 0a 20 20    Page *pPg;..  
2a5e0 20 20 7a 53 65 67 20 3d 20 73 65 67 54 6f 53 74    zSeg = segToSt
2a5f0 72 69 6e 67 28 70 44 62 2d 3e 70 45 6e 76 2c 20  ring(pDb->pEnv, 
2a600 70 52 75 6e 2c 20 30 29 3b 0a 20 20 20 20 6c 73  pRun, 0);.    ls
2a610 6d 4c 6f 67 4d 65 73 73 61 67 65 28 70 44 62 2c  mLogMessage(pDb,
2a620 20 4c 53 4d 5f 4f 4b 2c 20 22 53 65 67 6d 65 6e   LSM_OK, "Segmen
2a630 74 3a 20 25 73 22 2c 20 7a 53 65 67 29 3b 0a 20  t: %s", zSeg);. 
2a640 20 20 20 6c 73 6d 46 72 65 65 28 70 44 62 2d 3e     lsmFree(pDb->
2a650 70 45 6e 76 2c 20 7a 53 65 67 29 3b 0a 0a 20 20  pEnv, zSeg);..  
2a660 20 20 6c 73 6d 46 73 44 62 50 61 67 65 47 65 74    lsmFsDbPageGet
2a670 28 70 44 62 2d 3e 70 46 53 2c 20 70 52 75 6e 2c  (pDb->pFS, pRun,
2a680 20 70 52 75 6e 2d 3e 69 46 69 72 73 74 2c 20 26   pRun->iFirst, &
2a690 70 50 67 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  pPg);.    while(
2a6a0 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 50 61   pPg ){.      Pa
2a6b0 67 65 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 20  ge *pNext;.     
2a6c0 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
2a6d0 20 20 20 20 69 6e 66 6f 50 61 67 65 44 75 6d 70      infoPageDump
2a6e0 28 70 44 62 2c 20 6c 73 6d 46 73 50 61 67 65 4e  (pDb, lsmFsPageN
2a6f0 75 6d 62 65 72 28 70 50 67 29 2c 20 66 6c 61 67  umber(pPg), flag
2a700 73 2c 20 26 7a 29 3b 0a 20 20 20 20 20 20 6c 73  s, &z);.      ls
2a710 6d 4c 6f 67 4d 65 73 73 61 67 65 28 70 44 62 2c  mLogMessage(pDb,
2a720 20 4c 53 4d 5f 4f 4b 2c 20 22 25 73 22 2c 20 7a   LSM_OK, "%s", z
2a730 29 3b 0a 20 20 20 20 20 20 6c 73 6d 46 72 65 65  );.      lsmFree
2a740 28 70 44 62 2d 3e 70 45 6e 76 2c 20 7a 29 3b 0a  (pDb->pEnv, z);.
2a750 23 69 66 20 30 0a 20 20 20 20 20 20 73 6f 72 74  #if 0.      sort
2a760 65 64 44 75 6d 70 50 61 67 65 28 70 44 62 2c 20  edDumpPage(pDb, 
2a770 70 52 75 6e 2c 20 70 50 67 2c 20 62 56 61 6c 73  pRun, pPg, bVals
2a780 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
2a790 6c 73 6d 46 73 44 62 50 61 67 65 4e 65 78 74 28  lsmFsDbPageNext(
2a7a0 70 52 75 6e 2c 20 70 50 67 2c 20 31 2c 20 26 70  pRun, pPg, 1, &p
2a7b0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 6c 73 6d  Next);.      lsm
2a7c0 46 73 50 61 67 65 52 65 6c 65 61 73 65 28 70 50  FsPageRelease(pP
2a7d0 67 29 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20  g);.      pPg = 
2a7e0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
2a7f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
2a800 20 74 68 65 20 6c 6f 67 20 63 61 6c 6c 62 61 63   the log callbac
2a810 6b 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74  k zero or more t
2a820 69 6d 65 73 20 77 69 74 68 20 6d 65 73 73 61 67  imes with messag
2a830 65 73 20 74 68 61 74 20 64 65 73 63 72 69 62 65  es that describe
2a840 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2a850 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
2a860 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 6c 73 6d 53  re..*/.void lsmS
2a870 6f 72 74 65 64 44 75 6d 70 53 74 72 75 63 74 75  ortedDumpStructu
2a880 72 65 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44  re(.  lsm_db *pD
2a890 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
2a8a0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
2a8b0 65 20 68 61 6e 64 6c 65 20 28 75 73 65 64 20 66  e handle (used f
2a8c0 6f 72 20 78 4c 6f 67 20 63 61 6c 6c 62 61 63 6b  or xLog callback
2a8d0 29 20 2a 2f 0a 20 20 53 6e 61 70 73 68 6f 74 20  ) */.  Snapshot 
2a8e0 2a 70 53 6e 61 70 2c 20 20 20 20 20 20 20 20 20  *pSnap,         
2a8f0 20 20 20 20 20 20 20 2f 2a 20 53 6e 61 70 73 68         /* Snapsh
2a900 6f 74 20 74 6f 20 64 75 6d 70 20 2a 2f 0a 20 20  ot to dump */.  
2a910 69 6e 74 20 62 4b 65 79 73 2c 20 20 20 20 20 20  int bKeys,      
2a920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a930 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 6b 65  /* Output the ke
2a940 79 73 20 66 72 6f 6d 20 65 61 63 68 20 73 65 67  ys from each seg
2a950 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 56  ment */.  int bV
2a960 61 6c 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  als,            
2a970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2a980 70 75 74 20 74 68 65 20 76 61 6c 75 65 73 20 66  put the values f
2a990 72 6f 6d 20 65 61 63 68 20 73 65 67 6d 65 6e 74  rom each segment
2a9a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2a9b0 20 2a 7a 57 68 79 20 20 20 20 20 20 20 20 20 20   *zWhy          
2a9c0 20 20 20 20 20 20 2f 2a 20 43 61 70 74 69 6f 6e        /* Caption
2a9d0 20 74 6f 20 70 72 69 6e 74 20 6e 65 61 72 20 74   to print near t
2a9e0 6f 70 20 6f 66 20 64 75 6d 70 20 2a 2f 0a 29 7b  op of dump */.){
2a9f0 0a 20 20 53 6e 61 70 73 68 6f 74 20 2a 70 44 75  .  Snapshot *pDu
2aa00 6d 70 20 3d 20 70 53 6e 61 70 3b 0a 20 20 4c 65  mp = pSnap;.  Le
2aa10 76 65 6c 20 2a 70 54 6f 70 4c 65 76 65 6c 3b 0a  vel *pTopLevel;.
2aa20 20 20 63 68 61 72 20 2a 7a 46 72 65 65 20 3d 20    char *zFree = 
2aa30 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
2aa40 6e 61 70 20 29 3b 0a 20 20 70 54 6f 70 4c 65 76  nap );.  pTopLev
2aa50 65 6c 20 3d 20 6c 73 6d 44 62 53 6e 61 70 73 68  el = lsmDbSnapsh
2aa60 6f 74 4c 65 76 65 6c 28 70 44 75 6d 70 29 3b 0a  otLevel(pDump);.
2aa70 20 20 69 66 28 20 70 44 62 2d 3e 78 4c 6f 67 20    if( pDb->xLog 
2aa80 26 26 20 70 54 6f 70 4c 65 76 65 6c 20 29 7b 0a  && pTopLevel ){.
2aa90 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e      static int n
2aaa0 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 4c 65  Call = 0;.    Le
2aab0 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 20  vel *pLevel;.   
2aac0 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20 30 3b   int iLevel = 0;
2aad0 0a 0a 20 20 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 20  ..    nCall++;. 
2aae0 20 20 20 6c 73 6d 4c 6f 67 4d 65 73 73 61 67 65     lsmLogMessage
2aaf0 28 70 44 62 2c 20 4c 53 4d 5f 4f 4b 2c 20 22 44  (pDb, LSM_OK, "D
2ab00 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
2ab10 65 20 25 64 20 28 25 73 29 22 2c 20 6e 43 61 6c  e %d (%s)", nCal
2ab20 6c 2c 20 7a 57 68 79 29 3b 0a 0a 23 69 66 20 30  l, zWhy);..#if 0
2ab30 0a 20 20 20 20 69 66 28 20 6e 43 61 6c 6c 3d 3d  .    if( nCall==
2ab40 31 30 33 31 20 7c 7c 20 6e 43 61 6c 6c 3d 3d 31  1031 || nCall==1
2ab50 30 33 32 20 29 20 62 4b 65 79 73 3d 31 3b 0a 23  032 ) bKeys=1;.#
2ab60 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 70  endif..    for(p
2ab70 4c 65 76 65 6c 3d 70 54 6f 70 4c 65 76 65 6c 3b  Level=pTopLevel;
2ab80 20 70 4c 65 76 65 6c 3b 20 70 4c 65 76 65 6c 3d   pLevel; pLevel=
2ab90 70 4c 65 76 65 6c 2d 3e 70 4e 65 78 74 29 7b 0a  pLevel->pNext){.
2aba0 20 20 20 20 20 20 63 68 61 72 20 7a 4c 65 66 74        char zLeft
2abb0 5b 31 30 32 34 5d 3b 0a 20 20 20 20 20 20 63 68  [1024];.      ch
2abc0 61 72 20 7a 52 69 67 68 74 5b 31 30 32 34 5d 3b  ar zRight[1024];
2abd0 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 30  .      int i = 0
2abe0 3b 0a 0a 20 20 20 20 20 20 53 65 67 6d 65 6e 74  ;..      Segment
2abf0 20 2a 61 4c 65 66 74 5b 32 34 5d 3b 20 20 0a 20   *aLeft[24];  . 
2ac00 20 20 20 20 20 53 65 67 6d 65 6e 74 20 2a 61 52       Segment *aR
2ac10 69 67 68 74 5b 32 34 5d 3b 0a 0a 20 20 20 20 20  ight[24];..     
2ac20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 30 3b 0a   int nLeft = 0;.
2ac30 20 20 20 20 20 20 69 6e 74 20 6e 52 69 67 68 74        int nRight
2ac40 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 53 65 67   = 0;..      Seg
2ac50 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c  ment *pSeg = &pL
2ac60 65 76 65 6c 2d 3e 6c 68 73 3b 0a 20 20 20 20 20  evel->lhs;.     
2ac70 20 61 4c 65 66 74 5b 6e 4c 65 66 74 2b 2b 5d 20   aLeft[nLeft++] 
2ac80 3d 20 70 53 65 67 3b 0a 0a 20 20 20 20 20 20 66  = pSeg;..      f
2ac90 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 65 76 65 6c  or(i=0; i<pLevel
2aca0 2d 3e 6e 52 69 67 68 74 3b 20 69 2b 2b 29 7b 0a  ->nRight; i++){.
2acb0 20 20 20 20 20 20 20 20 61 52 69 67 68 74 5b 6e          aRight[n
2acc0 52 69 67 68 74 2b 2b 5d 20 3d 20 26 70 4c 65 76  Right++] = &pLev
2acd0 65 6c 2d 3e 61 52 68 73 5b 69 5d 3b 0a 20 20 20  el->aRhs[i];.   
2ace0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 4c 53 4d     }..#ifdef LSM
2acf0 5f 4c 4f 47 5f 46 52 45 45 4c 49 53 54 0a 20 20  _LOG_FREELIST.  
2ad00 20 20 20 20 69 66 28 20 6e 52 69 67 68 74 20 29      if( nRight )
2ad10 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76  {.        memmov
2ad20 65 28 26 61 52 69 67 68 74 5b 31 5d 2c 20 61 52  e(&aRight[1], aR
2ad30 69 67 68 74 2c 20 73 69 7a 65 6f 66 28 61 52 69  ight, sizeof(aRi
2ad40 67 68 74 5b 30 5d 29 2a 6e 52 69 67 68 74 29 3b  ght[0])*nRight);
2ad50 0a 20 20 20 20 20 20 20 20 61 52 69 67 68 74 5b  .        aRight[
2ad60 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
2ad70 6e 52 69 67 68 74 2b 2b 3b 0a 20 20 20 20 20 20  nRight++;.      
2ad80 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
2ad90 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 65 66 74  for(i=0; i<nLeft
2ada0 20 7c 7c 20 69 3c 6e 52 69 67 68 74 3b 20 69 2b   || i<nRight; i+
2adb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
2adc0 69 50 61 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  iPad = 0;.      
2add0 20 20 63 68 61 72 20 7a 4c 65 76 65 6c 5b 33 32    char zLevel[32
2ade0 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4c 65 66 74  ];.        zLeft
2adf0 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  [0] = '\0';.    
2ae00 20 20 20 20 7a 52 69 67 68 74 5b 30 5d 20 3d 20      zRight[0] = 
2ae10 27 5c 30 27 3b 0a 0a 20 20 20 20 20 20 20 20 69  '\0';..        i
2ae20 66 28 20 69 3c 6e 4c 65 66 74 20 29 7b 20 0a 20  f( i<nLeft ){ . 
2ae30 20 20 20 20 20 20 20 20 20 66 69 6c 65 54 6f 53           fileToS
2ae40 74 72 69 6e 67 28 70 44 62 2c 20 7a 4c 65 66 74  tring(pDb, zLeft
2ae50 2c 20 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c  , sizeof(zLeft),
2ae60 20 32 34 2c 20 61 4c 65 66 74 5b 69 5d 29 3b 20   24, aLeft[i]); 
2ae70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ae80 20 20 20 69 66 28 20 69 3c 6e 52 69 67 68 74 20     if( i<nRight 
2ae90 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 66 69  ){ .          fi
2aea0 6c 65 54 6f 53 74 72 69 6e 67 28 70 44 62 2c 20  leToString(pDb, 
2aeb0 7a 52 69 67 68 74 2c 20 73 69 7a 65 6f 66 28 7a  zRight, sizeof(z
2aec0 52 69 67 68 74 29 2c 20 32 34 2c 20 61 52 69 67  Right), 24, aRig
2aed0 68 74 5b 69 5d 29 3b 20 0a 20 20 20 20 20 20 20  ht[i]); .       
2aee0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
2aef0 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  i==0 ){.        
2af00 20 20 73 6e 70 72 69 6e 74 66 28 7a 4c 65 76 65    snprintf(zLeve
2af10 6c 2c 20 73 69 7a 65 6f 66 28 7a 4c 65 76 65 6c  l, sizeof(zLevel
2af20 29 2c 20 22 4c 25 64 3a 20 28 61 67 65 3d 25 64  ), "L%d: (age=%d
2af30 29 20 28 66 6c 61 67 73 3d 25 2e 34 78 29 22 2c  ) (flags=%.4x)",
2af40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2af50 4c 65 76 65 6c 2c 20 28 69 6e 74 29 70 4c 65 76  Level, (int)pLev
2af60 65 6c 2d 3e 69 41 67 65 2c 20 28 69 6e 74 29 70  el->iAge, (int)p
2af70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 0a 20 20 20  Level->flags.   
2af80 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2af90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2afa0 20 20 20 7a 4c 65 76 65 6c 5b 30 5d 20 3d 20 27     zLevel[0] = '
2afb0 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  \0';.        }..
2afc0 20 20 20 20 20 20 20 20 69 66 28 20 6e 52 69 67          if( nRig
2afd0 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ht==0 ){.       
2afe0 20 20 20 69 50 61 64 20 3d 20 31 30 3b 0a 20 20     iPad = 10;.  
2aff0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2b000 20 6c 73 6d 4c 6f 67 4d 65 73 73 61 67 65 28 70   lsmLogMessage(p
2b010 44 62 2c 20 4c 53 4d 5f 4f 4b 2c 20 22 25 20 32  Db, LSM_OK, "% 2
2b020 35 73 20 25 20 2a 73 25 20 2d 33 35 73 20 25 73  5s % *s% -35s %s
2b030 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
2b040 7a 4c 65 76 65 6c 2c 20 69 50 61 64 2c 20 22 22  zLevel, iPad, ""
2b050 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68 74 0a  , zLeft, zRight.
2b060 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2b070 20 7d 0a 0a 20 20 20 20 20 20 69 4c 65 76 65 6c   }..      iLevel
2b080 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
2b090 66 28 20 62 4b 65 79 73 20 29 7b 0a 20 20 20 20  f( bKeys ){.    
2b0a0 20 20 66 6f 72 28 70 4c 65 76 65 6c 3d 70 54 6f    for(pLevel=pTo
2b0b0 70 4c 65 76 65 6c 3b 20 70 4c 65 76 65 6c 3b 20  pLevel; pLevel; 
2b0c0 70 4c 65 76 65 6c 3d 70 4c 65 76 65 6c 2d 3e 70  pLevel=pLevel->p
2b0d0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
2b0e0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 73 6f  nt i;.        so
2b0f0 72 74 65 64 44 75 6d 70 53 65 67 6d 65 6e 74 28  rtedDumpSegment(
2b100 70 44 62 2c 20 26 70 4c 65 76 65 6c 2d 3e 6c 68  pDb, &pLevel->lh
2b110 73 2c 20 62 56 61 6c 73 29 3b 0a 20 20 20 20 20  s, bVals);.     
2b120 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
2b130 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3b 20 69 2b  evel->nRight; i+
2b140 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 6f  +){.          so
2b150 72 74 65 64 44 75 6d 70 53 65 67 6d 65 6e 74 28  rtedDumpSegment(
2b160 70 44 62 2c 20 26 70 4c 65 76 65 6c 2d 3e 61 52  pDb, &pLevel->aR
2b170 68 73 5b 69 5d 2c 20 62 56 61 6c 73 29 3b 0a 20  hs[i], bVals);. 
2b180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2b190 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6c 73  .    }.  }..  ls
2b1a0 6d 49 6e 66 6f 46 72 65 65 6c 69 73 74 28 70 44  mInfoFreelist(pD
2b1b0 62 2c 20 26 7a 46 72 65 65 29 3b 0a 20 20 6c 73  b, &zFree);.  ls
2b1c0 6d 4c 6f 67 4d 65 73 73 61 67 65 28 70 44 62 2c  mLogMessage(pDb,
2b1d0 20 4c 53 4d 5f 4f 4b 2c 20 22 46 72 65 65 6c 69   LSM_OK, "Freeli
2b1e0 73 74 3a 20 25 73 22 2c 20 7a 46 72 65 65 29 3b  st: %s", zFree);
2b1f0 0a 20 20 6c 73 6d 46 72 65 65 28 70 44 62 2d 3e  .  lsmFree(pDb->
2b200 70 45 6e 76 2c 20 7a 46 72 65 65 29 3b 0a 0a 20  pEnv, zFree);.. 
2b210 20 61 73 73 65 72 74 28 20 6c 73 6d 46 73 49 6e   assert( lsmFsIn
2b220 74 65 67 72 69 74 79 43 68 65 63 6b 28 70 44 62  tegrityCheck(pDb
2b230 29 20 29 3b 0a 7d 0a 0a 76 6f 69 64 20 6c 73 6d  ) );.}..void lsm
2b240 53 6f 72 74 65 64 46 72 65 65 4c 65 76 65 6c 28  SortedFreeLevel(
2b250 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 4c  lsm_env *pEnv, L
2b260 65 76 65 6c 20 2a 70 4c 65 76 65 6c 29 7b 0a 20  evel *pLevel){. 
2b270 20 4c 65 76 65 6c 20 2a 70 4e 65 78 74 3b 0a 20   Level *pNext;. 
2b280 20 4c 65 76 65 6c 20 2a 70 3b 0a 0a 20 20 66 6f   Level *p;..  fo
2b290 72 28 70 3d 70 4c 65 76 65 6c 3b 20 70 3b 20 70  r(p=pLevel; p; p
2b2a0 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
2b2b0 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
2b2c0 20 20 20 73 6f 72 74 65 64 46 72 65 65 4c 65 76     sortedFreeLev
2b2d0 65 6c 28 70 45 6e 76 2c 20 70 29 3b 0a 20 20 7d  el(pEnv, p);.  }
2b2e0 0a 7d 0a 0a 76 6f 69 64 20 6c 73 6d 53 6f 72 74  .}..void lsmSort
2b2f0 65 64 53 61 76 65 54 72 65 65 43 75 72 73 6f 72  edSaveTreeCursor
2b300 73 28 6c 73 6d 5f 64 62 20 2a 70 44 62 29 7b 0a  s(lsm_db *pDb){.
2b310 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70    MultiCursor *p
2b320 43 73 72 3b 0a 20 20 66 6f 72 28 70 43 73 72 3d  Csr;.  for(pCsr=
2b330 70 44 62 2d 3e 70 43 73 72 3b 20 70 43 73 72 3b  pDb->pCsr; pCsr;
2b340 20 70 43 73 72 3d 70 43 73 72 2d 3e 70 4e 65 78   pCsr=pCsr->pNex
2b350 74 29 7b 0a 20 20 20 20 6c 73 6d 54 72 65 65 43  t){.    lsmTreeC
2b360 75 72 73 6f 72 53 61 76 65 28 70 43 73 72 2d 3e  ursorSave(pCsr->
2b370 61 70 54 72 65 65 43 73 72 5b 30 5d 29 3b 0a 20  apTreeCsr[0]);. 
2b380 20 20 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72     lsmTreeCursor
2b390 53 61 76 65 28 70 43 73 72 2d 3e 61 70 54 72 65  Save(pCsr->apTre
2b3a0 65 43 73 72 5b 31 5d 29 3b 0a 20 20 7d 0a 7d 0a  eCsr[1]);.  }.}.
2b3b0 0a 76 6f 69 64 20 6c 73 6d 53 6f 72 74 65 64 45  .void lsmSortedE
2b3c0 78 70 61 6e 64 42 74 72 65 65 50 61 67 65 28 50  xpandBtreePage(P
2b3d0 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 4f  age *pPg, int nO
2b3e0 72 69 67 29 7b 0a 20 20 75 38 20 2a 61 44 61 74  rig){.  u8 *aDat
2b3f0 61 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a  a;.  int nData;.
2b400 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 0a 20 20    int nEntry;.  
2b410 69 6e 74 20 69 48 64 72 3b 0a 0a 20 20 61 44 61  int iHdr;..  aDa
2b420 74 61 20 3d 20 6c 73 6d 46 73 50 61 67 65 44 61  ta = lsmFsPageDa
2b430 74 61 28 70 50 67 2c 20 26 6e 44 61 74 61 29 3b  ta(pPg, &nData);
2b440 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 61 67 65  .  nEntry = page
2b450 47 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e  GetNRec(aData, n
2b460 4f 72 69 67 29 3b 0a 20 20 69 48 64 72 20 3d 20  Orig);.  iHdr = 
2b470 53 45 47 4d 45 4e 54 5f 45 4f 46 28 6e 4f 72 69  SEGMENT_EOF(nOri
2b480 67 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20 6d 65  g, nEntry);.  me
2b490 6d 6d 6f 76 65 28 26 61 44 61 74 61 5b 69 48 64  mmove(&aData[iHd
2b4a0 72 20 2b 20 28 6e 44 61 74 61 2d 6e 4f 72 69 67  r + (nData-nOrig
2b4b0 29 5d 2c 20 26 61 44 61 74 61 5b 69 48 64 72 5d  )], &aData[iHdr]
2b4c0 2c 20 6e 4f 72 69 67 2d 69 48 64 72 29 3b 0a 7d  , nOrig-iHdr);.}
2b4d0 0a 0a 23 69 66 64 65 66 20 4c 53 4d 5f 44 45 42  ..#ifdef LSM_DEB
2b4e0 55 47 5f 45 58 50 45 4e 53 49 56 45 0a 73 74 61  UG_EXPENSIVE.sta
2b4f0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 52  tic void assertR
2b500 75 6e 49 6e 4f 72 64 65 72 28 6c 73 6d 5f 64 62  unInOrder(lsm_db
2b510 20 2a 70 44 62 2c 20 53 65 67 6d 65 6e 74 20 2a   *pDb, Segment *
2b520 70 53 65 67 29 7b 0a 20 20 50 61 67 65 20 2a 70  pSeg){.  Page *p
2b530 50 67 20 3d 20 30 3b 0a 20 20 42 6c 6f 62 20 62  Pg = 0;.  Blob b
2b540 6c 6f 62 31 20 3d 20 7b 30 2c 20 30 2c 20 30 2c  lob1 = {0, 0, 0,
2b550 20 30 7d 3b 0a 20 20 42 6c 6f 62 20 62 6c 6f 62   0};.  Blob blob
2b560 32 20 3d 20 7b 30 2c 20 30 2c 20 30 2c 20 30 7d  2 = {0, 0, 0, 0}
2b570 3b 0a 0a 20 20 6c 73 6d 46 73 44 62 50 61 67 65  ;..  lsmFsDbPage
2b580 47 65 74 28 70 44 62 2d 3e 70 46 53 2c 20 70 53  Get(pDb->pFS, pS
2b590 65 67 2c 20 70 53 65 67 2d 3e 69 46 69 72 73 74  eg, pSeg->iFirst
2b5a0 2c 20 26 70 50 67 29 3b 0a 20 20 77 68 69 6c 65  , &pPg);.  while
2b5b0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 75 38 20  ( pPg ){.    u8 
2b5c0 2a 61 44 61 74 61 3b 20 69 6e 74 20 6e 44 61 74  *aData; int nDat
2b5d0 61 3b 0a 20 20 20 20 50 61 67 65 20 2a 70 4e 65  a;.    Page *pNe
2b5e0 78 74 3b 0a 0a 20 20 20 20 61 44 61 74 61 20 3d  xt;..    aData =
2b5f0 20 6c 73 6d 46 73 50 61 67 65 44 61 74 61 28 70   lsmFsPageData(p
2b600 50 67 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20  Pg, &nData);.   
2b610 20 69 66 28 20 30 3d 3d 28 70 61 67 65 47 65 74   if( 0==(pageGet
2b620 46 6c 61 67 73 28 61 44 61 74 61 2c 20 6e 44 61  Flags(aData, nDa
2b630 74 61 29 20 26 20 53 45 47 4d 45 4e 54 5f 42 54  ta) & SEGMENT_BT
2b640 52 45 45 5f 46 4c 41 47 29 20 29 7b 0a 20 20 20  REE_FLAG) ){.   
2b650 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2b660 69 6e 74 20 6e 52 65 63 20 3d 20 70 61 67 65 47  int nRec = pageG
2b670 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44  etNRec(aData, nD
2b680 61 74 61 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ata);.      for(
2b690 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
2b6a0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
2b6b0 54 6f 70 69 63 31 2c 20 69 54 6f 70 69 63 32 3b  Topic1, iTopic2;
2b6c0 0a 20 20 20 20 20 20 20 20 70 61 67 65 47 65 74  .        pageGet
2b6d0 4b 65 79 43 6f 70 79 28 70 44 62 2d 3e 70 45 6e  KeyCopy(pDb->pEn
2b6e0 76 2c 20 70 53 65 67 2c 20 70 50 67 2c 20 69 2c  v, pSeg, pPg, i,
2b6f0 20 26 69 54 6f 70 69 63 31 2c 20 26 62 6c 6f 62   &iTopic1, &blob
2b700 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  1);..        if(
2b710 20 69 3d 3d 30 20 26 26 20 62 6c 6f 62 32 2e 6e   i==0 && blob2.n
2b720 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
2b730 20 20 61 73 73 65 72 74 28 20 73 6f 72 74 65 64    assert( sorted
2b740 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 20 20  KeyCompare(.    
2b750 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d              pDb-
2b760 3e 78 43 6d 70 2c 20 69 54 6f 70 69 63 32 2c 20  >xCmp, iTopic2, 
2b770 62 6c 6f 62 32 2e 70 44 61 74 61 2c 20 62 6c 6f  blob2.pData, blo
2b780 62 32 2e 6e 44 61 74 61 2c 0a 20 20 20 20 20 20  b2.nData,.      
2b790 20 20 20 20 20 20 20 20 20 20 69 54 6f 70 69 63            iTopic
2b7a0 31 2c 20 62 6c 6f 62 31 2e 70 44 61 74 61 2c 20  1, blob1.pData, 
2b7b0 62 6c 6f 62 31 2e 6e 44 61 74 61 0a 20 20 20 20  blob1.nData.    
2b7c0 20 20 20 20 20 20 29 3c 30 20 29 3b 0a 20 20 20        )<0 );.   
2b7d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2b7e0 69 66 28 20 69 3c 28 6e 52 65 63 2d 31 29 20 29  if( i<(nRec-1) )
2b7f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
2b800 47 65 74 4b 65 79 43 6f 70 79 28 70 44 62 2d 3e  GetKeyCopy(pDb->
2b810 70 45 6e 76 2c 20 70 53 65 67 2c 20 70 50 67 2c  pEnv, pSeg, pPg,
2b820 20 69 2b 31 2c 20 26 69 54 6f 70 69 63 32 2c 20   i+1, &iTopic2, 
2b830 26 62 6c 6f 62 32 29 3b 0a 20 20 20 20 20 20 20  &blob2);.       
2b840 20 20 20 61 73 73 65 72 74 28 20 73 6f 72 74 65     assert( sorte
2b850 64 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 20  dKeyCompare(.   
2b860 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62               pDb
2b870 2d 3e 78 43 6d 70 2c 20 69 54 6f 70 69 63 31 2c  ->xCmp, iTopic1,
2b880 20 62 6c 6f 62 31 2e 70 44 61 74 61 2c 20 62 6c   blob1.pData, bl
2b890 6f 62 31 2e 6e 44 61 74 61 2c 0a 20 20 20 20 20  ob1.nData,.     
2b8a0 20 20 20 20 20 20 20 20 20 20 20 69 54 6f 70 69             iTopi
2b8b0 63 32 2c 20 62 6c 6f 62 32 2e 70 44 61 74 61 2c  c2, blob2.pData,
2b8c0 20 62 6c 6f 62 32 2e 6e 44 61 74 61 0a 20 20 20   blob2.nData.   
2b8d0 20 20 20 20 20 20 20 29 3c 30 20 29 3b 0a 20 20         )<0 );.  
2b8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2b8f0 20 20 20 20 7d 0a 0a 20 20 20 20 6c 73 6d 46 73      }..    lsmFs
2b900 44 62 50 61 67 65 4e 65 78 74 28 70 53 65 67 2c  DbPageNext(pSeg,
2b910 20 70 50 67 2c 20 31 2c 20 26 70 4e 65 78 74 29   pPg, 1, &pNext)
2b920 3b 0a 20 20 20 20 6c 73 6d 46 73 50 61 67 65 52  ;.    lsmFsPageR
2b930 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
2b940 20 70 50 67 20 3d 20 70 4e 65 78 74 3b 0a 20 20   pPg = pNext;.  
2b950 7d 0a 0a 20 20 73 6f 72 74 65 64 42 6c 6f 62 46  }..  sortedBlobF
2b960 72 65 65 28 26 62 6c 6f 62 31 29 3b 0a 20 20 73  ree(&blob1);.  s
2b970 6f 72 74 65 64 42 6c 6f 62 46 72 65 65 28 26 62  ortedBlobFree(&b
2b980 6c 6f 62 32 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  lob2);.}.#endif.
2b990 0a 23 69 66 64 65 66 20 4c 53 4d 5f 44 45 42 55  .#ifdef LSM_DEBU
2b9a0 47 5f 45 58 50 45 4e 53 49 56 45 0a 2f 2a 0a 2a  G_EXPENSIVE./*.*
2b9b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2b9c0 69 73 20 6f 6e 6c 79 20 69 6e 63 6c 75 64 65 64  is only included
2b9d0 20 69 6e 20 74 68 65 20 62 75 69 6c 64 20 69 66   in the build if
2b9e0 20 4c 53 4d 5f 44 45 42 55 47 5f 45 58 50 45 4e   LSM_DEBUG_EXPEN
2b9f0 53 49 56 45 20 69 73 20 0a 2a 2a 20 64 65 66 69  SIVE is .** defi
2ba00 6e 65 64 2e 20 49 74 73 20 6f 6e 6c 79 20 70 75  ned. Its only pu
2ba10 72 70 6f 73 65 20 69 73 20 74 6f 20 65 76 61 6c  rpose is to eval
2ba20 75 61 74 65 20 76 61 72 69 6f 75 73 20 61 73 73  uate various ass
2ba30 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
2ba40 20 74 6f 20 0a 2a 2a 20 76 65 72 69 66 79 20 74   to .** verify t
2ba50 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
2ba60 20 69 73 20 77 65 6c 6c 20 66 6f 72 6d 65 64 20   is well formed 
2ba70 69 6e 20 63 65 72 74 61 69 6e 20 72 65 73 70 65  in certain respe
2ba80 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  cts..**.** More 
2ba90 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  specifically, it
2baa0 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
2bab0 20 61 72 72 61 79 20 70 4f 6e 65 20 63 6f 6e 74   array pOne cont
2bac0 61 69 6e 73 20 74 68 65 20 72 65 71 75 69 72 65  ains the require
2bad0 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74  d .** pointers t
2bae0 6f 20 70 54 77 6f 2e 20 41 72 72 61 79 20 70 54  o pTwo. Array pT
2baf0 77 6f 20 6d 75 73 74 20 62 65 20 61 20 6d 61 69  wo must be a mai
2bb00 6e 20 61 72 72 61 79 2e 20 70 4f 6e 65 20 6d 61  n array. pOne ma
2bb10 79 20 62 65 20 65 69 74 68 65 72 20 61 20 0a 2a  y be either a .*
2bb20 2a 20 73 65 70 61 72 61 74 6f 72 73 20 61 72 72  * separators arr
2bb30 61 79 20 6f 72 20 61 6e 6f 74 68 65 72 20 6d 61  ay or another ma
2bb40 69 6e 20 61 72 72 61 79 2e 20 49 66 20 70 4f 6e  in array. If pOn
2bb50 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  e does not conta
2bb60 69 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65  in the .** corre
2bb70 63 74 20 73 65 74 20 6f 66 20 70 6f 69 6e 74 65  ct set of pointe
2bb80 72 73 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  rs, an assert() 
2bb90 73 74 61 74 65 6d 65 6e 74 20 66 61 69 6c 73 2e  statement fails.
2bba0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2bbb0 73 73 65 72 74 50 6f 69 6e 74 65 72 73 4f 6b 28  ssertPointersOk(
2bbc0 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20  .  lsm_db *pDb, 
2bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbe0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
2bbf0 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65  andle */.  Segme
2bc00 6e 74 20 2a 70 4f 6e 65 2c 20 20 20 20 20 20 20  nt *pOne,       
2bc10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2bc20 67 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  gment containing
2bc30 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0a 20 20 53   pointers */.  S
2bc40 65 67 6d 65 6e 74 20 2a 70 54 77 6f 2c 20 20 20  egment *pTwo,   
2bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bc60 2a 20 53 65 67 6d 65 6e 74 20 63 6f 6e 74 61 69  * Segment contai
2bc70 6e 69 6e 67 20 70 6f 69 6e 74 65 72 20 74 61 72  ning pointer tar
2bc80 67 65 74 73 20 2a 2f 0a 20 20 69 6e 74 20 62 52  gets */.  int bR
2bc90 68 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  hs              
2bca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2bcb0 65 20 69 66 20 70 54 77 6f 20 6d 61 79 20 68 61  e if pTwo may ha
2bcc0 76 65 20 62 65 65 6e 20 47 6f 62 62 6c 65 28 29  ve been Gobble()
2bcd0 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
2bce0 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20   = LSM_OK;      
2bcf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
2bd00 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 53 65 67  or code */.  Seg
2bd10 6d 65 6e 74 50 74 72 20 70 74 72 31 3b 20 20 20  mentPtr ptr1;   
2bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bd30 49 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  Iterates through
2bd40 20 70 4f 6e 65 20 2a 2f 0a 20 20 53 65 67 6d 65   pOne */.  Segme
2bd50 6e 74 50 74 72 20 70 74 72 32 3b 20 20 20 20 20  ntPtr ptr2;     
2bd60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2bd70 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 20 70  erates through p
2bd80 54 77 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  Two */.  Pgno iP
2bd90 72 65 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rev;..  assert( 
2bda0 70 4f 6e 65 20 26 26 20 70 54 77 6f 20 29 3b 0a  pOne && pTwo );.
2bdb0 0a 20 20 6d 65 6d 73 65 74 28 26 70 74 72 31 2c  .  memset(&ptr1,
2bdc0 20 30 2c 20 73 69 7a 65 6f 66 28 70 74 72 31 29   0, sizeof(ptr1)
2bdd0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 74 72  );.  memset(&ptr
2bde0 32 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 74 72  2, 0, sizeof(ptr
2bdf0 31 29 29 3b 0a 20 20 70 74 72 31 2e 70 53 65 67  1));.  ptr1.pSeg
2be00 20 3d 20 70 4f 6e 65 3b 0a 20 20 70 74 72 32 2e   = pOne;.  ptr2.
2be10 70 53 65 67 20 3d 20 70 54 77 6f 3b 0a 20 20 73  pSeg = pTwo;.  s
2be20 65 67 6d 65 6e 74 50 74 72 45 6e 64 50 61 67 65  egmentPtrEndPage
2be30 28 70 44 62 2d 3e 70 46 53 2c 20 26 70 74 72 31  (pDb->pFS, &ptr1
2be40 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 73 65 67  , 0, &rc);.  seg
2be50 6d 65 6e 74 50 74 72 45 6e 64 50 61 67 65 28 70  mentPtrEndPage(p
2be60 44 62 2d 3e 70 46 53 2c 20 26 70 74 72 32 2c 20  Db->pFS, &ptr2, 
2be70 30 2c 20 26 72 63 29 3b 0a 0a 20 20 2f 2a 20 43  0, &rc);..  /* C
2be80 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 66 6f  heck that the fo
2be90 6f 74 65 72 20 70 6f 69 6e 74 65 72 20 6f 66 20  oter pointer of 
2bea0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
2beb0 66 20 70 4f 6e 65 20 70 6f 69 6e 74 73 20 74 6f  f pOne points to
2bec0 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20  .  ** the first 
2bed0 70 61 67 65 20 6f 66 20 70 54 77 6f 2e 20 2a 2f  page of pTwo. */
2bee0 0a 20 20 69 50 72 65 76 20 3d 20 70 54 77 6f 2d  .  iPrev = pTwo-
2bef0 3e 69 46 69 72 73 74 3b 0a 20 20 69 66 28 20 70  >iFirst;.  if( p
2bf00 74 72 31 2e 69 50 74 72 21 3d 69 50 72 65 76 20  tr1.iPtr!=iPrev 
2bf10 26 26 20 21 62 52 68 73 20 29 7b 0a 20 20 20 20  && !bRhs ){.    
2bf20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d  assert( 0 );.  }
2bf30 0a 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f  ..  if( rc==LSM_
2bf40 4f 4b 20 26 26 20 70 74 72 31 2e 6e 43 65 6c 6c  OK && ptr1.nCell
2bf50 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  >0 ){.    rc = s
2bf60 65 67 6d 65 6e 74 50 74 72 4c 6f 61 64 43 65 6c  egmentPtrLoadCel
2bf70 6c 28 26 70 74 72 31 2c 20 30 29 3b 0a 20 20 7d  l(&ptr1, 0);.  }
2bf80 0a 20 20 20 20 20 20 0a 20 20 77 68 69 6c 65 28  .      .  while(
2bf90 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70   rc==LSM_OK && p
2bfa0 74 72 32 2e 70 50 67 20 29 7b 0a 20 20 20 20 50  tr2.pPg ){.    P
2bfb0 67 6e 6f 20 69 54 68 69 73 3b 0a 0a 20 20 20 20  gno iThis;..    
2bfc0 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  /* Advance to th
2bfd0 65 20 6e 65 78 74 20 70 61 67 65 20 6f 66 20 73  e next page of s
2bfe0 65 67 6d 65 6e 74 20 70 54 77 6f 20 74 68 61 74  egment pTwo that
2bff0 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
2c000 73 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 63 65  st.    ** one ce
2c010 6c 6c 2e 20 42 72 65 61 6b 20 6f 75 74 20 6f 66  ll. Break out of
2c020 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
2c030 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65   iterator reache
2c040 73 20 45 4f 46 2e 20 20 2a 2f 0a 20 20 20 20 64  s EOF.  */.    d
2c050 6f 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  o{.      rc = se
2c060 67 6d 65 6e 74 50 74 72 4e 65 78 74 50 61 67 65  gmentPtrNextPage
2c070 28 26 70 74 72 32 2c 20 31 29 3b 0a 20 20 20 20  (&ptr2, 1);.    
2c080 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 4c 53    assert( rc==LS
2c090 4d 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 77 68 69  M_OK );.    }whi
2c0a0 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26  le( rc==LSM_OK &
2c0b0 26 20 70 74 72 32 2e 70 50 67 20 26 26 20 70 74  & ptr2.pPg && pt
2c0c0 72 32 2e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  r2.nCell==0 );. 
2c0d0 20 20 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f     if( rc!=LSM_O
2c0e0 4b 20 7c 7c 20 70 74 72 32 2e 70 50 67 3d 3d 30  K || ptr2.pPg==0
2c0f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 54   ) break;.    iT
2c100 68 69 73 20 3d 20 6c 73 6d 46 73 50 61 67 65 4e  his = lsmFsPageN
2c110 75 6d 62 65 72 28 70 74 72 32 2e 70 50 67 29 3b  umber(ptr2.pPg);
2c120 0a 0a 20 20 20 20 69 66 28 20 28 70 74 72 32 2e  ..    if( (ptr2.
2c130 66 6c 61 67 73 20 26 20 28 50 47 46 54 52 5f 53  flags & (PGFTR_S
2c140 4b 49 50 5f 54 48 49 53 5f 46 4c 41 47 7c 53 45  KIP_THIS_FLAG|SE
2c150 47 4d 45 4e 54 5f 42 54 52 45 45 5f 46 4c 41 47  GMENT_BTREE_FLAG
2c160 29 29 3d 3d 30 20 29 7b 0a 0a 20 20 20 20 20 20  ))==0 ){..      
2c170 2f 2a 20 4c 6f 61 64 20 74 68 65 20 66 69 72 73  /* Load the firs
2c180 74 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72  t cell in the ar
2c190 72 61 79 20 70 54 77 6f 20 70 61 67 65 2e 20 2a  ray pTwo page. *
2c1a0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 67  /.      rc = seg
2c1b0 6d 65 6e 74 50 74 72 4c 6f 61 64 43 65 6c 6c 28  mentPtrLoadCell(
2c1c0 26 70 74 72 32 2c 20 30 29 3b 0a 0a 20 20 20 20  &ptr2, 0);..    
2c1d0 20 20 2f 2a 20 49 74 65 72 61 74 65 20 66 6f 72    /* Iterate for
2c1e0 77 61 72 64 73 20 74 68 72 6f 75 67 68 20 70 4f  wards through pO
2c1f0 6e 65 2c 20 73 65 61 72 63 68 69 6e 67 20 66 6f  ne, searching fo
2c200 72 20 61 20 6b 65 79 20 74 68 61 74 20 6d 61 74  r a key that mat
2c210 63 68 65 73 20 74 68 65 0a 20 20 20 20 20 20 2a  ches the.      *
2c220 2a 20 6b 65 79 20 70 74 72 32 2e 70 4b 65 79 2f  * key ptr2.pKey/
2c230 6e 4b 65 79 2e 20 54 68 69 73 20 6b 65 79 20 73  nKey. This key s
2c240 68 6f 75 6c 64 20 68 61 76 65 20 61 20 70 6f 69  hould have a poi
2c250 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
2c260 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 70   that.      ** p
2c270 74 72 32 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  tr2 currently po
2c280 69 6e 74 73 20 74 6f 2e 20 2a 2f 0a 20 20 20 20  ints to. */.    
2c290 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 4c 53 4d    while( rc==LSM
2c2a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
2c2b0 6e 74 20 72 65 73 20 3d 20 72 74 54 6f 70 69 63  nt res = rtTopic
2c2c0 28 70 74 72 31 2e 65 54 79 70 65 29 20 2d 20 72  (ptr1.eType) - r
2c2d0 74 54 6f 70 69 63 28 70 74 72 32 2e 65 54 79 70  tTopic(ptr2.eTyp
2c2e0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2c2f0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
2c300 20 20 20 20 72 65 73 20 3d 20 70 44 62 2d 3e 78      res = pDb->x
2c310 43 6d 70 28 70 74 72 31 2e 70 4b 65 79 2c 20 70  Cmp(ptr1.pKey, p
2c320 74 72 31 2e 6e 4b 65 79 2c 20 70 74 72 32 2e 70  tr1.nKey, ptr2.p
2c330 4b 65 79 2c 20 70 74 72 32 2e 6e 4b 65 79 29 3b  Key, ptr2.nKey);
2c340 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2c350 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
2c360 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2c370 74 28 20 62 52 68 73 20 7c 7c 20 70 74 72 31 2e  t( bRhs || ptr1.
2c380 69 50 74 72 2b 70 74 72 31 2e 69 50 67 50 74 72  iPtr+ptr1.iPgPtr
2c390 3d 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20  ==iPrev );.     
2c3a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
2c3b0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2c3c0 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20  assert( 0 );.   
2c3d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c3e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 74        assert( pt
2c3f0 72 31 2e 69 50 74 72 2b 70 74 72 31 2e 69 50 67  r1.iPtr+ptr1.iPg
2c400 50 74 72 3d 3d 69 54 68 69 73 20 29 3b 0a 20 20  Ptr==iThis );.  
2c410 20 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20          iPrev = 
2c420 69 54 68 69 73 3b 0a 20 20 20 20 20 20 20 20 20  iThis;.         
2c430 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2c440 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
2c450 73 65 67 6d 65 6e 74 50 74 72 41 64 76 61 6e 63  segmentPtrAdvanc
2c460 65 28 30 2c 20 26 70 74 72 31 2c 20 30 29 3b 0a  e(0, &ptr1, 0);.
2c470 20 20 20 20 20 20 20 20 69 66 28 20 70 74 72 31          if( ptr1
2c480 2e 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .pPg==0 ){.     
2c490 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
2c4a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c4b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2c4c0 20 73 65 67 6d 65 6e 74 50 74 72 52 65 73 65 74   segmentPtrReset
2c4d0 28 26 70 74 72 31 2c 20 30 29 3b 0a 20 20 73 65  (&ptr1, 0);.  se
2c4e0 67 6d 65 6e 74 50 74 72 52 65 73 65 74 28 26 70  gmentPtrReset(&p
2c4f0 74 72 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  tr2, 0);.  retur
2c500 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n LSM_OK;.}../*.
2c510 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2c520 20 69 73 20 6f 6e 6c 79 20 69 6e 63 6c 75 64 65   is only include
2c530 64 20 69 6e 20 74 68 65 20 62 75 69 6c 64 20 69  d in the build i
2c540 66 20 4c 53 4d 5f 44 45 42 55 47 5f 45 58 50 45  f LSM_DEBUG_EXPE
2c550 4e 53 49 56 45 20 69 73 20 0a 2a 2a 20 64 65 66  NSIVE is .** def
2c560 69 6e 65 64 2e 20 49 74 73 20 6f 6e 6c 79 20 70  ined. Its only p
2c570 75 72 70 6f 73 65 20 69 73 20 74 6f 20 65 76 61  urpose is to eva
2c580 6c 75 61 74 65 20 76 61 72 69 6f 75 73 20 61 73  luate various as
2c590 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
2c5a0 73 20 74 6f 20 0a 2a 2a 20 76 65 72 69 66 79 20  s to .** verify 
2c5b0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
2c5c0 65 20 69 73 20 77 65 6c 6c 20 66 6f 72 6d 65 64  e is well formed
2c5d0 20 69 6e 20 63 65 72 74 61 69 6e 20 72 65 73 70   in certain resp
2c5e0 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  ects..**.** More
2c5f0 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69   specifically, i
2c600 74 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68  t checks that th
2c610 65 20 62 2d 74 72 65 65 20 65 6d 62 65 64 64 65  e b-tree embedde
2c620 64 20 69 6e 20 61 72 72 61 79 20 70 52 75 6e 0a  d in array pRun.
2c630 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
2c640 63 6f 72 72 65 63 74 20 6b 65 79 73 2e 20 49 66  correct keys. If
2c650 20 6e 6f 74 2c 20 61 6e 20 61 73 73 65 72 74 28   not, an assert(
2c660 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  ) fails..*/.stat
2c670 69 63 20 69 6e 74 20 61 73 73 65 72 74 42 74 72  ic int assertBtr
2c680 65 65 4f 6b 28 0a 20 20 6c 73 6d 5f 64 62 20 2a  eeOk(.  lsm_db *
2c690 70 44 62 2c 0a 20 20 53 65 67 6d 65 6e 74 20 2a  pDb,.  Segment *
2c6a0 70 53 65 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63  pSeg.){.  int rc
2c6b0 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20   = LSM_OK;      
2c6c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2c6d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66  urn code */.  if
2c6e0 28 20 70 53 65 67 2d 3e 69 52 6f 6f 74 20 29 7b  ( pSeg->iRoot ){
2c6f0 0a 20 20 20 20 42 6c 6f 62 20 62 6c 6f 62 20 3d  .    Blob blob =
2c700 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 20 20 20 20   {0, 0, 0};     
2c710 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
2c720 64 20 74 6f 20 63 61 63 68 65 20 6f 76 65 72 66  d to cache overf
2c730 6c 6f 77 20 6b 65 79 73 20 2a 2f 0a 20 20 20 20  low keys */.    
2c740 46 69 6c 65 53 79 73 74 65 6d 20 2a 70 46 53 20  FileSystem *pFS 
2c750 3d 20 70 44 62 2d 3e 70 46 53 3b 20 20 20 2f 2a  = pDb->pFS;   /*
2c760 20 46 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   File system to 
2c770 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20  read from */.   
2c780 20 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 20   Page *pPg = 0; 
2c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c7a0 2a 20 4d 61 69 6e 20 72 75 6e 20 70 61 67 65 20  * Main run page 
2c7b0 2a 2f 0a 20 20 20 20 42 74 72 65 65 43 75 72 73  */.    BtreeCurs
2c7c0 6f 72 20 2a 70 43 73 72 20 3d 20 30 3b 20 20 20  or *pCsr = 0;   
2c7d0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
2c7e0 72 73 6f 72 20 2a 2f 0a 0a 20 20 20 20 72 63 20  rsor */..    rc 
2c7f0 3d 20 62 74 72 65 65 43 75 72 73 6f 72 4e 65 77  = btreeCursorNew
2c800 28 70 44 62 2c 20 70 53 65 67 2c 20 26 70 43 73  (pDb, pSeg, &pCs
2c810 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
2c820 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  LSM_OK ){.      
2c830 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
2c840 46 69 72 73 74 28 70 43 73 72 29 3b 0a 20 20 20  First(pCsr);.   
2c850 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c   }.    if( rc==L
2c860 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  SM_OK ){.      r
2c870 63 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65 47  c = lsmFsDbPageG
2c880 65 74 28 70 46 53 2c 20 70 53 65 67 2c 20 70 53  et(pFS, pSeg, pS
2c890 65 67 2d 3e 69 46 69 72 73 74 2c 20 26 70 50 67  eg->iFirst, &pPg
2c8a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68  );.    }..    wh
2c8b0 69 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20  ile( rc==LSM_OK 
2c8c0 29 7b 0a 20 20 20 20 20 20 50 61 67 65 20 2a 70  ){.      Page *p
2c8d0 4e 65 78 74 3b 0a 20 20 20 20 20 20 75 38 20 2a  Next;.      u8 *
2c8e0 61 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74  aData;.      int
2c8f0 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e   nData;.      in
2c900 74 20 66 6c 61 67 73 3b 0a 0a 20 20 20 20 20 20  t flags;..      
2c910 72 63 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65  rc = lsmFsDbPage
2c920 4e 65 78 74 28 70 53 65 67 2c 20 70 50 67 2c 20  Next(pSeg, pPg, 
2c930 31 2c 20 26 70 4e 65 78 74 29 3b 0a 20 20 20 20  1, &pNext);.    
2c940 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61    lsmFsPageRelea
2c950 73 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  se(pPg);.      p
2c960 50 67 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20  Pg = pNext;.    
2c970 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 62    if( pPg==0 ) b
2c980 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 44 61 74  reak;.      aDat
2c990 61 20 3d 20 66 73 50 61 67 65 44 61 74 61 28 70  a = fsPageData(p
2c9a0 50 67 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20  Pg, &nData);.   
2c9b0 20 20 20 66 6c 61 67 73 20 3d 20 70 61 67 65 47     flags = pageG
2c9c0 65 74 46 6c 61 67 73 28 61 44 61 74 61 2c 20 6e  etFlags(aData, n
2c9d0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  Data);.      if(
2c9e0 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 0a 20 20 20   rc==LSM_OK .   
2c9f0 20 20 20 20 26 26 20 30 3d 3d 28 28 53 45 47 4d      && 0==((SEGM
2ca00 45 4e 54 5f 42 54 52 45 45 5f 46 4c 41 47 7c 50  ENT_BTREE_FLAG|P
2ca10 47 46 54 52 5f 53 4b 49 50 5f 54 48 49 53 5f 46  GFTR_SKIP_THIS_F
2ca20 4c 41 47 29 20 26 20 66 6c 61 67 73 29 0a 20 20  LAG) & flags).  
2ca30 20 20 20 20 20 26 26 20 30 21 3d 70 61 67 65 47       && 0!=pageG
2ca40 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44  etNRec(aData, nD
2ca50 61 74 61 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ata).      ){.  
2ca60 20 20 20 20 20 20 75 38 20 2a 70 4b 65 79 3b 0a        u8 *pKey;.
2ca70 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79          int nKey
2ca80 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54  ;.        int iT
2ca90 6f 70 69 63 3b 0a 20 20 20 20 20 20 20 20 70 4b  opic;.        pK
2caa0 65 79 20 3d 20 70 61 67 65 47 65 74 4b 65 79 28  ey = pageGetKey(
2cab0 70 53 65 67 2c 20 70 50 67 2c 20 30 2c 20 26 69  pSeg, pPg, 0, &i
2cac0 54 6f 70 69 63 2c 20 26 6e 4b 65 79 2c 20 26 62  Topic, &nKey, &b
2cad0 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 61 73  lob);.        as
2cae0 73 65 72 74 28 20 6e 4b 65 79 3d 3d 70 43 73 72  sert( nKey==pCsr
2caf0 2d 3e 6e 4b 65 79 20 26 26 20 30 3d 3d 6d 65 6d  ->nKey && 0==mem
2cb00 63 6d 70 28 70 4b 65 79 2c 20 70 43 73 72 2d 3e  cmp(pKey, pCsr->
2cb10 70 4b 65 79 2c 20 6e 4b 65 79 29 20 29 3b 0a 20  pKey, nKey) );. 
2cb20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2cb30 73 6d 46 73 50 61 67 65 4e 75 6d 62 65 72 28 70  smFsPageNumber(p
2cb40 50 67 29 3d 3d 70 43 73 72 2d 3e 69 50 74 72 20  Pg)==pCsr->iPtr 
2cb50 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2cb60 62 74 72 65 65 43 75 72 73 6f 72 4e 65 78 74 28  btreeCursorNext(
2cb70 70 43 73 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pCsr);.      }. 
2cb80 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2cb90 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 70   rc!=LSM_OK || p
2cba0 43 73 72 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b 0a  Csr->pKey==0 );.
2cbb0 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 20 6c  .    if( pPg ) l
2cbc0 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65 28  smFsPageRelease(
2cbd0 70 50 67 29 3b 0a 0a 20 20 20 20 62 74 72 65 65  pPg);..    btree
2cbe0 43 75 72 73 6f 72 46 72 65 65 28 70 43 73 72 29  CursorFree(pCsr)
2cbf0 3b 0a 20 20 20 20 73 6f 72 74 65 64 42 6c 6f 62  ;.    sortedBlob
2cc00 46 72 65 65 28 26 62 6c 6f 62 29 3b 0a 20 20 7d  Free(&blob);.  }
2cc10 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2cc20 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
2cc30 20 4c 53 4d 5f 44 45 42 55 47 5f 45 58 50 45 4e   LSM_DEBUG_EXPEN
2cc40 53 49 56 45 20 2a 2f 0a                          SIVE */.