/ Hex Artifact Content
Login

Artifact a04518dfbfff0171fafb152a46e9fe9f45e1edbf3570e4533dd58ddb6567f0c9:


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 32 3b 0a 20 20 20 20 20 20 20 20 72 63 20  Pg2;.        rc 
65c0: 3d 20 6c 73 6d 46 73 44 62 50 61 67 65 47 65 74  = lsmFsDbPageGet
65d0: 28 70 43 73 72 2d 3e 70 46 53 2c 20 70 53 65 67  (pCsr->pFS, pSeg
65e0: 2c 20 69 4c 6f 61 64 2c 20 26 70 50 67 32 29 3b  , iLoad, &pPg2);
65f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6600: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 70   rc==LSM_OK || p
6610: 50 67 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Pg2==0 );.      
6620: 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b    if( rc==LSM_OK
6630: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
6640: 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20   *aData;        
6650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
6660: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  fer containing p
6670: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  age data */.    
6680: 20 20 20 20 20 20 69 6e 74 20 6e 44 61 74 61 3b        int nData;
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 44 61    /* Size of aDa
66b0: 74 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f  ta[] in bytes */
66c0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
66d0: 4d 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Min;.          i
66e0: 6e 74 20 69 4d 61 78 3b 0a 20 20 20 20 20 20 20  nt iMax;.       
66f0: 20 20 20 69 6e 74 20 69 43 65 6c 6c 32 3b 0a 0a     int iCell2;..
6700: 20 20 20 20 20 20 20 20 20 20 61 44 61 74 61 20            aData 
6710: 3d 20 66 73 50 61 67 65 44 61 74 61 28 70 50 67  = fsPageData(pPg
6720: 32 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20  2, &nData);.    
6730: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
6740: 61 67 65 47 65 74 46 6c 61 67 73 28 61 44 61 74  ageGetFlags(aDat
6750: 61 2c 20 6e 44 61 74 61 29 20 26 20 53 45 47 4d  a, nData) & SEGM
6760: 45 4e 54 5f 42 54 52 45 45 5f 46 4c 41 47 29 20  ENT_BTREE_FLAG) 
6770: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 4c  );..          iL
6780: 6f 61 64 20 3d 20 28 69 6e 74 29 70 61 67 65 47  oad = (int)pageG
6790: 65 74 50 74 72 28 61 44 61 74 61 2c 20 6e 44 61  etPtr(aData, nDa
67a0: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ta);.          i
67b0: 43 65 6c 6c 32 20 3d 20 70 61 67 65 47 65 74 4e  Cell2 = pageGetN
67c0: 52 65 63 28 61 44 61 74 61 2c 20 6e 44 61 74 61  Rec(aData, nData
67d0: 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20 69 4d  ); .          iM
67e0: 61 78 20 3d 20 69 43 65 6c 6c 32 2d 31 3b 0a 20  ax = iCell2-1;. 
67f0: 20 20 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20           iMin = 
6800: 30 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 77 68  0;..          wh
6810: 69 6c 65 28 20 69 4d 61 78 3e 3d 69 4d 69 6e 20  ile( iMax>=iMin 
6820: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
6830: 6e 74 20 69 54 72 79 20 3d 20 28 69 4d 69 6e 2b  nt iTry = (iMin+
6840: 69 4d 61 78 29 2f 32 3b 0a 20 20 20 20 20 20 20  iMax)/2;.       
6850: 20 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b       void *pKey;
6860: 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20   int nKey;      
6870: 20 20 20 2f 2a 20 4b 65 79 20 66 6f 72 20 63 65     /* Key for ce
6880: 6c 6c 20 69 54 72 79 20 2a 2f 0a 20 20 20 20 20  ll iTry */.     
6890: 20 20 20 20 20 20 20 69 6e 74 20 69 54 6f 70 69         int iTopi
68a0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
68b0: 20 20 20 20 20 2f 2a 20 54 6f 70 69 63 20 66 6f       /* Topic fo
68c0: 72 20 6b 65 79 20 70 4b 65 79 54 2f 6e 4b 65 79  r key pKeyT/nKey
68d0: 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  T */.           
68e0: 20 50 67 6e 6f 20 69 50 74 72 3b 20 20 20 20 20   Pgno iPtr;     
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6900: 2a 20 50 6f 69 6e 74 65 72 20 66 6f 72 20 63 65  * Pointer for ce
6910: 6c 6c 20 69 54 72 79 20 2a 2f 0a 20 20 20 20 20  ll iTry */.     
6920: 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 20         int res; 
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 20 20 20 2f 2a 20 28 70 53 65 65 6b 20 2d       /* (pSeek -
6950: 20 70 4b 65 79 54 29 20 2a 2f 0a 0a 20 20 20 20   pKeyT) */..    
6960: 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
6970: 65 47 65 74 42 74 72 65 65 4b 65 79 28 0a 20 20  eGetBtreeKey(.  
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
6990: 65 67 2c 20 70 50 67 32 2c 20 69 54 72 79 2c 20  eg, pPg2, iTry, 
69a0: 26 69 50 74 72 2c 20 26 69 54 6f 70 69 63 2c 20  &iPtr, &iTopic, 
69b0: 26 70 4b 65 79 2c 20 26 6e 4b 65 79 2c 20 26 62  &pKey, &nKey, &b
69c0: 6c 6f 62 0a 20 20 20 20 20 20 20 20 20 20 20 20  lob.            
69d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
69e0: 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20  f( rc!=LSM_OK ) 
69f0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20  break;..        
6a00: 20 20 20 20 72 65 73 20 3d 20 73 6f 72 74 65 64      res = sorted
6a10: 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 20 20  KeyCompare(.    
6a20: 20 20 20 20 20 20 20 20 20 20 20 20 78 43 6d 70              xCmp
6a30: 2c 20 69 54 6f 70 69 63 53 65 65 6b 2c 20 70 53  , iTopicSeek, pS
6a40: 65 65 6b 2c 20 6e 53 65 65 6b 2c 20 69 54 6f 70  eek, nSeek, iTop
6a50: 69 63 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 0a 20  ic, pKey, nKey. 
6a60: 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
6a70: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
6a80: 28 20 72 65 73 21 3d 30 20 29 3b 0a 0a 20 20 20  ( res!=0 );..   
6a90: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73           if( res
6aa0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
6ab0: 20 20 20 20 69 4c 6f 61 64 20 3d 20 28 69 6e 74      iLoad = (int
6ac0: 29 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 20  )iPtr;.         
6ad0: 20 20 20 20 20 69 43 65 6c 6c 32 20 3d 20 69 54       iCell2 = iT
6ae0: 72 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ry;.            
6af0: 20 20 69 4d 61 78 20 3d 20 69 54 72 79 2d 31 3b    iMax = iTry-1;
6b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
6b10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
6b20: 20 20 69 4d 69 6e 20 3d 20 69 54 72 79 2b 31 3b    iMin = iTry+1;
6b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6b40: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
6b50: 20 20 20 20 20 20 70 43 73 72 2d 3e 61 50 67 5b        pCsr->aPg[
6b60: 69 50 67 5d 2e 70 50 61 67 65 20 3d 20 70 50 67  iPg].pPage = pPg
6b70: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 73  2;.          pCs
6b80: 72 2d 3e 61 50 67 5b 69 50 67 5d 2e 69 43 65 6c  r->aPg[iPg].iCel
6b90: 6c 20 3d 20 69 43 65 6c 6c 32 3b 0a 20 20 20 20  l = iCell2;.    
6ba0: 20 20 20 20 20 20 69 50 67 2b 2b 3b 0a 20 20 20        iPg++;.   
6bb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
6bc0: 50 67 21 3d 6e 44 65 70 74 68 2d 31 20 0a 20 20  Pg!=nDepth-1 .  
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
6be0: 6c 73 6d 46 73 52 65 64 69 72 65 63 74 50 61 67  lsmFsRedirectPag
6bf0: 65 28 70 43 73 72 2d 3e 70 46 53 2c 20 70 53 65  e(pCsr->pFS, pSe
6c00: 67 2d 3e 70 52 65 64 69 72 65 63 74 2c 20 69 4c  g->pRedirect, iL
6c10: 6f 61 64 29 3d 3d 69 4c 65 61 66 0a 20 20 20 20  oad)==iLeaf.    
6c20: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
6c30: 20 7d 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28   }.      }while(
6c40: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 69   rc==LSM_OK && i
6c50: 50 67 3c 28 6e 44 65 70 74 68 2d 31 29 20 29 3b  Pg<(nDepth-1) );
6c60: 0a 20 20 20 20 20 20 73 6f 72 74 65 64 42 6c 6f  .      sortedBlo
6c70: 62 46 72 65 65 28 26 62 6c 6f 62 29 3b 0a 20 20  bFree(&blob);.  
6c80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64    }..    /* Load
6c90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6b 65 79   the current key
6ca0: 20 61 6e 64 20 70 6f 69 6e 74 65 72 20 2a 2f 0a   and pointer */.
6cb0: 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f      if( rc==LSM_
6cc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65  OK ){.      Btre
6cd0: 65 50 67 20 2a 70 42 74 72 65 65 50 67 3b 0a 20  ePg *pBtreePg;. 
6ce0: 20 20 20 20 20 75 38 20 2a 61 44 61 74 61 3b 0a       u8 *aData;.
6cf0: 20 20 20 20 20 20 69 6e 74 20 6e 44 61 74 61 3b        int nData;
6d00: 0a 0a 20 20 20 20 20 20 70 42 74 72 65 65 50 67  ..      pBtreePg
6d10: 20 3d 20 26 70 43 73 72 2d 3e 61 50 67 5b 70 43   = &pCsr->aPg[pC
6d20: 73 72 2d 3e 69 50 67 5d 3b 0a 20 20 20 20 20 20  sr->iPg];.      
6d30: 61 44 61 74 61 20 3d 20 66 73 50 61 67 65 44 61  aData = fsPageDa
6d40: 74 61 28 70 42 74 72 65 65 50 67 2d 3e 70 50 61  ta(pBtreePg->pPa
6d50: 67 65 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20  ge, &nData);.   
6d60: 20 20 20 70 43 73 72 2d 3e 69 50 74 72 20 3d 20     pCsr->iPtr = 
6d70: 62 74 72 65 65 43 75 72 73 6f 72 50 74 72 28 61  btreeCursorPtr(a
6d80: 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 70 42 74  Data, nData, pBt
6d90: 72 65 65 50 67 2d 3e 69 43 65 6c 6c 2b 31 29 3b  reePg->iCell+1);
6da0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 72 65  .      if( pBtre
6db0: 65 50 67 2d 3e 69 43 65 6c 6c 3c 30 20 29 7b 0a  ePg->iCell<0 ){.
6dc0: 20 20 20 20 20 20 20 20 50 67 6e 6f 20 64 75 6d          Pgno dum
6dd0: 6d 79 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  my;.        int 
6de0: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
6df0: 3d 70 43 73 72 2d 3e 69 50 67 2d 31 3b 20 69 3e  =pCsr->iPg-1; i>
6e00: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
6e10: 20 20 20 20 69 66 28 20 70 43 73 72 2d 3e 61 50      if( pCsr->aP
6e20: 67 5b 69 5d 2e 69 43 65 6c 6c 3e 30 20 29 20 62  g[i].iCell>0 ) b
6e30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6e40: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6e50: 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  i>=0 );.        
6e60: 72 63 20 3d 20 70 61 67 65 47 65 74 42 74 72 65  rc = pageGetBtre
6e70: 65 4b 65 79 28 70 53 65 67 2c 0a 20 20 20 20 20  eKey(pSeg,.     
6e80: 20 20 20 20 20 20 20 70 43 73 72 2d 3e 61 50 67         pCsr->aPg
6e90: 5b 69 5d 2e 70 50 61 67 65 2c 20 70 43 73 72 2d  [i].pPage, pCsr-
6ea0: 3e 61 50 67 5b 69 5d 2e 69 43 65 6c 6c 2d 31 2c  >aPg[i].iCell-1,
6eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 64 75  .            &du
6ec0: 6d 6d 79 2c 20 26 70 43 73 72 2d 3e 65 54 79 70  mmy, &pCsr->eTyp
6ed0: 65 2c 20 26 70 43 73 72 2d 3e 70 4b 65 79 2c 20  e, &pCsr->pKey, 
6ee0: 26 70 43 73 72 2d 3e 6e 4b 65 79 2c 20 26 70 43  &pCsr->nKey, &pC
6ef0: 73 72 2d 3e 62 6c 6f 62 0a 20 20 20 20 20 20 20  sr->blob.       
6f00: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72   );.        pCsr
6f10: 2d 3e 65 54 79 70 65 20 7c 3d 20 4c 53 4d 5f 53  ->eType |= LSM_S
6f20: 45 50 41 52 41 54 4f 52 3b 0a 0a 20 20 20 20 20  EPARATOR;..     
6f30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6f40: 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
6f50: 4c 6f 61 64 4b 65 79 28 70 43 73 72 29 3b 0a 20  LoadKey(pCsr);. 
6f60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6f70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6f80: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
6f90: 65 43 75 72 73 6f 72 4e 65 77 28 0a 20 20 6c 73  eCursorNew(.  ls
6fa0: 6d 5f 64 62 20 2a 70 44 62 2c 0a 20 20 53 65 67  m_db *pDb,.  Seg
6fb0: 6d 65 6e 74 20 2a 70 53 65 67 2c 0a 20 20 42 74  ment *pSeg,.  Bt
6fc0: 72 65 65 43 75 72 73 6f 72 20 2a 2a 70 70 43 73  reeCursor **ppCs
6fd0: 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  r.){.  int rc = 
6fe0: 4c 53 4d 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 43  LSM_OK;.  BtreeC
6ff0: 75 72 73 6f 72 20 2a 70 43 73 72 3b 0a 20 20 0a  ursor *pCsr;.  .
7000: 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e    assert( pSeg->
7010: 69 52 6f 6f 74 20 29 3b 0a 20 20 70 43 73 72 20  iRoot );.  pCsr 
7020: 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52  = lsmMallocZeroR
7030: 63 28 70 44 62 2d 3e 70 45 6e 76 2c 20 73 69 7a  c(pDb->pEnv, siz
7040: 65 6f 66 28 42 74 72 65 65 43 75 72 73 6f 72 29  eof(BtreeCursor)
7050: 2c 20 26 72 63 29 3b 0a 20 20 69 66 28 20 70 43  , &rc);.  if( pC
7060: 73 72 20 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e  sr ){.    pCsr->
7070: 70 46 53 20 3d 20 70 44 62 2d 3e 70 46 53 3b 0a  pFS = pDb->pFS;.
7080: 20 20 20 20 70 43 73 72 2d 3e 70 53 65 67 20 3d      pCsr->pSeg =
7090: 20 70 53 65 67 3b 0a 20 20 20 20 70 43 73 72 2d   pSeg;.    pCsr-
70a0: 3e 69 50 67 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  >iPg = -1;.  }..
70b0: 20 20 2a 70 70 43 73 72 20 3d 20 70 43 73 72 3b    *ppCsr = pCsr;
70c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
70d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 67  .static void seg
70e0: 6d 65 6e 74 50 74 72 53 65 74 50 61 67 65 28 53  mentPtrSetPage(S
70f0: 65 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 2c  egmentPtr *pPtr,
7100: 20 50 61 67 65 20 2a 70 4e 65 78 74 29 7b 0a 20   Page *pNext){. 
7110: 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73   lsmFsPageReleas
7120: 65 28 70 50 74 72 2d 3e 70 50 67 29 3b 0a 20 20  e(pPtr->pPg);.  
7130: 69 66 28 20 70 4e 65 78 74 20 29 7b 0a 20 20 20  if( pNext ){.   
7140: 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 20 20   int nData;.    
7150: 75 38 20 2a 61 44 61 74 61 20 3d 20 66 73 50 61  u8 *aData = fsPa
7160: 67 65 44 61 74 61 28 70 4e 65 78 74 2c 20 26 6e  geData(pNext, &n
7170: 44 61 74 61 29 3b 0a 20 20 20 20 70 50 74 72 2d  Data);.    pPtr-
7180: 3e 6e 43 65 6c 6c 20 3d 20 70 61 67 65 47 65 74  >nCell = pageGet
7190: 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44 61 74  NRec(aData, nDat
71a0: 61 29 3b 0a 20 20 20 20 70 50 74 72 2d 3e 66 6c  a);.    pPtr->fl
71b0: 61 67 73 20 3d 20 28 75 31 36 29 70 61 67 65 47  ags = (u16)pageG
71c0: 65 74 46 6c 61 67 73 28 61 44 61 74 61 2c 20 6e  etFlags(aData, n
71d0: 44 61 74 61 29 3b 0a 20 20 20 20 70 50 74 72 2d  Data);.    pPtr-
71e0: 3e 69 50 74 72 20 3d 20 70 61 67 65 47 65 74 50  >iPtr = pageGetP
71f0: 74 72 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29  tr(aData, nData)
7200: 3b 0a 20 20 7d 0a 20 20 70 50 74 72 2d 3e 70 50  ;.  }.  pPtr->pP
7210: 67 20 3d 20 70 4e 65 78 74 3b 0a 7d 0a 0a 2f 2a  g = pNext;.}../*
7220: 0a 2a 2a 20 4c 6f 61 64 20 61 20 6e 65 77 20 70  .** Load a new p
7230: 61 67 65 20 69 6e 74 6f 20 74 68 65 20 53 65 67  age into the Seg
7240: 6d 65 6e 74 50 74 72 20 6f 62 6a 65 63 74 20 70  mentPtr object p
7250: 50 74 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Ptr..*/.static i
7260: 6e 74 20 73 65 67 6d 65 6e 74 50 74 72 4c 6f 61  nt segmentPtrLoa
7270: 64 50 61 67 65 28 0a 20 20 46 69 6c 65 53 79 73  dPage(.  FileSys
7280: 74 65 6d 20 2a 70 46 53 2c 0a 20 20 53 65 67 6d  tem *pFS,.  Segm
7290: 65 6e 74 50 74 72 20 2a 70 50 74 72 2c 20 20 20  entPtr *pPtr,   
72a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
72b0: 61 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68 69  ad page into thi
72c0: 73 20 53 65 67 6d 65 6e 74 50 74 72 20 6f 62 6a  s SegmentPtr obj
72d0: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  ect */.  int iNe
72e0: 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
72f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
7300: 6e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 70 61  number of new pa
7310: 67 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 20  ge */.){.  Page 
7320: 2a 70 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  *pPg = 0;       
7330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7340: 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 69   new page */.  i
7350: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7370: 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
7380: 0a 20 20 72 63 20 3d 20 6c 73 6d 46 73 44 62 50  .  rc = lsmFsDbP
7390: 61 67 65 47 65 74 28 70 46 53 2c 20 70 50 74 72  ageGet(pFS, pPtr
73a0: 2d 3e 70 53 65 67 2c 20 69 4e 65 77 2c 20 26 70  ->pSeg, iNew, &p
73b0: 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  Pg);.  assert( r
73c0: 63 3d 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 70 50 67  c==LSM_OK || pPg
73d0: 3d 3d 30 20 29 3b 0a 20 20 73 65 67 6d 65 6e 74  ==0 );.  segment
73e0: 50 74 72 53 65 74 50 61 67 65 28 70 50 74 72 2c  PtrSetPage(pPtr,
73f0: 20 70 50 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e   pPg);..  return
7400: 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
7410: 6e 74 20 73 65 67 6d 65 6e 74 50 74 72 52 65 61  nt segmentPtrRea
7420: 64 44 61 74 61 28 0a 20 20 53 65 67 6d 65 6e 74  dData(.  Segment
7430: 50 74 72 20 2a 70 50 74 72 2c 0a 20 20 69 6e 74  Ptr *pPtr,.  int
7440: 20 69 4f 66 66 2c 0a 20 20 69 6e 74 20 6e 42 79   iOff,.  int nBy
7450: 74 65 2c 0a 20 20 76 6f 69 64 20 2a 2a 70 70 44  te,.  void **ppD
7460: 61 74 61 2c 0a 20 20 42 6c 6f 62 20 2a 70 42 6c  ata,.  Blob *pBl
7470: 6f 62 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ob.){.  return s
7480: 6f 72 74 65 64 52 65 61 64 44 61 74 61 28 70 50  ortedReadData(pP
7490: 74 72 2d 3e 70 53 65 67 2c 20 70 50 74 72 2d 3e  tr->pSeg, pPtr->
74a0: 70 50 67 2c 20 69 4f 66 66 2c 20 6e 42 79 74 65  pPg, iOff, nByte
74b0: 2c 20 70 70 44 61 74 61 2c 20 70 42 6c 6f 62 29  , ppData, pBlob)
74c0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
74d0: 73 65 67 6d 65 6e 74 50 74 72 4e 65 78 74 50 61  segmentPtrNextPa
74e0: 67 65 28 0a 20 20 53 65 67 6d 65 6e 74 50 74 72  ge(.  SegmentPtr
74f0: 20 2a 70 50 74 72 2c 20 20 20 20 20 20 20 20 20   *pPtr,         
7500: 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 70 61 67       /* Load pag
7510: 65 20 69 6e 74 6f 20 74 68 69 73 20 53 65 67 6d  e into this Segm
7520: 65 6e 74 50 74 72 20 6f 62 6a 65 63 74 20 2a 2f  entPtr object */
7530: 0a 20 20 69 6e 74 20 65 44 69 72 20 20 20 20 20  .  int eDir     
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7550: 20 20 2f 2a 20 2b 31 20 66 6f 72 20 6e 65 78 74    /* +1 for next
7560: 28 29 2c 20 2d 31 20 66 6f 72 20 70 72 65 76 28  (), -1 for prev(
7570: 29 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 20 2a  ) */.){.  Page *
7580: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
7590: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
75a0: 70 61 67 65 20 74 6f 20 6c 6f 61 64 20 2a 2f 0a  page to load */.
75b0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75d0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
75e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 65 44  */..  assert( eD
75f0: 69 72 3d 3d 31 20 7c 7c 20 65 44 69 72 3d 3d 2d  ir==1 || eDir==-
7600: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
7610: 50 74 72 2d 3e 70 50 67 20 29 3b 0a 20 20 61 73  Ptr->pPg );.  as
7620: 73 65 72 74 28 20 70 50 74 72 2d 3e 70 53 65 67  sert( pPtr->pSeg
7630: 20 7c 7c 20 65 44 69 72 3e 30 20 29 3b 0a 0a 20   || eDir>0 );.. 
7640: 20 72 63 20 3d 20 6c 73 6d 46 73 44 62 50 61 67   rc = lsmFsDbPag
7650: 65 4e 65 78 74 28 70 50 74 72 2d 3e 70 53 65 67  eNext(pPtr->pSeg
7660: 2c 20 70 50 74 72 2d 3e 70 50 67 2c 20 65 44 69  , pPtr->pPg, eDi
7670: 72 2c 20 26 70 4e 65 78 74 29 3b 0a 20 20 61 73  r, &pNext);.  as
7680: 73 65 72 74 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  sert( rc==LSM_OK
7690: 20 7c 7c 20 70 4e 65 78 74 3d 3d 30 20 29 3b 0a   || pNext==0 );.
76a0: 20 20 73 65 67 6d 65 6e 74 50 74 72 53 65 74 50    segmentPtrSetP
76b0: 61 67 65 28 70 50 74 72 2c 20 70 4e 65 78 74 29  age(pPtr, pNext)
76c0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
76d0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 67  ..static int seg
76e0: 6d 65 6e 74 50 74 72 4c 6f 61 64 43 65 6c 6c 28  mentPtrLoadCell(
76f0: 0a 20 20 53 65 67 6d 65 6e 74 50 74 72 20 2a 70  .  SegmentPtr *p
7700: 50 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ptr,            
7710: 20 20 2f 2a 20 4c 6f 61 64 20 70 61 67 65 20 69    /* Load page i
7720: 6e 74 6f 20 74 68 69 73 20 53 65 67 6d 65 6e 74  nto this Segment
7730: 50 74 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  Ptr object */.  
7740: 69 6e 74 20 69 4e 65 77 20 20 20 20 20 20 20 20  int iNew        
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 43 65 6c 6c 20 6e 75 6d 62 65 72 20 6f 66  * Cell number of
7770: 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a   new cell */.){.
7780: 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f    int rc = LSM_O
7790: 4b 3b 0a 20 20 69 66 28 20 70 50 74 72 2d 3e 70  K;.  if( pPtr->p
77a0: 50 67 20 29 7b 0a 20 20 20 20 75 38 20 2a 61 44  Pg ){.    u8 *aD
77b0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
77d0: 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20  er to page data 
77e0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 69 6e  buffer */.    in
77f0: 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20  t iOff;         
7800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
7810: 66 66 73 65 74 20 69 6e 20 61 44 61 74 61 5b 5d  ffset in aData[]
7820: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
7830: 0a 20 20 20 20 69 6e 74 20 6e 50 67 73 7a 3b 20  .    int nPgsz; 
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7850: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 61     /* Size of pa
7860: 67 65 20 28 61 44 61 74 61 5b 5d 29 20 69 6e 20  ge (aData[]) in 
7870: 62 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20 61 73  bytes */..    as
7880: 73 65 72 74 28 20 69 4e 65 77 3c 70 50 74 72 2d  sert( iNew<pPtr-
7890: 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50  >nCell );.    pP
78a0: 74 72 2d 3e 69 43 65 6c 6c 20 3d 20 69 4e 65 77  tr->iCell = iNew
78b0: 3b 0a 20 20 20 20 61 44 61 74 61 20 3d 20 66 73  ;.    aData = fs
78c0: 50 61 67 65 44 61 74 61 28 70 50 74 72 2d 3e 70  PageData(pPtr->p
78d0: 50 67 2c 20 26 6e 50 67 73 7a 29 3b 0a 20 20 20  Pg, &nPgsz);.   
78e0: 20 69 4f 66 66 20 3d 20 6c 73 6d 47 65 74 55 31   iOff = lsmGetU1
78f0: 36 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54  6(&aData[SEGMENT
7900: 5f 43 45 4c 4c 50 54 52 5f 4f 46 46 53 45 54 28  _CELLPTR_OFFSET(
7910: 6e 50 67 73 7a 2c 20 70 50 74 72 2d 3e 69 43 65  nPgsz, pPtr->iCe
7920: 6c 6c 29 5d 29 3b 0a 20 20 20 20 70 50 74 72 2d  ll)]);.    pPtr-
7930: 3e 65 54 79 70 65 20 3d 20 61 44 61 74 61 5b 69  >eType = aData[i
7940: 4f 66 66 5d 3b 0a 20 20 20 20 69 4f 66 66 2b 2b  Off];.    iOff++
7950: 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 47 45  ;.    iOff += GE
7960: 54 56 41 52 49 4e 54 36 34 28 26 61 44 61 74 61  TVARINT64(&aData
7970: 5b 69 4f 66 66 5d 2c 20 70 50 74 72 2d 3e 69 50  [iOff], pPtr->iP
7980: 67 50 74 72 29 3b 0a 20 20 20 20 69 4f 66 66 20  gPtr);.    iOff 
7990: 2b 3d 20 47 45 54 56 41 52 49 4e 54 33 32 28 26  += GETVARINT32(&
79a0: 61 44 61 74 61 5b 69 4f 66 66 5d 2c 20 70 50 74  aData[iOff], pPt
79b0: 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66  r->nKey);.    if
79c0: 28 20 72 74 49 73 57 72 69 74 65 28 70 50 74 72  ( rtIsWrite(pPtr
79d0: 2d 3e 65 54 79 70 65 29 20 29 7b 0a 20 20 20 20  ->eType) ){.    
79e0: 20 20 69 4f 66 66 20 2b 3d 20 47 45 54 56 41 52    iOff += GETVAR
79f0: 49 4e 54 33 32 28 26 61 44 61 74 61 5b 69 4f 66  INT32(&aData[iOf
7a00: 66 5d 2c 20 70 50 74 72 2d 3e 6e 56 61 6c 29 3b  f], pPtr->nVal);
7a10: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
7a20: 74 28 20 70 50 74 72 2d 3e 6e 4b 65 79 3e 3d 30  t( pPtr->nKey>=0
7a30: 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 65   );..    rc = se
7a40: 67 6d 65 6e 74 50 74 72 52 65 61 64 44 61 74 61  gmentPtrReadData
7a50: 28 0a 20 20 20 20 20 20 20 20 70 50 74 72 2c 20  (.        pPtr, 
7a60: 69 4f 66 66 2c 20 70 50 74 72 2d 3e 6e 4b 65 79  iOff, pPtr->nKey
7a70: 2c 20 26 70 50 74 72 2d 3e 70 4b 65 79 2c 20 26  , &pPtr->pKey, &
7a80: 70 50 74 72 2d 3e 62 6c 6f 62 31 0a 20 20 20 20  pPtr->blob1.    
7a90: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c  );.    if( rc==L
7aa0: 53 4d 5f 4f 4b 20 26 26 20 72 74 49 73 57 72 69  SM_OK && rtIsWri
7ab0: 74 65 28 70 50 74 72 2d 3e 65 54 79 70 65 29 20  te(pPtr->eType) 
7ac0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  ){.      rc = se
7ad0: 67 6d 65 6e 74 50 74 72 52 65 61 64 44 61 74 61  gmentPtrReadData
7ae0: 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 74 72  (.          pPtr
7af0: 2c 20 69 4f 66 66 2b 70 50 74 72 2d 3e 6e 4b 65  , iOff+pPtr->nKe
7b00: 79 2c 20 70 50 74 72 2d 3e 6e 56 61 6c 2c 20 26  y, pPtr->nVal, &
7b10: 70 50 74 72 2d 3e 70 56 61 6c 2c 20 26 70 50 74  pPtr->pVal, &pPt
7b20: 72 2d 3e 62 6c 6f 62 32 0a 20 20 20 20 20 20 29  r->blob2.      )
7b30: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7b40: 20 20 20 70 50 74 72 2d 3e 6e 56 61 6c 20 3d 20     pPtr->nVal = 
7b50: 30 3b 0a 20 20 20 20 20 20 70 50 74 72 2d 3e 70  0;.      pPtr->p
7b60: 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Val = 0;.    }. 
7b70: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
7b80: 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 53 65 67 6d  .}...static Segm
7b90: 65 6e 74 20 2a 73 6f 72 74 65 64 53 70 6c 69 74  ent *sortedSplit
7ba0: 6b 65 79 53 65 67 6d 65 6e 74 28 4c 65 76 65 6c  keySegment(Level
7bb0: 20 2a 70 4c 65 76 65 6c 29 7b 0a 20 20 4d 65 72   *pLevel){.  Mer
7bc0: 67 65 20 2a 70 4d 65 72 67 65 20 3d 20 70 4c 65  ge *pMerge = pLe
7bd0: 76 65 6c 2d 3e 70 4d 65 72 67 65 3b 0a 20 20 4d  vel->pMerge;.  M
7be0: 65 72 67 65 49 6e 70 75 74 20 2a 70 20 3d 20 26  ergeInput *p = &
7bf0: 70 4d 65 72 67 65 2d 3e 73 70 6c 69 74 6b 65 79  pMerge->splitkey
7c00: 3b 0a 20 20 53 65 67 6d 65 6e 74 20 2a 70 53 65  ;.  Segment *pSe
7c10: 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66  g;.  int i;..  f
7c20: 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 65 72 67 65  or(i=0; i<pMerge
7c30: 2d 3e 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a  ->nInput; i++){.
7c40: 20 20 20 20 69 66 28 20 70 2d 3e 69 50 67 3d 3d      if( p->iPg==
7c50: 70 4d 65 72 67 65 2d 3e 61 49 6e 70 75 74 5b 69  pMerge->aInput[i
7c60: 5d 2e 69 50 67 20 29 20 62 72 65 61 6b 3b 0a 20  ].iPg ) break;. 
7c70: 20 7d 0a 20 20 69 66 28 20 70 4d 65 72 67 65 2d   }.  if( pMerge-
7c80: 3e 6e 49 6e 70 75 74 3d 3d 28 70 4c 65 76 65 6c  >nInput==(pLevel
7c90: 2d 3e 6e 52 69 67 68 74 2b 31 29 20 26 26 20 69  ->nRight+1) && i
7ca0: 3e 3d 28 70 4d 65 72 67 65 2d 3e 6e 49 6e 70 75  >=(pMerge->nInpu
7cb0: 74 2d 31 29 20 29 7b 0a 20 20 20 20 70 53 65 67  t-1) ){.    pSeg
7cc0: 20 3d 20 26 70 4c 65 76 65 6c 2d 3e 70 4e 65 78   = &pLevel->pNex
7cd0: 74 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c 73 65 7b  t->lhs;.  }else{
7ce0: 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 65  .    pSeg = &pLe
7cf0: 76 65 6c 2d 3e 61 52 68 73 5b 69 5d 3b 0a 20 20  vel->aRhs[i];.  
7d00: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 53 65 67  }..  return pSeg
7d10: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
7d20: 20 73 6f 72 74 65 64 53 70 6c 69 74 6b 65 79 28   sortedSplitkey(
7d30: 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 4c 65 76  lsm_db *pDb, Lev
7d40: 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 69 6e 74 20  el *pLevel, int 
7d50: 2a 70 52 63 29 7b 0a 20 20 53 65 67 6d 65 6e 74  *pRc){.  Segment
7d60: 20 2a 70 53 65 67 3b 0a 20 20 50 61 67 65 20 2a   *pSeg;.  Page *
7d70: 70 50 67 20 3d 20 30 3b 0a 20 20 6c 73 6d 5f 65  pPg = 0;.  lsm_e
7d80: 6e 76 20 2a 70 45 6e 76 20 3d 20 70 44 62 2d 3e  nv *pEnv = pDb->
7d90: 70 45 6e 76 3b 20 20 20 20 20 20 2f 2a 20 45 6e  pEnv;      /* En
7da0: 76 69 72 6f 6e 6d 65 6e 74 20 68 61 6e 64 6c 65  vironment handle
7db0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 2a   */.  int rc = *
7dc0: 70 52 63 3b 0a 20 20 4d 65 72 67 65 20 2a 70 4d  pRc;.  Merge *pM
7dd0: 65 72 67 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  erge = pLevel->p
7de0: 4d 65 72 67 65 3b 0a 0a 20 20 70 53 65 67 20 3d  Merge;..  pSeg =
7df0: 20 73 6f 72 74 65 64 53 70 6c 69 74 6b 65 79 53   sortedSplitkeyS
7e00: 65 67 6d 65 6e 74 28 70 4c 65 76 65 6c 29 3b 0a  egment(pLevel);.
7e10: 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b    if( rc==LSM_OK
7e20: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d   ){.    rc = lsm
7e30: 46 73 44 62 50 61 67 65 47 65 74 28 70 44 62 2d  FsDbPageGet(pDb-
7e40: 3e 70 46 53 2c 20 70 53 65 67 2c 20 70 4d 65 72  >pFS, pSeg, pMer
7e50: 67 65 2d 3e 73 70 6c 69 74 6b 65 79 2e 69 50 67  ge->splitkey.iPg
7e60: 2c 20 26 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69  , &pPg);.  }.  i
7e70: 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc==LSM_OK ){
7e80: 0a 20 20 20 20 69 6e 74 20 69 54 6f 70 69 63 3b  .    int iTopic;
7e90: 0a 20 20 20 20 42 6c 6f 62 20 62 6c 6f 62 20 3d  .    Blob blob =
7ea0: 20 7b 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 20   {0, 0, 0, 0};. 
7eb0: 20 20 20 75 38 20 2a 61 44 61 74 61 3b 0a 20 20     u8 *aData;.  
7ec0: 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20 0a    int nData;.  .
7ed0: 20 20 20 20 61 44 61 74 61 20 3d 20 6c 73 6d 46      aData = lsmF
7ee0: 73 50 61 67 65 44 61 74 61 28 70 50 67 2c 20 26  sPageData(pPg, &
7ef0: 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  nData);.    if( 
7f00: 70 61 67 65 47 65 74 46 6c 61 67 73 28 61 44 61  pageGetFlags(aDa
7f10: 74 61 2c 20 6e 44 61 74 61 29 20 26 20 53 45 47  ta, nData) & SEG
7f20: 4d 45 4e 54 5f 42 54 52 45 45 5f 46 4c 41 47 20  MENT_BTREE_FLAG 
7f30: 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
7f40: 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Key;.      int n
7f50: 4b 65 79 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20  Key;.      Pgno 
7f60: 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 72 63 20  dummy;.      rc 
7f70: 3d 20 70 61 67 65 47 65 74 42 74 72 65 65 4b 65  = pageGetBtreeKe
7f80: 79 28 70 53 65 67 2c 0a 20 20 20 20 20 20 20 20  y(pSeg,.        
7f90: 20 20 70 50 67 2c 20 70 4d 65 72 67 65 2d 3e 73    pPg, pMerge->s
7fa0: 70 6c 69 74 6b 65 79 2e 69 43 65 6c 6c 2c 20 26  plitkey.iCell, &
7fb0: 64 75 6d 6d 79 2c 20 26 69 54 6f 70 69 63 2c 20  dummy, &iTopic, 
7fc0: 26 70 4b 65 79 2c 20 26 6e 4b 65 79 2c 20 26 62  &pKey, &nKey, &b
7fd0: 6c 6f 62 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  lob.      );.   
7fe0: 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
7ff0: 4b 20 26 26 20 62 6c 6f 62 2e 70 44 61 74 61 21  K && blob.pData!
8000: 3d 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  =pKey ){.       
8010: 20 72 63 20 3d 20 73 6f 72 74 65 64 42 6c 6f 62   rc = sortedBlob
8020: 53 65 74 28 70 45 6e 76 2c 20 26 62 6c 6f 62 2c  Set(pEnv, &blob,
8030: 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   pKey, nKey);.  
8040: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
8050: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
8060: 47 65 74 4b 65 79 43 6f 70 79 28 0a 20 20 20 20  GetKeyCopy(.    
8070: 20 20 20 20 20 20 70 45 6e 76 2c 20 70 53 65 67        pEnv, pSeg
8080: 2c 20 70 50 67 2c 20 70 4d 65 72 67 65 2d 3e 73  , pPg, pMerge->s
8090: 70 6c 69 74 6b 65 79 2e 69 43 65 6c 6c 2c 20 26  plitkey.iCell, &
80a0: 69 54 6f 70 69 63 2c 20 26 62 6c 6f 62 0a 20 20  iTopic, &blob.  
80b0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
80c0: 20 20 70 4c 65 76 65 6c 2d 3e 69 53 70 6c 69 74    pLevel->iSplit
80d0: 54 6f 70 69 63 20 3d 20 69 54 6f 70 69 63 3b 0a  Topic = iTopic;.
80e0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 53 70 6c      pLevel->pSpl
80f0: 69 74 4b 65 79 20 3d 20 62 6c 6f 62 2e 70 44 61  itKey = blob.pDa
8100: 74 61 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ta;.    pLevel->
8110: 6e 53 70 6c 69 74 4b 65 79 20 3d 20 62 6c 6f 62  nSplitKey = blob
8120: 2e 6e 44 61 74 61 3b 0a 20 20 20 20 6c 73 6d 46  .nData;.    lsmF
8130: 73 50 61 67 65 52 65 6c 65 61 73 65 28 70 50 67  sPageRelease(pPg
8140: 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 52 63 20 3d  );.  }..  *pRc =
8150: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
8160: 73 65 74 20 61 20 73 65 67 6d 65 6e 74 20 63 75  set a segment cu
8170: 72 73 6f 72 2e 20 41 6c 73 6f 20 66 72 65 65 20  rsor. Also free 
8180: 69 74 73 20 62 75 66 66 65 72 73 20 69 66 20 74  its buffers if t
8190: 68 65 79 20 61 72 65 20 6e 54 68 72 65 73 68 6f  hey are nThresho
81a0: 6c 64 0a 2a 2a 20 62 79 74 65 73 20 6f 72 20 6c  ld.** bytes or l
81b0: 61 72 67 65 72 20 69 6e 20 73 69 7a 65 2e 0a 2a  arger in size..*
81c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
81d0: 67 6d 65 6e 74 50 74 72 52 65 73 65 74 28 53 65  gmentPtrReset(Se
81e0: 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 2c 20  gmentPtr *pPtr, 
81f0: 69 6e 74 20 6e 54 68 72 65 73 68 6f 6c 64 29 7b  int nThreshold){
8200: 0a 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65  .  lsmFsPageRele
8210: 61 73 65 28 70 50 74 72 2d 3e 70 50 67 29 3b 0a  ase(pPtr->pPg);.
8220: 20 20 70 50 74 72 2d 3e 70 50 67 20 3d 20 30 3b    pPtr->pPg = 0;
8230: 0a 20 20 70 50 74 72 2d 3e 6e 43 65 6c 6c 20 3d  .  pPtr->nCell =
8240: 20 30 3b 0a 20 20 70 50 74 72 2d 3e 70 4b 65 79   0;.  pPtr->pKey
8250: 20 3d 20 30 3b 0a 20 20 70 50 74 72 2d 3e 6e 4b   = 0;.  pPtr->nK
8260: 65 79 20 3d 20 30 3b 0a 20 20 70 50 74 72 2d 3e  ey = 0;.  pPtr->
8270: 70 56 61 6c 20 3d 20 30 3b 0a 20 20 70 50 74 72  pVal = 0;.  pPtr
8280: 2d 3e 6e 56 61 6c 20 3d 20 30 3b 0a 20 20 70 50  ->nVal = 0;.  pP
8290: 74 72 2d 3e 65 54 79 70 65 20 3d 20 30 3b 0a 20  tr->eType = 0;. 
82a0: 20 70 50 74 72 2d 3e 69 43 65 6c 6c 20 3d 20 30   pPtr->iCell = 0
82b0: 3b 0a 20 20 69 66 28 20 70 50 74 72 2d 3e 62 6c  ;.  if( pPtr->bl
82c0: 6f 62 31 2e 6e 41 6c 6c 6f 63 3e 3d 6e 54 68 72  ob1.nAlloc>=nThr
82d0: 65 73 68 6f 6c 64 20 29 20 73 6f 72 74 65 64 42  eshold ) sortedB
82e0: 6c 6f 62 46 72 65 65 28 26 70 50 74 72 2d 3e 62  lobFree(&pPtr->b
82f0: 6c 6f 62 31 29 3b 0a 20 20 69 66 28 20 70 50 74  lob1);.  if( pPt
8300: 72 2d 3e 62 6c 6f 62 32 2e 6e 41 6c 6c 6f 63 3e  r->blob2.nAlloc>
8310: 3d 6e 54 68 72 65 73 68 6f 6c 64 20 29 20 73 6f  =nThreshold ) so
8320: 72 74 65 64 42 6c 6f 62 46 72 65 65 28 26 70 50  rtedBlobFree(&pP
8330: 74 72 2d 3e 62 6c 6f 62 32 29 3b 0a 7d 0a 0a 73  tr->blob2);.}..s
8340: 74 61 74 69 63 20 69 6e 74 20 73 65 67 6d 65 6e  tatic int segmen
8350: 74 50 74 72 49 67 6e 6f 72 65 53 65 70 61 72 61  tPtrIgnoreSepara
8360: 74 6f 72 73 28 4d 75 6c 74 69 43 75 72 73 6f 72  tors(MultiCursor
8370: 20 2a 70 43 73 72 2c 20 53 65 67 6d 65 6e 74 50   *pCsr, SegmentP
8380: 74 72 20 2a 70 50 74 72 29 7b 0a 20 20 72 65 74  tr *pPtr){.  ret
8390: 75 72 6e 20 28 70 43 73 72 2d 3e 66 6c 61 67 73  urn (pCsr->flags
83a0: 20 26 20 43 55 52 53 4f 52 5f 52 45 41 44 5f 53   & CURSOR_READ_S
83b0: 45 50 41 52 41 54 4f 52 53 29 3d 3d 30 0a 20 20  EPARATORS)==0.  
83c0: 20 20 20 20 7c 7c 20 28 70 50 74 72 21 3d 26 70      || (pPtr!=&p
83d0: 43 73 72 2d 3e 61 50 74 72 5b 70 43 73 72 2d 3e  Csr->aPtr[pCsr->
83e0: 6e 50 74 72 2d 31 5d 29 3b 0a 7d 0a 0a 73 74 61  nPtr-1]);.}..sta
83f0: 74 69 63 20 69 6e 74 20 73 65 67 6d 65 6e 74 50  tic int segmentP
8400: 74 72 41 64 76 61 6e 63 65 28 0a 20 20 4d 75 6c  trAdvance(.  Mul
8410: 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  tiCursor *pCsr, 
8420: 0a 20 20 53 65 67 6d 65 6e 74 50 74 72 20 2a 70  .  SegmentPtr *p
8430: 50 74 72 2c 0a 20 20 69 6e 74 20 62 52 65 76 65  Ptr,.  int bReve
8440: 72 73 65 0a 29 7b 0a 20 20 69 6e 74 20 65 44 69  rse.){.  int eDi
8450: 72 20 3d 20 28 62 52 65 76 65 72 73 65 20 3f 20  r = (bReverse ? 
8460: 2d 31 20 3a 20 31 29 3b 0a 20 20 4c 65 76 65 6c  -1 : 1);.  Level
8470: 20 2a 70 4c 76 6c 20 3d 20 70 50 74 72 2d 3e 70   *pLvl = pPtr->p
8480: 4c 65 76 65 6c 3b 0a 20 20 64 6f 20 7b 0a 20 20  Level;.  do {.  
8490: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
84a0: 74 20 69 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t iCell;        
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
84c0: 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 63 65 6c  umber of new cel
84d0: 6c 20 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20  l in page */.   
84e0: 20 69 6e 74 20 73 76 46 6c 61 67 73 20 3d 20 30   int svFlags = 0
84f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8500: 2a 20 53 65 67 6d 65 6e 74 50 74 72 2e 65 54 79  * SegmentPtr.eTy
8510: 70 65 20 62 65 66 6f 72 65 20 61 64 76 61 6e 63  pe before advanc
8520: 65 20 2a 2f 0a 0a 20 20 20 20 69 43 65 6c 6c 20  e */..    iCell 
8530: 3d 20 70 50 74 72 2d 3e 69 43 65 6c 6c 20 2b 20  = pPtr->iCell + 
8540: 65 44 69 72 3b 0a 20 20 20 20 61 73 73 65 72 74  eDir;.    assert
8550: 28 20 70 50 74 72 2d 3e 70 50 67 20 29 3b 0a 20  ( pPtr->pPg );. 
8560: 20 20 20 61 73 73 65 72 74 28 20 69 43 65 6c 6c     assert( iCell
8570: 3c 3d 70 50 74 72 2d 3e 6e 43 65 6c 6c 20 26 26  <=pPtr->nCell &&
8580: 20 69 43 65 6c 6c 3e 3d 2d 31 20 29 3b 0a 0a 20   iCell>=-1 );.. 
8590: 20 20 20 69 66 28 20 62 52 65 76 65 72 73 65 20     if( bReverse 
85a0: 26 26 20 70 50 74 72 2d 3e 70 53 65 67 21 3d 26  && pPtr->pSeg!=&
85b0: 70 50 74 72 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68  pPtr->pLevel->lh
85c0: 73 20 29 7b 0a 20 20 20 20 20 20 73 76 46 6c 61  s ){.      svFla
85d0: 67 73 20 3d 20 70 50 74 72 2d 3e 65 54 79 70 65  gs = pPtr->eType
85e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
85f0: 73 76 46 6c 61 67 73 20 29 3b 0a 20 20 20 20 7d  svFlags );.    }
8600: 0a 0a 20 20 20 20 69 66 28 20 69 43 65 6c 6c 3e  ..    if( iCell>
8610: 3d 70 50 74 72 2d 3e 6e 43 65 6c 6c 20 7c 7c 20  =pPtr->nCell || 
8620: 69 43 65 6c 6c 3c 30 20 29 7b 0a 20 20 20 20 20  iCell<0 ){.     
8630: 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 72 63   do {.        rc
8640: 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 4e 65 78   = segmentPtrNex
8650: 74 50 61 67 65 28 70 50 74 72 2c 20 65 44 69 72  tPage(pPtr, eDir
8660: 29 3b 20 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  ); .      }while
8670: 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 0a 20 20  ( rc==LSM_OK .  
8680: 20 20 20 20 20 20 20 20 20 26 26 20 70 50 74 72           && pPtr
8690: 2d 3e 70 50 67 20 0a 20 20 20 20 20 20 20 20 20  ->pPg .         
86a0: 20 20 26 26 20 28 70 50 74 72 2d 3e 6e 43 65 6c    && (pPtr->nCel
86b0: 6c 3d 3d 30 20 7c 7c 20 28 70 50 74 72 2d 3e 66  l==0 || (pPtr->f
86c0: 6c 61 67 73 20 26 20 53 45 47 4d 45 4e 54 5f 42  lags & SEGMENT_B
86d0: 54 52 45 45 5f 46 4c 41 47 29 20 29 20 0a 20 20  TREE_FLAG) ) .  
86e0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
86f0: 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72 65   rc!=LSM_OK ) re
8700: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
8710: 43 65 6c 6c 20 3d 20 62 52 65 76 65 72 73 65 20  Cell = bReverse 
8720: 3f 20 28 70 50 74 72 2d 3e 6e 43 65 6c 6c 2d 31  ? (pPtr->nCell-1
8730: 29 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ) : 0;.    }.   
8740: 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72   rc = segmentPtr
8750: 4c 6f 61 64 43 65 6c 6c 28 70 50 74 72 2c 20 69  LoadCell(pPtr, i
8760: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
8770: 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72 65 74 75  c!=LSM_OK ) retu
8780: 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20  rn rc;..    if( 
8790: 73 76 46 6c 61 67 73 20 26 26 20 70 50 74 72 2d  svFlags && pPtr-
87a0: 3e 70 50 67 20 29 7b 0a 20 20 20 20 20 20 69 6e  >pPg ){.      in
87b0: 74 20 72 65 73 20 3d 20 73 6f 72 74 65 64 4b 65  t res = sortedKe
87c0: 79 43 6f 6d 70 61 72 65 28 70 43 73 72 2d 3e 70  yCompare(pCsr->p
87d0: 44 62 2d 3e 78 43 6d 70 2c 0a 20 20 20 20 20 20  Db->xCmp,.      
87e0: 20 20 20 20 72 74 54 6f 70 69 63 28 70 50 74 72      rtTopic(pPtr
87f0: 2d 3e 65 54 79 70 65 29 2c 20 70 50 74 72 2d 3e  ->eType), pPtr->
8800: 70 4b 65 79 2c 20 70 50 74 72 2d 3e 6e 4b 65 79  pKey, pPtr->nKey
8810: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c  ,.          pLvl
8820: 2d 3e 69 53 70 6c 69 74 54 6f 70 69 63 2c 20 70  ->iSplitTopic, p
8830: 4c 76 6c 2d 3e 70 53 70 6c 69 74 4b 65 79 2c 20  Lvl->pSplitKey, 
8840: 70 4c 76 6c 2d 3e 6e 53 70 6c 69 74 4b 65 79 0a  pLvl->nSplitKey.
8850: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
8860: 66 28 20 72 65 73 3c 30 20 29 20 73 65 67 6d 65  f( res<0 ) segme
8870: 6e 74 50 74 72 52 65 73 65 74 28 70 50 74 72 2c  ntPtrReset(pPtr,
8880: 20 4c 53 4d 5f 53 45 47 4d 45 4e 54 50 54 52 5f   LSM_SEGMENTPTR_
8890: 46 52 45 45 5f 54 48 52 45 53 48 4f 4c 44 29 3b  FREE_THRESHOLD);
88a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
88b0: 70 50 74 72 2d 3e 70 50 67 3d 3d 30 20 26 26 20  pPtr->pPg==0 && 
88c0: 28 73 76 46 6c 61 67 73 20 26 20 4c 53 4d 5f 45  (svFlags & LSM_E
88d0: 4e 44 5f 44 45 4c 45 54 45 29 20 29 7b 0a 20 20  ND_DELETE) ){.  
88e0: 20 20 20 20 53 65 67 6d 65 6e 74 20 2a 70 53 65      Segment *pSe
88f0: 67 20 3d 20 70 50 74 72 2d 3e 70 53 65 67 3b 0a  g = pPtr->pSeg;.
8900: 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 46 73        rc = lsmFs
8910: 44 62 50 61 67 65 47 65 74 28 70 43 73 72 2d 3e  DbPageGet(pCsr->
8920: 70 44 62 2d 3e 70 46 53 2c 20 70 53 65 67 2c 20  pDb->pFS, pSeg, 
8930: 70 53 65 67 2d 3e 69 46 69 72 73 74 2c 20 26 70  pSeg->iFirst, &p
8940: 50 74 72 2d 3e 70 50 67 29 3b 0a 20 20 20 20 20  Ptr->pPg);.     
8950: 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20   if( rc!=LSM_OK 
8960: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
8970: 20 20 20 70 50 74 72 2d 3e 65 54 79 70 65 20 3d     pPtr->eType =
8980: 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54   LSM_START_DELET
8990: 45 20 7c 20 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45  E | LSM_POINT_DE
89a0: 4c 45 54 45 3b 0a 20 20 20 20 20 20 70 50 74 72  LETE;.      pPtr
89b0: 2d 3e 65 54 79 70 65 20 7c 3d 20 28 70 4c 76 6c  ->eType |= (pLvl
89c0: 2d 3e 69 53 70 6c 69 74 54 6f 70 69 63 20 3f 20  ->iSplitTopic ? 
89d0: 4c 53 4d 5f 53 59 53 54 45 4d 4b 45 59 20 3a 20  LSM_SYSTEMKEY : 
89e0: 30 29 3b 0a 20 20 20 20 20 20 70 50 74 72 2d 3e  0);.      pPtr->
89f0: 70 4b 65 79 20 3d 20 70 4c 76 6c 2d 3e 70 53 70  pKey = pLvl->pSp
8a00: 6c 69 74 4b 65 79 3b 0a 20 20 20 20 20 20 70 50  litKey;.      pP
8a10: 74 72 2d 3e 6e 4b 65 79 20 3d 20 70 4c 76 6c 2d  tr->nKey = pLvl-
8a20: 3e 6e 53 70 6c 69 74 4b 65 79 3b 0a 20 20 20 20  >nSplitKey;.    
8a30: 7d 0a 0a 20 20 7d 77 68 69 6c 65 28 20 70 43 73  }..  }while( pCs
8a40: 72 20 0a 20 20 20 20 20 20 20 26 26 20 70 50 74  r .       && pPt
8a50: 72 2d 3e 70 50 67 20 0a 20 20 20 20 20 20 20 26  r->pPg .       &
8a60: 26 20 73 65 67 6d 65 6e 74 50 74 72 49 67 6e 6f  & segmentPtrIgno
8a70: 72 65 53 65 70 61 72 61 74 6f 72 73 28 70 43 73  reSeparators(pCs
8a80: 72 2c 20 70 50 74 72 29 0a 20 20 20 20 20 20 20  r, pPtr).       
8a90: 26 26 20 72 74 49 73 53 65 70 61 72 61 74 6f 72  && rtIsSeparator
8aa0: 28 70 50 74 72 2d 3e 65 54 79 70 65 29 0a 20 20  (pPtr->eType).  
8ab0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d  );..  return LSM
8ac0: 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  _OK;.}..static v
8ad0: 6f 69 64 20 73 65 67 6d 65 6e 74 50 74 72 45 6e  oid segmentPtrEn
8ae0: 64 50 61 67 65 28 0a 20 20 46 69 6c 65 53 79 73  dPage(.  FileSys
8af0: 74 65 6d 20 2a 70 46 53 2c 20 0a 20 20 53 65 67  tem *pFS, .  Seg
8b00: 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 2c 20 0a  mentPtr *pPtr, .
8b10: 20 20 69 6e 74 20 62 4c 61 73 74 2c 20 0a 20 20    int bLast, .  
8b20: 69 6e 74 20 2a 70 52 63 0a 29 7b 0a 20 20 69 66  int *pRc.){.  if
8b30: 28 20 2a 70 52 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  ( *pRc==LSM_OK )
8b40: 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 20 2a 70  {.    Segment *p
8b50: 53 65 67 20 3d 20 70 50 74 72 2d 3e 70 53 65 67  Seg = pPtr->pSeg
8b60: 3b 0a 20 20 20 20 50 61 67 65 20 2a 70 4e 65 77  ;.    Page *pNew
8b70: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 62 4c   = 0;.    if( bL
8b80: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ast ){.      *pR
8b90: 63 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65 4c  c = lsmFsDbPageL
8ba0: 61 73 74 28 70 46 53 2c 20 70 53 65 67 2c 20 26  ast(pFS, pSeg, &
8bb0: 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pNew);.    }else
8bc0: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 6c  {.      *pRc = l
8bd0: 73 6d 46 73 44 62 50 61 67 65 47 65 74 28 70 46  smFsDbPageGet(pF
8be0: 53 2c 20 70 53 65 67 2c 20 70 53 65 67 2d 3e 69  S, pSeg, pSeg->i
8bf0: 46 69 72 73 74 2c 20 26 70 4e 65 77 29 3b 0a 20  First, &pNew);. 
8c00: 20 20 20 7d 0a 20 20 20 20 73 65 67 6d 65 6e 74     }.    segment
8c10: 50 74 72 53 65 74 50 61 67 65 28 70 50 74 72 2c  PtrSetPage(pPtr,
8c20: 20 70 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a   pNew);.  }.}...
8c30: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 6f 76  /*.** Try to mov
8c40: 65 20 74 68 65 20 73 65 67 6d 65 6e 74 20 70 6f  e the segment po
8c50: 69 6e 74 65 72 20 70 61 73 73 65 64 20 61 73 20  inter passed as 
8c60: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
8c70: 65 6e 74 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  ent so that it.*
8c80: 2a 20 70 6f 69 6e 74 73 20 61 74 20 65 69 74 68  * points at eith
8c90: 65 72 20 74 68 65 20 66 69 72 73 74 20 28 62 4c  er the first (bL
8ca0: 61 73 74 3d 3d 30 29 20 6f 72 20 6c 61 73 74 20  ast==0) or last 
8cb0: 28 62 4c 61 73 74 3d 3d 31 29 20 63 65 6c 6c 20  (bLast==1) cell 
8cc0: 69 6e 20 74 68 65 20 76 61 6c 69 64 0a 2a 2a 20  in the valid.** 
8cd0: 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 73 65  region of the se
8ce0: 67 6d 65 6e 74 20 64 65 66 69 6e 65 64 20 62 79  gment defined by
8cf0: 20 70 50 74 72 2d 3e 69 46 69 72 73 74 20 61 6e   pPtr->iFirst an
8d00: 64 20 70 50 74 72 2d 3e 69 4c 61 73 74 2e 0a 2a  d pPtr->iLast..*
8d10: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4c 53 4d 5f  *.** Return LSM_
8d20: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
8d30: 20 6f 72 20 61 6e 20 6c 73 6d 20 65 72 72 6f 72   or an lsm error
8d40: 20 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69   code if somethi
8d50: 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
8d60: 20 28 49 4f 20 65 72 72 6f 72 2c 20 4f 4f 4d 20   (IO error, OOM 
8d70: 65 74 63 2e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  etc.)..*/.static
8d80: 20 69 6e 74 20 73 65 67 6d 65 6e 74 50 74 72 45   int segmentPtrE
8d90: 6e 64 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  nd(MultiCursor *
8da0: 70 43 73 72 2c 20 53 65 67 6d 65 6e 74 50 74 72  pCsr, SegmentPtr
8db0: 20 2a 70 50 74 72 2c 20 69 6e 74 20 62 4c 61 73   *pPtr, int bLas
8dc0: 74 29 7b 0a 20 20 4c 65 76 65 6c 20 2a 70 4c 76  t){.  Level *pLv
8dd0: 6c 20 3d 20 70 50 74 72 2d 3e 70 4c 65 76 65 6c  l = pPtr->pLevel
8de0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d  ;.  int rc = LSM
8df0: 5f 4f 4b 3b 0a 20 20 46 69 6c 65 53 79 73 74 65  _OK;.  FileSyste
8e00: 6d 20 2a 70 46 53 20 3d 20 70 43 73 72 2d 3e 70  m *pFS = pCsr->p
8e10: 44 62 2d 3e 70 46 53 3b 0a 20 20 69 6e 74 20 62  Db->pFS;.  int b
8e20: 49 67 6e 6f 72 65 3b 0a 0a 20 20 73 65 67 6d 65  Ignore;..  segme
8e30: 6e 74 50 74 72 45 6e 64 50 61 67 65 28 70 46 53  ntPtrEndPage(pFS
8e40: 2c 20 70 50 74 72 2c 20 62 4c 61 73 74 2c 20 26  , pPtr, bLast, &
8e50: 72 63 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  rc);.  while( rc
8e60: 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 50 74 72  ==LSM_OK && pPtr
8e70: 2d 3e 70 50 67 20 0a 20 20 20 20 20 20 26 26 20  ->pPg .      && 
8e80: 28 70 50 74 72 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  (pPtr->nCell==0 
8e90: 7c 7c 20 28 70 50 74 72 2d 3e 66 6c 61 67 73 20  || (pPtr->flags 
8ea0: 26 20 53 45 47 4d 45 4e 54 5f 42 54 52 45 45 5f  & SEGMENT_BTREE_
8eb0: 46 4c 41 47 29 29 0a 20 20 29 7b 0a 20 20 20 20  FLAG)).  ){.    
8ec0: 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 4e  rc = segmentPtrN
8ed0: 65 78 74 50 61 67 65 28 70 50 74 72 2c 20 28 62  extPage(pPtr, (b
8ee0: 4c 61 73 74 20 3f 20 2d 31 20 3a 20 31 29 29 3b  Last ? -1 : 1));
8ef0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
8f00: 4c 53 4d 5f 4f 4b 20 26 26 20 70 50 74 72 2d 3e  LSM_OK && pPtr->
8f10: 70 50 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pPg ){.    rc = 
8f20: 73 65 67 6d 65 6e 74 50 74 72 4c 6f 61 64 43 65  segmentPtrLoadCe
8f30: 6c 6c 28 70 50 74 72 2c 20 62 4c 61 73 74 20 3f  ll(pPtr, bLast ?
8f40: 20 28 70 50 74 72 2d 3e 6e 43 65 6c 6c 2d 31 29   (pPtr->nCell-1)
8f50: 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
8f60: 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 62 4c 61  c==LSM_OK && bLa
8f70: 73 74 20 26 26 20 70 50 74 72 2d 3e 70 53 65 67  st && pPtr->pSeg
8f80: 21 3d 26 70 4c 76 6c 2d 3e 6c 68 73 20 29 7b 0a  !=&pLvl->lhs ){.
8f90: 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20        int res = 
8fa0: 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65  sortedKeyCompare
8fb0: 28 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70  (pCsr->pDb->xCmp
8fc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 72 74 54 6f  ,.          rtTo
8fd0: 70 69 63 28 70 50 74 72 2d 3e 65 54 79 70 65 29  pic(pPtr->eType)
8fe0: 2c 20 70 50 74 72 2d 3e 70 4b 65 79 2c 20 70 50  , pPtr->pKey, pP
8ff0: 74 72 2d 3e 6e 4b 65 79 2c 0a 20 20 20 20 20 20  tr->nKey,.      
9000: 20 20 20 20 70 4c 76 6c 2d 3e 69 53 70 6c 69 74      pLvl->iSplit
9010: 54 6f 70 69 63 2c 20 70 4c 76 6c 2d 3e 70 53 70  Topic, pLvl->pSp
9020: 6c 69 74 4b 65 79 2c 20 70 4c 76 6c 2d 3e 6e 53  litKey, pLvl->nS
9030: 70 6c 69 74 4b 65 79 0a 20 20 20 20 20 20 29 3b  plitKey.      );
9040: 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30  .      if( res<0
9050: 20 29 20 73 65 67 6d 65 6e 74 50 74 72 52 65 73   ) segmentPtrRes
9060: 65 74 28 70 50 74 72 2c 20 4c 53 4d 5f 53 45 47  et(pPtr, LSM_SEG
9070: 4d 45 4e 54 50 54 52 5f 46 52 45 45 5f 54 48 52  MENTPTR_FREE_THR
9080: 45 53 48 4f 4c 44 29 3b 0a 20 20 20 20 7d 0a 20  ESHOLD);.    }. 
9090: 20 7d 0a 20 20 0a 20 20 62 49 67 6e 6f 72 65 20   }.  .  bIgnore 
90a0: 3d 20 73 65 67 6d 65 6e 74 50 74 72 49 67 6e 6f  = segmentPtrIgno
90b0: 72 65 53 65 70 61 72 61 74 6f 72 73 28 70 43 73  reSeparators(pCs
90c0: 72 2c 20 70 50 74 72 29 3b 0a 20 20 69 66 28 20  r, pPtr);.  if( 
90d0: 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 50  rc==LSM_OK && pP
90e0: 74 72 2d 3e 70 50 67 20 26 26 20 62 49 67 6e 6f  tr->pPg && bIgno
90f0: 72 65 20 26 26 20 72 74 49 73 53 65 70 61 72 61  re && rtIsSepara
9100: 74 6f 72 28 70 50 74 72 2d 3e 65 54 79 70 65 29  tor(pPtr->eType)
9110: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 67   ){.    rc = seg
9120: 6d 65 6e 74 50 74 72 41 64 76 61 6e 63 65 28 70  mentPtrAdvance(p
9130: 43 73 72 2c 20 70 50 74 72 2c 20 62 4c 61 73 74  Csr, pPtr, bLast
9140: 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  );.  }..#if 0.  
9150: 69 66 28 20 62 4c 61 73 74 20 26 26 20 72 63 3d  if( bLast && rc=
9160: 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 50 74 72 2d  =LSM_OK && pPtr-
9170: 3e 70 50 67 0a 20 20 20 26 26 20 70 50 74 72 2d  >pPg.   && pPtr-
9180: 3e 70 53 65 67 3d 3d 26 70 4c 76 6c 2d 3e 6c 68  >pSeg==&pLvl->lh
9190: 73 20 0a 20 20 20 26 26 20 70 4c 76 6c 2d 3e 6e  s .   && pLvl->n
91a0: 52 69 67 68 74 20 26 26 20 28 70 50 74 72 2d 3e  Right && (pPtr->
91b0: 65 54 79 70 65 20 26 20 4c 53 4d 5f 53 54 41 52  eType & LSM_STAR
91c0: 54 5f 44 45 4c 45 54 45 29 0a 20 20 29 7b 0a 20  T_DELETE).  ){. 
91d0: 20 20 20 70 50 74 72 2d 3e 69 43 65 6c 6c 2b 2b     pPtr->iCell++
91e0: 3b 0a 20 20 20 20 70 50 74 72 2d 3e 65 54 79 70  ;.    pPtr->eTyp
91f0: 65 20 3d 20 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45  e = LSM_END_DELE
9200: 54 45 20 7c 20 28 70 4c 76 6c 2d 3e 69 53 70 6c  TE | (pLvl->iSpl
9210: 69 74 54 6f 70 69 63 29 3b 0a 20 20 20 20 70 50  itTopic);.    pP
9220: 74 72 2d 3e 70 4b 65 79 20 3d 20 70 4c 76 6c 2d  tr->pKey = pLvl-
9230: 3e 70 53 70 6c 69 74 4b 65 79 3b 0a 20 20 20 20  >pSplitKey;.    
9240: 70 50 74 72 2d 3e 6e 4b 65 79 20 3d 20 70 4c 76  pPtr->nKey = pLv
9250: 6c 2d 3e 6e 53 70 6c 69 74 4b 65 79 3b 0a 20 20  l->nSplitKey;.  
9260: 20 20 70 50 74 72 2d 3e 70 56 61 6c 20 3d 20 30    pPtr->pVal = 0
9270: 3b 0a 20 20 20 20 70 50 74 72 2d 3e 6e 56 61 6c  ;.    pPtr->nVal
9280: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
9290: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
92a0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  ..static void se
92b0: 67 6d 65 6e 74 50 74 72 4b 65 79 28 53 65 67 6d  gmentPtrKey(Segm
92c0: 65 6e 74 50 74 72 20 2a 70 50 74 72 2c 20 76 6f  entPtr *pPtr, vo
92d0: 69 64 20 2a 2a 70 70 4b 65 79 2c 20 69 6e 74 20  id **ppKey, int 
92e0: 2a 70 6e 4b 65 79 29 7b 0a 20 20 61 73 73 65 72  *pnKey){.  asser
92f0: 74 28 20 70 50 74 72 2d 3e 70 50 67 20 29 3b 0a  t( pPtr->pPg );.
9300: 20 20 2a 70 70 4b 65 79 20 3d 20 70 50 74 72 2d    *ppKey = pPtr-
9310: 3e 70 4b 65 79 3b 0a 20 20 2a 70 6e 4b 65 79 20  >pKey;.  *pnKey 
9320: 3d 20 70 50 74 72 2d 3e 6e 4b 65 79 3b 0a 7d 0a  = pPtr->nKey;.}.
9330: 0a 23 69 66 20 30 20 2f 2a 20 4e 4f 54 20 55 53  .#if 0 /* NOT US
9340: 45 44 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ED */.static cha
9350: 72 20 2a 6b 65 79 54 6f 53 74 72 69 6e 67 28 6c  r *keyToString(l
9360: 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c 20 76 6f  sm_env *pEnv, vo
9370: 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b  id *pKey, int nK
9380: 65 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ey){.  int i;.  
9390: 75 38 20 2a 61 4b 65 79 20 3d 20 28 75 38 20 2a  u8 *aKey = (u8 *
93a0: 29 70 4b 65 79 3b 0a 20 20 63 68 61 72 20 2a 7a  )pKey;.  char *z
93b0: 52 65 74 20 3d 20 28 63 68 61 72 20 2a 29 6c 73  Ret = (char *)ls
93c0: 6d 4d 61 6c 6c 6f 63 28 70 45 6e 76 2c 20 6e 4b  mMalloc(pEnv, nK
93d0: 65 79 2b 31 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  ey+1);..  for(i=
93e0: 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b  0; i<nKey; i++){
93f0: 0a 20 20 20 20 7a 52 65 74 5b 69 5d 20 3d 20 28  .    zRet[i] = (
9400: 63 68 61 72 29 28 69 73 61 6c 6e 75 6d 28 61 4b  char)(isalnum(aK
9410: 65 79 5b 69 5d 29 20 3f 20 61 4b 65 79 5b 69 5d  ey[i]) ? aKey[i]
9420: 20 3a 20 27 2e 27 29 3b 0a 20 20 7d 0a 20 20 7a   : '.');.  }.  z
9430: 52 65 74 5b 6e 4b 65 79 5d 20 3d 20 27 5c 30 27  Ret[nKey] = '\0'
9440: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ;.  return zRet;
9450: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 30  .}.#endif..#if 0
9460: 20 2f 2a 20 4e 4f 54 20 55 53 45 44 20 2a 2f 0a   /* NOT USED */.
9470: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  /*.** Check that
9480: 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70   the page that p
9490: 50 74 72 20 63 75 72 72 65 6e 74 6c 79 20 68 61  Ptr currently ha
94a0: 73 20 6c 6f 61 64 65 64 20 69 73 20 74 68 65 20  s loaded is the 
94b0: 63 6f 72 72 65 63 74 20 70 61 67 65 0a 2a 2a 20  correct page.** 
94c0: 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 6b 65  to search for ke
94d0: 79 20 28 70 4b 65 79 2f 6e 4b 65 79 29 2e 20 49  y (pKey/nKey). I
94e0: 66 20 69 74 20 69 73 2c 20 72 65 74 75 72 6e 20  f it is, return 
94f0: 31 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  1. Otherwise, an
9500: 20 61 73 73 65 72 74 0a 2a 2a 20 66 61 69 6c 73   assert.** fails
9510: 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
9520: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75  on does not retu
9530: 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rn..*/.static in
9540: 74 20 61 73 73 65 72 74 4b 65 79 4c 6f 63 61 74  t assertKeyLocat
9550: 69 6f 6e 28 0a 20 20 4d 75 6c 74 69 43 75 72 73  ion(.  MultiCurs
9560: 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20 53 65 67  or *pCsr, .  Seg
9570: 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 2c 20 0a  mentPtr *pPtr, .
9580: 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e    void *pKey, in
9590: 74 20 6e 4b 65 79 0a 29 7b 0a 20 20 6c 73 6d 5f  t nKey.){.  lsm_
95a0: 65 6e 76 20 2a 70 45 6e 76 20 3d 20 6c 73 6d 46  env *pEnv = lsmF
95b0: 73 45 6e 76 28 70 43 73 72 2d 3e 70 44 62 2d 3e  sEnv(pCsr->pDb->
95c0: 70 46 53 29 3b 0a 20 20 42 6c 6f 62 20 62 6c 6f  pFS);.  Blob blo
95d0: 62 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20  b = {0, 0, 0};. 
95e0: 20 69 6e 74 20 65 44 69 72 3b 0a 20 20 69 6e 74   int eDir;.  int
95f0: 20 69 54 6f 70 69 63 20 3d 20 30 3b 20 20 20 20   iTopic = 0;    
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9610: 54 4f 44 4f 3a 20 46 69 78 20 6d 65 20 2a 2f 0a  TODO: Fix me */.
9620: 0a 20 20 66 6f 72 28 65 44 69 72 3d 2d 31 3b 20  .  for(eDir=-1; 
9630: 65 44 69 72 3c 3d 31 3b 20 65 44 69 72 2b 3d 32  eDir<=1; eDir+=2
9640: 29 7b 0a 20 20 20 20 50 61 67 65 20 2a 70 54 65  ){.    Page *pTe
9650: 73 74 20 3d 20 70 50 74 72 2d 3e 70 50 67 3b 0a  st = pPtr->pPg;.
9660: 0a 20 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65  .    lsmFsPageRe
9670: 66 28 70 54 65 73 74 29 3b 0a 20 20 20 20 77 68  f(pTest);.    wh
9680: 69 6c 65 28 20 70 54 65 73 74 20 29 7b 0a 20 20  ile( pTest ){.  
9690: 20 20 20 20 53 65 67 6d 65 6e 74 20 2a 70 53 65      Segment *pSe
96a0: 67 20 3d 20 70 50 74 72 2d 3e 70 53 65 67 3b 0a  g = pPtr->pSeg;.
96b0: 20 20 20 20 20 20 50 61 67 65 20 2a 70 4e 65 78        Page *pNex
96c0: 74 3b 0a 0a 20 20 20 20 20 20 69 6e 74 20 72 63  t;..      int rc
96d0: 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65 4e 65   = lsmFsDbPageNe
96e0: 78 74 28 70 53 65 67 2c 20 70 54 65 73 74 2c 20  xt(pSeg, pTest, 
96f0: 65 44 69 72 2c 20 26 70 4e 65 78 74 29 3b 0a 20  eDir, &pNext);. 
9700: 20 20 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65       lsmFsPageRe
9710: 6c 65 61 73 65 28 70 54 65 73 74 29 3b 0a 20 20  lease(pTest);.  
9720: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
9730: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 54 65  urn 1;.      pTe
9740: 73 74 20 3d 20 70 4e 65 78 74 3b 0a 0a 20 20 20  st = pNext;..   
9750: 20 20 20 69 66 28 20 70 54 65 73 74 20 29 7b 0a     if( pTest ){.
9760: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44 61 74          int nDat
9770: 61 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61  a;.        u8 *a
9780: 44 61 74 61 20 3d 20 66 73 50 61 67 65 44 61 74  Data = fsPageDat
9790: 61 28 70 54 65 73 74 2c 20 26 6e 44 61 74 61 29  a(pTest, &nData)
97a0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  ;.        int nC
97b0: 65 6c 6c 20 3d 20 70 61 67 65 47 65 74 4e 52 65  ell = pageGetNRe
97c0: 63 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  c(aData, nData);
97d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61  .        int fla
97e0: 67 73 20 3d 20 70 61 67 65 47 65 74 46 6c 61 67  gs = pageGetFlag
97f0: 73 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  s(aData, nData);
9800: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
9810: 6c 6c 20 26 26 20 30 3d 3d 28 66 6c 61 67 73 26  ll && 0==(flags&
9820: 53 45 47 4d 45 4e 54 5f 42 54 52 45 45 5f 46 4c  SEGMENT_BTREE_FL
9830: 41 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AG) ){.         
9840: 20 69 6e 74 20 6e 50 67 4b 65 79 3b 0a 20 20 20   int nPgKey;.   
9850: 20 20 20 20 20 20 20 69 6e 74 20 69 50 67 54 6f         int iPgTo
9860: 70 69 63 3b 0a 20 20 20 20 20 20 20 20 20 20 75  pic;.          u
9870: 38 20 2a 70 50 67 4b 65 79 3b 0a 20 20 20 20 20  8 *pPgKey;.     
9880: 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
9890: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 65 6c          int iCel
98a0: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 43  l;..          iC
98b0: 65 6c 6c 20 3d 20 28 28 65 44 69 72 20 3c 20 30  ell = ((eDir < 0
98c0: 29 20 3f 20 28 6e 43 65 6c 6c 2d 31 29 20 3a 20  ) ? (nCell-1) : 
98d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  0);.          pP
98e0: 67 4b 65 79 20 3d 20 70 61 67 65 47 65 74 4b 65  gKey = pageGetKe
98f0: 79 28 70 53 65 67 2c 20 70 54 65 73 74 2c 20 69  y(pSeg, pTest, i
9900: 43 65 6c 6c 2c 20 26 69 50 67 54 6f 70 69 63 2c  Cell, &iPgTopic,
9910: 20 26 6e 50 67 4b 65 79 2c 20 26 62 6c 6f 62 29   &nPgKey, &blob)
9920: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  ;.          res 
9930: 3d 20 69 54 6f 70 69 63 20 2d 20 69 50 67 54 6f  = iTopic - iPgTo
9940: 70 69 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pic;.          i
9950: 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20  f( res==0 ) res 
9960: 3d 20 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d  = pCsr->pDb->xCm
9970: 70 28 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70 50  p(pKey, nKey, pP
9980: 67 4b 65 79 2c 20 6e 50 67 4b 65 79 29 3b 0a 20  gKey, nPgKey);. 
9990: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 65 44           if( (eD
99a0: 69 72 3d 3d 31 20 26 26 20 72 65 73 3e 30 29 20  ir==1 && res>0) 
99b0: 7c 7c 20 28 65 44 69 72 3d 3d 2d 31 20 26 26 20  || (eDir==-1 && 
99c0: 72 65 73 3c 30 29 20 29 7b 0a 20 20 20 20 20 20  res<0) ){.      
99d0: 20 20 20 20 20 20 2f 2a 20 54 61 6b 69 6e 67 20        /* Taking 
99e0: 74 68 69 73 20 62 72 61 6e 63 68 20 6d 65 61 6e  this branch mean
99f0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 68 61 73 20  s something has 
9a00: 67 6f 6e 65 20 77 72 6f 6e 67 2e 20 2a 2f 0a 20  gone wrong. */. 
9a10: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
9a20: 2a 7a 4d 73 67 20 3d 20 6c 73 6d 4d 61 6c 6c 6f  *zMsg = lsmMallo
9a30: 63 50 72 69 6e 74 66 28 70 45 6e 76 2c 20 22 4b  cPrintf(pEnv, "K
9a40: 65 79 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74  ey \"%s\" is not
9a50: 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 0a 20   on page %d", . 
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b                 k
9a70: 65 79 54 6f 53 74 72 69 6e 67 28 70 45 6e 76 2c  eyToString(pEnv,
9a80: 20 70 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6c 73   pKey, nKey), ls
9a90: 6d 46 73 50 61 67 65 4e 75 6d 62 65 72 28 70 50  mFsPageNumber(pP
9aa0: 74 72 2d 3e 70 50 67 29 0a 20 20 20 20 20 20 20  tr->pPg).       
9ab0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
9ac0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
9ad0: 72 72 2c 20 22 25 73 5c 6e 22 2c 20 7a 4d 73 67  rr, "%s\n", zMsg
9ae0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
9af0: 73 73 65 72 74 28 20 21 22 61 73 73 65 72 74 4b  ssert( !"assertK
9b00: 65 79 4c 6f 63 61 74 69 6f 6e 28 29 20 66 61 69  eyLocation() fai
9b10: 6c 65 64 22 20 29 3b 0a 20 20 20 20 20 20 20 20  led" );.        
9b20: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6c 73    }.          ls
9b30: 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65 28 70  mFsPageRelease(p
9b40: 54 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Test);.         
9b50: 20 70 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20   pTest = 0;.    
9b60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9b70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 6f 72 74 65    }.  }..  sorte
9b80: 64 42 6c 6f 62 46 72 65 65 28 26 62 6c 6f 62 29  dBlobFree(&blob)
9b90: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
9ba0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
9bb0: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  NDEBUG.static in
9bc0: 74 20 61 73 73 65 72 74 53 65 65 6b 52 65 73 75  t assertSeekResu
9bd0: 6c 74 28 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f  lt(.  MultiCurso
9be0: 72 20 2a 70 43 73 72 2c 0a 20 20 53 65 67 6d 65  r *pCsr,.  Segme
9bf0: 6e 74 50 74 72 20 2a 70 50 74 72 2c 0a 20 20 69  ntPtr *pPtr,.  i
9c00: 6e 74 20 69 54 6f 70 69 63 2c 0a 20 20 76 6f 69  nt iTopic,.  voi
9c10: 64 20 2a 70 4b 65 79 2c 0a 20 20 69 6e 74 20 6e  d *pKey,.  int n
9c20: 4b 65 79 2c 0a 20 20 69 6e 74 20 65 53 65 65 6b  Key,.  int eSeek
9c30: 0a 29 7b 0a 20 20 69 66 28 20 70 50 74 72 2d 3e  .){.  if( pPtr->
9c40: 70 50 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  pPg ){.    int r
9c50: 65 73 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 6f  es;.    res = so
9c60: 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65 28 70  rtedKeyCompare(p
9c70: 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70 2c 20  Csr->pDb->xCmp, 
9c80: 69 54 6f 70 69 63 2c 20 70 4b 65 79 2c 20 6e 4b  iTopic, pKey, nK
9c90: 65 79 2c 0a 20 20 20 20 20 20 20 20 72 74 54 6f  ey,.        rtTo
9ca0: 70 69 63 28 70 50 74 72 2d 3e 65 54 79 70 65 29  pic(pPtr->eType)
9cb0: 2c 20 70 50 74 72 2d 3e 70 4b 65 79 2c 20 70 50  , pPtr->pKey, pP
9cc0: 74 72 2d 3e 6e 4b 65 79 0a 20 20 20 20 29 3b 0a  tr->nKey.    );.
9cd0: 0a 20 20 20 20 69 66 28 20 65 53 65 65 6b 3d 3d  .    if( eSeek==
9ce0: 4c 53 4d 5f 53 45 45 4b 5f 45 51 20 29 20 72 65  LSM_SEEK_EQ ) re
9cf0: 74 75 72 6e 20 28 72 65 73 3d 3d 30 29 3b 0a 20  turn (res==0);. 
9d00: 20 20 20 69 66 28 20 65 53 65 65 6b 3d 3d 4c 53     if( eSeek==LS
9d10: 4d 5f 53 45 45 4b 5f 4c 45 20 29 20 72 65 74 75  M_SEEK_LE ) retu
9d20: 72 6e 20 28 72 65 73 3e 3d 30 29 3b 0a 20 20 20  rn (res>=0);.   
9d30: 20 69 66 28 20 65 53 65 65 6b 3d 3d 4c 53 4d 5f   if( eSeek==LSM_
9d40: 53 45 45 4b 5f 47 45 20 29 20 72 65 74 75 72 6e  SEEK_GE ) return
9d50: 20 28 72 65 73 3c 3d 30 29 3b 0a 20 20 7d 0a 0a   (res<=0);.  }..
9d60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
9d70: 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74  ndif..static int
9d80: 20 73 65 67 6d 65 6e 74 50 74 72 53 65 61 72 63   segmentPtrSearc
9d90: 68 4f 76 65 72 73 69 7a 65 64 28 0a 20 20 4d 75  hOversized(.  Mu
9da0: 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  ltiCursor *pCsr,
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9dc0: 20 43 75 72 73 6f 72 20 63 6f 6e 74 65 78 74 20   Cursor context 
9dd0: 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 50 74 72 20  */.  SegmentPtr 
9de0: 2a 70 50 74 72 2c 20 20 20 20 20 20 20 20 20 20  *pPtr,          
9df0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9e00: 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 69 6e 74  to seek */.  int
9e10: 20 69 54 6f 70 69 63 2c 20 20 20 20 20 20 20 20   iTopic,        
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9e30: 54 6f 70 69 63 20 6f 66 20 6b 65 79 20 74 6f 20  Topic of key to 
9e40: 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20  search for */.  
9e50: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20  void *pKey, int 
9e60: 6e 4b 65 79 20 20 20 20 20 20 20 20 20 20 20 20  nKey            
9e70: 2f 2a 20 4b 65 79 20 74 6f 20 73 65 65 6b 20 74  /* Key to seek t
9e80: 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 28 2a  o */.){.  int (*
9e90: 78 43 6d 70 29 28 76 6f 69 64 20 2a 2c 20 69 6e  xCmp)(void *, in
9ea0: 74 2c 20 76 6f 69 64 20 2a 2c 20 69 6e 74 29 20  t, void *, int) 
9eb0: 3d 20 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d  = pCsr->pDb->xCm
9ec0: 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  p;.  int rc = LS
9ed0: 4d 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  M_OK;..  /* If t
9ee0: 68 65 20 4f 56 45 52 53 49 5a 45 44 20 66 6c 61  he OVERSIZED fla
9ef0: 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
9f00: 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
9f10: 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 75  er in the.  ** u
9f20: 70 70 65 72 20 6c 65 76 65 6c 20 74 6f 20 74 68  pper level to th
9f30: 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
9f40: 68 65 20 73 65 67 6d 65 6e 74 20 74 68 61 74 20  he segment that 
9f50: 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73  contains at leas
9f60: 74 0a 20 20 2a 2a 20 6f 6e 65 20 6b 65 79 2e 20  t.  ** one key. 
9f70: 53 6f 20 63 6f 6d 70 61 72 65 20 74 68 65 20 6c  So compare the l
9f80: 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 74 68  argest key on th
9f90: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 77  e current page w
9fa0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 6b 65 79  ith the.  ** key
9fb0: 20 62 65 69 6e 67 20 73 6f 75 67 68 74 20 28 70   being sought (p
9fc0: 4b 65 79 2f 6e 4b 65 79 29 2e 20 49 66 20 28 70  Key/nKey). If (p
9fd0: 4b 65 79 2f 6e 4b 65 79 29 20 69 73 20 6c 61 72  Key/nKey) is lar
9fe0: 67 65 72 2c 20 61 64 76 61 6e 63 65 0a 20 20 2a  ger, advance.  *
9ff0: 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 70 61  * to the next pa
a000: 67 65 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  ge in the segmen
a010: 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  t that contains 
a020: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6b 65 79  at least one key
a030: 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  . .  */.  while(
a040: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 28   rc==LSM_OK && (
a050: 70 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 50 47  pPtr->flags & PG
a060: 46 54 52 5f 53 4b 49 50 5f 4e 45 58 54 5f 46 4c  FTR_SKIP_NEXT_FL
a070: 41 47 29 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  AG) ){.    u8 *p
a080: 4c 61 73 74 4b 65 79 3b 0a 20 20 20 20 69 6e 74  LastKey;.    int
a090: 20 6e 4c 61 73 74 4b 65 79 3b 0a 20 20 20 20 69   nLastKey;.    i
a0a0: 6e 74 20 69 4c 61 73 74 54 6f 70 69 63 3b 0a 20  nt iLastTopic;. 
a0b0: 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20     int res;     
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 63 6f   /* Result of co
a0e0: 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 20 20  mparison */.    
a0f0: 50 61 67 65 20 2a 70 4e 65 78 74 3b 0a 0a 20 20  Page *pNext;..  
a100: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 61    /* Load the la
a110: 73 74 20 6b 65 79 20 6f 6e 20 74 68 65 20 63 75  st key on the cu
a120: 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20  rrent page. */. 
a130: 20 20 20 70 4c 61 73 74 4b 65 79 20 3d 20 70 61     pLastKey = pa
a140: 67 65 47 65 74 4b 65 79 28 70 50 74 72 2d 3e 70  geGetKey(pPtr->p
a150: 53 65 67 2c 0a 20 20 20 20 20 20 20 20 70 50 74  Seg,.        pPt
a160: 72 2d 3e 70 50 67 2c 20 70 50 74 72 2d 3e 6e 43  r->pPg, pPtr->nC
a170: 65 6c 6c 2d 31 2c 20 26 69 4c 61 73 74 54 6f 70  ell-1, &iLastTop
a180: 69 63 2c 20 26 6e 4c 61 73 74 4b 65 79 2c 20 26  ic, &nLastKey, &
a190: 70 50 74 72 2d 3e 62 6c 6f 62 31 0a 20 20 20 20  pPtr->blob1.    
a1a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
a1b0: 65 20 6c 6f 61 64 65 64 20 6b 65 79 20 69 73 20  e loaded key is 
a1c0: 3e 3d 20 74 68 61 6e 20 28 70 4b 65 79 2f 6e 4b  >= than (pKey/nK
a1d0: 65 79 29 2c 20 62 72 65 61 6b 20 6f 75 74 20 6f  ey), break out o
a1e0: 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20  f the loop..    
a1f0: 2a 2a 20 49 66 20 28 70 4b 65 79 2f 6e 4b 65 79  ** If (pKey/nKey
a200: 29 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  ) is present in 
a210: 74 68 69 73 20 61 72 72 61 79 2c 20 69 74 20 6d  this array, it m
a220: 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 63 75  ust be on the cu
a230: 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20 70 61  rrent .    ** pa
a240: 67 65 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20  ge.  */.    res 
a250: 3d 20 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61  = sortedKeyCompa
a260: 72 65 28 0a 20 20 20 20 20 20 20 20 78 43 6d 70  re(.        xCmp
a270: 2c 20 69 4c 61 73 74 54 6f 70 69 63 2c 20 70 4c  , iLastTopic, pL
a280: 61 73 74 4b 65 79 2c 20 6e 4c 61 73 74 4b 65 79  astKey, nLastKey
a290: 2c 20 69 54 6f 70 69 63 2c 20 70 4b 65 79 2c 20  , iTopic, pKey, 
a2a0: 6e 4b 65 79 0a 20 20 20 20 29 3b 0a 20 20 20 20  nKey.    );.    
a2b0: 69 66 28 20 72 65 73 3e 3d 30 20 29 20 62 72 65  if( res>=0 ) bre
a2c0: 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61  ak;..    /* Adva
a2d0: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
a2e0: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
a2f0: 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ns at least one 
a300: 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 70 4e 65 78  key. */.    pNex
a310: 74 20 3d 20 70 50 74 72 2d 3e 70 50 67 3b 0a 20  t = pPtr->pPg;. 
a320: 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65 66 28     lsmFsPageRef(
a330: 70 4e 65 78 74 29 3b 0a 20 20 20 20 77 68 69 6c  pNext);.    whil
a340: 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 50 61  e( 1 ){.      Pa
a350: 67 65 20 2a 70 4c 6f 61 64 3b 0a 20 20 20 20 20  ge *pLoad;.     
a360: 20 75 38 20 2a 61 44 61 74 61 3b 20 69 6e 74 20   u8 *aData; int 
a370: 6e 44 61 74 61 3b 0a 0a 20 20 20 20 20 20 72 63  nData;..      rc
a380: 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65 4e 65   = lsmFsDbPageNe
a390: 78 74 28 70 50 74 72 2d 3e 70 53 65 67 2c 20 70  xt(pPtr->pSeg, p
a3a0: 4e 65 78 74 2c 20 31 2c 20 26 70 4c 6f 61 64 29  Next, 1, &pLoad)
a3b0: 3b 0a 20 20 20 20 20 20 6c 73 6d 46 73 50 61 67  ;.      lsmFsPag
a3c0: 65 52 65 6c 65 61 73 65 28 70 4e 65 78 74 29 3b  eRelease(pNext);
a3d0: 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
a3e0: 4c 6f 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20  Load;.      if( 
a3f0: 70 4e 65 78 74 3d 3d 30 20 29 20 62 72 65 61 6b  pNext==0 ) break
a400: 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
a410: 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 3b 0a 20   rc==LSM_OK );. 
a420: 20 20 20 20 20 61 44 61 74 61 20 3d 20 6c 73 6d       aData = lsm
a430: 46 73 50 61 67 65 44 61 74 61 28 70 4e 65 78 74  FsPageData(pNext
a440: 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20  , &nData);.     
a450: 20 69 66 28 20 28 70 61 67 65 47 65 74 46 6c 61   if( (pageGetFla
a460: 67 73 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29  gs(aData, nData)
a470: 20 26 20 53 45 47 4d 45 4e 54 5f 42 54 52 45 45   & SEGMENT_BTREE
a480: 5f 46 4c 41 47 29 3d 3d 30 0a 20 20 20 20 20 20  _FLAG)==0.      
a490: 20 26 26 20 70 61 67 65 47 65 74 4e 52 65 63 28   && pageGetNRec(
a4a0: 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3e 30 0a  aData, nData)>0.
a4b0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
a4c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
a4d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4e      }.    if( pN
a4e0: 65 78 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ext==0 ) break;.
a4f0: 20 20 20 20 73 65 67 6d 65 6e 74 50 74 72 53 65      segmentPtrSe
a500: 74 50 61 67 65 28 70 50 74 72 2c 20 70 4e 65 78  tPage(pPtr, pNex
a510: 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  t);..    /* This
a520: 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79   should probably
a530: 20 62 65 20 61 6e 20 4c 53 4d 5f 43 4f 52 52 55   be an LSM_CORRU
a540: 50 54 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20  PT error. */.   
a550: 20 61 73 73 65 72 74 28 20 72 63 21 3d 4c 53 4d   assert( rc!=LSM
a560: 5f 4f 4b 20 7c 7c 20 28 70 50 74 72 2d 3e 66 6c  _OK || (pPtr->fl
a570: 61 67 73 20 26 20 50 47 46 54 52 5f 53 4b 49 50  ags & PGFTR_SKIP
a580: 5f 54 48 49 53 5f 46 4c 41 47 29 20 29 3b 0a 20  _THIS_FLAG) );. 
a590: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
a5a0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .}..static int p
a5b0: 74 72 46 77 64 50 6f 69 6e 74 65 72 28 0a 20 20  trFwdPointer(.  
a5c0: 50 61 67 65 20 2a 70 50 61 67 65 2c 0a 20 20 69  Page *pPage,.  i
a5d0: 6e 74 20 69 43 65 6c 6c 2c 0a 20 20 53 65 67 6d  nt iCell,.  Segm
a5e0: 65 6e 74 20 2a 70 53 65 67 2c 0a 20 20 50 67 6e  ent *pSeg,.  Pgn
a5f0: 6f 20 2a 70 69 50 74 72 2c 0a 20 20 69 6e 74 20  o *piPtr,.  int 
a600: 2a 70 62 46 6f 75 6e 64 0a 29 7b 0a 20 20 50 61  *pbFound.){.  Pa
a610: 67 65 20 2a 70 50 67 20 3d 20 70 50 61 67 65 3b  ge *pPg = pPage;
a620: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20  .  int iFirst = 
a630: 69 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 20  iCell;.  int rc 
a640: 3d 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20 20 64 6f 20  = LSM_OK;..  do 
a650: 7b 0a 20 20 20 20 50 61 67 65 20 2a 70 4e 65 78  {.    Page *pNex
a660: 74 20 3d 20 30 3b 0a 20 20 20 20 75 38 20 2a 61  t = 0;.    u8 *a
a670: 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 6e 44  Data;.    int nD
a680: 61 74 61 3b 0a 0a 20 20 20 20 61 44 61 74 61 20  ata;..    aData 
a690: 3d 20 6c 73 6d 46 73 50 61 67 65 44 61 74 61 28  = lsmFsPageData(
a6a0: 70 50 67 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20  pPg, &nData);.  
a6b0: 20 20 69 66 28 20 28 70 61 67 65 47 65 74 46 6c    if( (pageGetFl
a6c0: 61 67 73 28 61 44 61 74 61 2c 20 6e 44 61 74 61  ags(aData, nData
a6d0: 29 20 26 20 53 45 47 4d 45 4e 54 5f 42 54 52 45  ) & SEGMENT_BTRE
a6e0: 45 5f 46 4c 41 47 29 3d 3d 30 20 29 7b 0a 20 20  E_FLAG)==0 ){.  
a6f0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
a700: 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 61 67   int nCell = pag
a710: 65 47 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20  eGetNRec(aData, 
a720: 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 66 6f  nData);.      fo
a730: 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 6e 43  r(i=iFirst; i<nC
a740: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
a750: 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 2a 70     u8 eType = *p
a760: 61 67 65 47 65 74 43 65 6c 6c 28 61 44 61 74 61  ageGetCell(aData
a770: 2c 20 6e 44 61 74 61 2c 20 69 29 3b 0a 20 20 20  , nData, i);.   
a780: 20 20 20 20 20 69 66 28 20 28 65 54 79 70 65 20       if( (eType 
a790: 26 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45  & LSM_START_DELE
a7a0: 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
a7b0: 20 20 20 20 2a 70 62 46 6f 75 6e 64 20 3d 20 31      *pbFound = 1
a7c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 69 50  ;.          *piP
a7d0: 74 72 20 3d 20 70 61 67 65 47 65 74 52 65 63 6f  tr = pageGetReco
a7e0: 72 64 50 74 72 28 61 44 61 74 61 2c 20 6e 44 61  rdPtr(aData, nDa
a7f0: 74 61 2c 20 69 29 20 2b 20 70 61 67 65 47 65 74  ta, i) + pageGet
a800: 50 74 72 28 61 44 61 74 61 2c 20 6e 44 61 74 61  Ptr(aData, nData
a810: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 73 6d  );.          lsm
a820: 46 73 50 61 67 65 52 65 6c 65 61 73 65 28 70 50  FsPageRelease(pP
a830: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
a840: 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 20  turn LSM_OK;.   
a850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a860: 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 6c     }..    rc = l
a870: 73 6d 46 73 44 62 50 61 67 65 4e 65 78 74 28 70  smFsDbPageNext(p
a880: 53 65 67 2c 20 70 50 67 2c 20 31 2c 20 26 70 4e  Seg, pPg, 1, &pN
a890: 65 78 74 29 3b 0a 20 20 20 20 6c 73 6d 46 73 50  ext);.    lsmFsP
a8a0: 61 67 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  ageRelease(pPg);
a8b0: 0a 20 20 20 20 70 50 67 20 3d 20 70 4e 65 78 74  .    pPg = pNext
a8c0: 3b 0a 20 20 20 20 69 46 69 72 73 74 20 3d 20 30  ;.    iFirst = 0
a8d0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 50 67 20  ;.  }while( pPg 
a8e0: 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 3b  && rc==LSM_OK );
a8f0: 0a 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65  .  lsmFsPageRele
a900: 61 73 65 28 70 50 67 29 3b 0a 0a 20 20 2a 70 62  ase(pPg);..  *pb
a910: 46 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74  Found = 0;.  ret
a920: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
a930: 63 20 69 6e 74 20 73 6f 72 74 65 64 52 68 73 46  c int sortedRhsF
a940: 69 72 73 74 28 4d 75 6c 74 69 43 75 72 73 6f 72  irst(MultiCursor
a950: 20 2a 70 43 73 72 2c 20 4c 65 76 65 6c 20 2a 70   *pCsr, Level *p
a960: 4c 76 6c 2c 20 53 65 67 6d 65 6e 74 50 74 72 20  Lvl, SegmentPtr 
a970: 2a 70 50 74 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pPtr){.  int rc
a980: 3b 0a 20 20 72 63 20 3d 20 73 65 67 6d 65 6e 74  ;.  rc = segment
a990: 50 74 72 45 6e 64 28 70 43 73 72 2c 20 70 50 74  PtrEnd(pCsr, pPt
a9a0: 72 2c 20 30 29 3b 0a 20 20 77 68 69 6c 65 28 20  r, 0);.  while( 
a9b0: 70 50 74 72 2d 3e 70 50 67 20 26 26 20 72 63 3d  pPtr->pPg && rc=
a9c0: 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  =LSM_OK ){.    i
a9d0: 6e 74 20 72 65 73 20 3d 20 73 6f 72 74 65 64 4b  nt res = sortedK
a9e0: 65 79 43 6f 6d 70 61 72 65 28 70 43 73 72 2d 3e  eyCompare(pCsr->
a9f0: 70 44 62 2d 3e 78 43 6d 70 2c 0a 20 20 20 20 20  pDb->xCmp,.     
aa00: 20 20 20 70 4c 76 6c 2d 3e 69 53 70 6c 69 74 54     pLvl->iSplitT
aa10: 6f 70 69 63 2c 20 70 4c 76 6c 2d 3e 70 53 70 6c  opic, pLvl->pSpl
aa20: 69 74 4b 65 79 2c 20 70 4c 76 6c 2d 3e 6e 53 70  itKey, pLvl->nSp
aa30: 6c 69 74 4b 65 79 2c 0a 20 20 20 20 20 20 20 20  litKey,.        
aa40: 72 74 54 6f 70 69 63 28 70 50 74 72 2d 3e 65 54  rtTopic(pPtr->eT
aa50: 79 70 65 29 2c 20 70 50 74 72 2d 3e 70 4b 65 79  ype), pPtr->pKey
aa60: 2c 20 70 50 74 72 2d 3e 6e 4b 65 79 0a 20 20 20  , pPtr->nKey.   
aa70: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c   );.    if( res<
aa80: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
aa90: 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 41  rc = segmentPtrA
aaa0: 64 76 61 6e 63 65 28 70 43 73 72 2c 20 70 50 74  dvance(pCsr, pPt
aab0: 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  r, 0);.  }.  ret
aac0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
aad0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
aae0: 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
aaf0: 74 20 6f 66 20 61 20 53 45 45 4b 5f 47 45 20 6f  t of a SEEK_GE o
ab00: 70 20 6f 6e 20 61 20 6d 75 6c 74 69 2d 63 75 72  p on a multi-cur
ab10: 73 6f 72 20 69 66 20 74 68 65 20 0a 2a 2a 20 46  sor if the .** F
ab20: 43 20 70 6f 69 6e 74 65 72 20 72 65 61 64 20 66  C pointer read f
ab30: 72 6f 6d 20 73 65 67 6d 65 6e 74 20 2a 70 50 74  rom segment *pPt
ab40: 72 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20  r comes from an 
ab50: 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 0a  entry with the .
ab60: 2a 2a 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c  ** LSM_START_DEL
ab70: 45 54 45 20 66 6c 61 67 20 73 65 74 2e 20 49 6e  ETE flag set. In
ab80: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
ab90: 6f 69 6e 74 65 72 20 76 61 6c 75 65 20 63 61 6e  ointer value can
aba0: 6e 6f 74 20 62 65 20 0a 2a 2a 20 74 72 75 73 74  not be .** trust
abb0: 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  ed. Instead, the
abc0: 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68   pointer that sh
abd0: 6f 75 6c 64 20 62 65 20 66 6f 6c 6c 6f 77 65 64  ould be followed
abe0: 20 69 73 20 74 68 61 74 20 61 73 73 6f 63 69 61   is that associa
abf0: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
ac00: 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 2a 70  next entry in *p
ac10: 50 74 72 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  Ptr that does no
ac20: 74 20 68 61 76 65 20 4c 53 4d 5f 53 54 41 52 54  t have LSM_START
ac30: 5f 44 45 4c 45 54 45 20 73 65 74 2e 0a 2a 2a 0a  _DELETE set..**.
ac40: 2a 2a 20 57 68 79 20 74 68 65 20 70 6f 69 6e 74  ** Why the point
ac50: 65 72 73 20 63 61 6e 27 74 20 62 65 20 74 72 75  ers can't be tru
ac60: 73 74 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 0a 2a  sted:.**.**.**.*
ac70: 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 69 73 20  * TODO: This is 
ac80: 61 20 73 74 6f 70 2d 67 61 70 20 73 6f 6c 75 74  a stop-gap solut
ac90: 69 6f 6e 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 41 74  ion:.** .**   At
aca0: 20 74 68 65 20 6d 6f 6d 65 6e 74 2c 20 74 68 69   the moment, thi
acb0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
acc0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
acd0: 20 73 65 67 6d 65 6e 74 50 74 72 53 65 65 6b 28   segmentPtrSeek(
ace0: 29 2c 20 0a 2a 2a 20 20 20 61 73 20 70 61 72 74  ), .**   as part
acf0: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20   of the initial 
ad00: 6c 73 6d 4d 43 75 72 73 6f 72 53 65 65 6b 28 29  lsmMCursorSeek()
ad10: 20 63 61 6c 6c 2e 20 48 6f 77 65 76 65 72 2c 20   call. However, 
ad20: 63 6f 6e 73 69 64 65 72 20 61 20 0a 2a 2a 20 20  consider a .**  
ad30: 20 64 61 74 61 62 61 73 65 20 77 68 65 72 65 20   database where 
ad40: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61  the following ha
ad50: 73 20 6f 63 63 75 72 72 65 64 3a 0a 2a 2a 0a 2a  s occurred:.**.*
ad60: 2a 20 20 20 20 20 20 31 2e 20 41 20 72 61 6e 67  *      1. A rang
ad70: 65 20 64 65 6c 65 74 65 20 72 65 6d 6f 76 65 73  e delete removes
ad80: 20 6b 65 79 73 20 31 2e 2e 39 39 39 39 20 75 73   keys 1..9999 us
ad90: 69 6e 67 20 61 20 72 61 6e 67 65 20 64 65 6c 65  ing a range dele
ada0: 74 65 2e 0a 2a 2a 20 20 20 20 20 20 32 2e 20 4b  te..**      2. K
adb0: 65 79 73 20 31 20 74 68 72 6f 75 67 68 20 39 39  eys 1 through 99
adc0: 39 39 20 61 72 65 20 72 65 69 6e 73 65 72 74 65  99 are reinserte
add0: 64 2e 0a 2a 2a 20 20 20 20 20 20 33 2e 20 54 68  d..**      3. Th
ade0: 65 20 6c 65 76 65 6c 73 20 63 6f 6e 74 61 69 6e  e levels contain
adf0: 69 6e 67 20 74 68 65 20 6f 70 73 20 69 6e 20 31  ing the ops in 1
ae00: 2e 20 61 6e 64 20 32 2e 20 61 62 6f 76 65 20 61  . and 2. above a
ae10: 72 65 20 6d 65 72 67 65 64 2e 20 43 61 6c 6c 0a  re merged. Call.
ae20: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 69 73 20  **         this 
ae30: 6c 65 76 65 6c 20 4e 2e 20 4c 65 76 65 6c 20 4e  level N. Level N
ae40: 20 63 6f 6e 74 61 69 6e 73 20 46 43 20 70 6f 69   contains FC poi
ae50: 6e 74 65 72 73 20 74 6f 20 6c 65 76 65 6c 20 4e  nters to level N
ae60: 2b 31 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  +1..**.**   Then
ae70: 2c 20 69 66 20 74 68 65 20 75 73 65 72 20 61 74  , if the user at
ae80: 74 65 6d 70 74 73 20 74 6f 20 71 75 65 72 79 20  tempts to query 
ae90: 66 6f 72 20 28 6b 65 79 3e 3d 32 20 4c 49 4d 49  for (key>=2 LIMI
aea0: 54 20 31 30 29 2c 20 74 68 65 20 0a 2a 2a 20 20  T 10), the .**  
aeb0: 20 6c 73 6d 4d 43 75 72 73 6f 72 53 65 65 6b 28   lsmMCursorSeek(
aec0: 29 20 63 61 6c 6c 20 77 69 6c 6c 20 69 74 65 72  ) call will iter
aed0: 61 74 65 20 74 68 72 6f 75 67 68 20 39 39 39 38  ate through 9998
aee0: 20 65 6e 74 72 69 65 73 20 73 65 61 72 63 68 69   entries searchi
aef0: 6e 67 20 66 6f 72 20 61 20 0a 2a 2a 20 20 20 70  ng for a .**   p
af00: 6f 69 6e 74 65 72 20 64 6f 77 6e 20 74 6f 20 74  ointer down to t
af10: 68 65 20 6c 65 76 65 6c 20 4e 2b 31 20 74 68 61  he level N+1 tha
af20: 74 20 69 73 20 6e 65 76 65 72 20 61 63 74 75 61  t is never actua
af30: 6c 6c 79 20 75 73 65 64 2e 20 49 74 20 77 6f 75  lly used. It wou
af40: 6c 64 20 62 65 0a 2a 2a 20 20 20 6d 75 63 68 20  ld be.**   much 
af50: 62 65 74 74 65 72 20 69 66 20 74 68 65 20 6d 75  better if the mu
af60: 6c 74 69 2d 63 75 72 73 6f 72 20 63 6f 75 6c 64  lti-cursor could
af70: 20 64 6f 20 74 68 69 73 20 6c 61 7a 69 6c 79 20   do this lazily 
af80: 2d 20 6f 6e 6c 79 20 73 65 65 6b 20 74 6f 20 74  - only seek to t
af90: 68 65 0a 2a 2a 20 20 20 6c 65 76 65 6c 20 28 4e  he.**   level (N
afa0: 2b 31 29 20 70 61 67 65 20 61 66 74 65 72 20 74  +1) page after t
afb0: 68 65 20 75 73 65 72 20 68 61 73 20 6d 6f 76 65  he user has move
afc0: 64 20 74 68 65 20 63 75 72 73 6f 72 20 6f 6e 20  d the cursor on 
afd0: 6c 65 76 65 6c 20 4e 20 70 61 73 73 65 64 0a 2a  level N passed.*
afe0: 2a 20 20 20 74 68 65 20 62 69 67 20 72 61 6e 67  *   the big rang
aff0: 65 2d 64 65 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61  e-delete..*/.sta
b000: 74 69 63 20 69 6e 74 20 73 65 67 6d 65 6e 74 50  tic int segmentP
b010: 74 72 46 77 64 50 6f 69 6e 74 65 72 28 0a 20 20  trFwdPointer(.  
b020: 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73  MultiCursor *pCs
b030: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
b040: 2f 2a 20 4d 75 6c 74 69 2d 63 75 72 73 6f 72 20  /* Multi-cursor 
b050: 70 50 74 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  pPtr belongs to 
b060: 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 50 74 72 20  */.  SegmentPtr 
b070: 2a 70 50 74 72 2c 20 20 20 20 20 20 20 20 20 20  *pPtr,          
b080: 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 2d       /* Segment-
b090: 70 6f 69 6e 74 65 72 20 74 6f 20 65 78 74 72 61  pointer to extra
b0a0: 63 74 20 46 43 20 70 74 72 20 66 72 6f 6d 20 2a  ct FC ptr from *
b0b0: 2f 0a 20 20 50 67 6e 6f 20 2a 70 69 50 74 72 20  /.  Pgno *piPtr 
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0d0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 43 20 70      /* OUT: FC p
b0e0: 6f 69 6e 74 65 72 20 76 61 6c 75 65 20 2a 2f 0a  ointer value */.
b0f0: 29 7b 0a 20 20 4c 65 76 65 6c 20 2a 70 4c 76 6c  ){.  Level *pLvl
b100: 20 3d 20 70 50 74 72 2d 3e 70 4c 65 76 65 6c 3b   = pPtr->pLevel;
b110: 0a 20 20 4c 65 76 65 6c 20 2a 70 4e 65 78 74 20  .  Level *pNext 
b120: 3d 20 70 4c 76 6c 2d 3e 70 4e 65 78 74 3b 0a 20  = pLvl->pNext;. 
b130: 20 50 61 67 65 20 2a 70 50 67 20 3d 20 70 50 74   Page *pPg = pPt
b140: 72 2d 3e 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r->pPg;.  int rc
b150: 3b 0a 20 20 69 6e 74 20 62 46 6f 75 6e 64 3b 0a  ;.  int bFound;.
b160: 20 20 50 67 6e 6f 20 69 4f 75 74 20 3d 20 30 3b    Pgno iOut = 0;
b170: 0a 0a 20 20 69 66 28 20 70 50 74 72 2d 3e 70 53  ..  if( pPtr->pS
b180: 65 67 3d 3d 26 70 4c 76 6c 2d 3e 6c 68 73 20 7c  eg==&pLvl->lhs |
b190: 7c 20 70 50 74 72 2d 3e 70 53 65 67 3d 3d 26 70  | pPtr->pSeg==&p
b1a0: 4c 76 6c 2d 3e 61 52 68 73 5b 70 4c 76 6c 2d 3e  Lvl->aRhs[pLvl->
b1b0: 6e 52 69 67 68 74 2d 31 5d 20 29 7b 0a 20 20 20  nRight-1] ){.   
b1c0: 20 69 66 28 20 70 4e 65 78 74 3d 3d 30 20 0a 20   if( pNext==0 . 
b1d0: 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 78 74         || (pNext
b1e0: 2d 3e 6e 52 69 67 68 74 3d 3d 30 20 26 26 20 70  ->nRight==0 && p
b1f0: 4e 65 78 74 2d 3e 6c 68 73 2e 69 52 6f 6f 74 29  Next->lhs.iRoot)
b200: 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
b210: 78 74 2d 3e 6e 52 69 67 68 74 21 3d 30 20 26 26  xt->nRight!=0 &&
b220: 20 70 4e 65 78 74 2d 3e 61 52 68 73 5b 30 5d 2e   pNext->aRhs[0].
b230: 69 52 6f 6f 74 29 0a 20 20 20 20 20 20 29 7b 0a  iRoot).      ){.
b240: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
b250: 69 6e 67 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ing. The pointer
b260: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
b270: 64 20 61 6e 79 77 61 79 2e 20 2a 2f 0a 20 20 20  d anyway. */.   
b280: 20 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b     return LSM_OK
b290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
b2a0: 0a 20 20 20 20 69 66 28 20 70 50 74 72 5b 31 5d  .    if( pPtr[1]
b2b0: 2e 70 53 65 67 2d 3e 69 52 6f 6f 74 20 29 7b 0a  .pSeg->iRoot ){.
b2c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 4c 53 4d        return LSM
b2d0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
b2e0: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
b2f0: 61 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e  a pointer within
b300: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 67   the current seg
b310: 6d 65 6e 74 2e 20 2a 2f 0a 20 20 6c 73 6d 46 73  ment. */.  lsmFs
b320: 50 61 67 65 52 65 66 28 70 50 67 29 3b 0a 20 20  PageRef(pPg);.  
b330: 72 63 20 3d 20 70 74 72 46 77 64 50 6f 69 6e 74  rc = ptrFwdPoint
b340: 65 72 28 70 50 67 2c 20 70 50 74 72 2d 3e 69 43  er(pPg, pPtr->iC
b350: 65 6c 6c 2c 20 70 50 74 72 2d 3e 70 53 65 67 2c  ell, pPtr->pSeg,
b360: 20 26 69 4f 75 74 2c 20 26 62 46 6f 75 6e 64 29   &iOut, &bFound)
b370: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d  ;..  if( rc==LSM
b380: 5f 4f 4b 20 26 26 20 62 46 6f 75 6e 64 3d 3d 30  _OK && bFound==0
b390: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
b3a0: 63 61 73 65 20 68 61 70 70 65 6e 73 20 77 68 65  case happens whe
b3b0: 6e 20 70 50 74 72 20 70 6f 69 6e 74 73 20 74 6f  n pPtr points to
b3c0: 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73   the left-hand-s
b3d0: 69 64 65 20 6f 66 20 61 20 73 65 67 6d 65 6e 74  ide of a segment
b3e0: 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c  .    ** currentl
b3f0: 79 20 75 6e 64 65 72 67 6f 69 6e 67 20 61 6e 20  y undergoing an 
b400: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
b410: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
b420: 20 6a 75 6d 70 20 74 6f 20 74 68 65 0a 20 20 20   jump to the.   
b430: 20 2a 2a 20 6f 6c 64 65 73 74 20 73 65 67 6d 65   ** oldest segme
b440: 6e 74 20 69 6e 20 74 68 65 20 72 69 67 68 74 2d  nt in the right-
b450: 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65  hand-side of the
b460: 20 73 61 6d 65 20 6c 65 76 65 6c 20 61 6e 64 20   same level and 
b470: 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 2a 2a 20  continue.    ** 
b480: 73 65 61 72 63 68 69 6e 67 2e 20 42 75 74 20 2d  searching. But -
b490: 20 64 6f 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   do not consider
b4a0: 20 61 6e 79 20 6b 65 79 73 20 73 6d 61 6c 6c 65   any keys smalle
b4b0: 72 20 74 68 61 6e 20 74 68 65 20 6c 65 76 65 6c  r than the level
b4c0: 73 0a 20 20 20 20 2a 2a 20 73 70 6c 69 74 2d 6b  s.    ** split-k
b4d0: 65 79 2e 20 2a 2f 0a 20 20 20 20 53 65 67 6d 65  ey. */.    Segme
b4e0: 6e 74 50 74 72 20 70 74 72 3b 0a 0a 20 20 20 20  ntPtr ptr;..    
b4f0: 69 66 28 20 70 50 74 72 2d 3e 70 4c 65 76 65 6c  if( pPtr->pLevel
b500: 2d 3e 6e 52 69 67 68 74 3d 3d 30 20 7c 7c 20 70  ->nRight==0 || p
b510: 50 74 72 2d 3e 70 53 65 67 21 3d 26 70 50 74 72  Ptr->pSeg!=&pPtr
b520: 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68 73 20 29 7b  ->pLevel->lhs ){
b530: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4c 53  .      return LS
b540: 4d 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  M_CORRUPT_BKPT;.
b550: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 6d 73 65      }..    memse
b560: 74 28 26 70 74 72 2c 20 30 2c 20 73 69 7a 65 6f  t(&ptr, 0, sizeo
b570: 66 28 53 65 67 6d 65 6e 74 50 74 72 29 29 3b 0a  f(SegmentPtr));.
b580: 20 20 20 20 70 74 72 2e 70 4c 65 76 65 6c 20 3d      ptr.pLevel =
b590: 20 70 50 74 72 2d 3e 70 4c 65 76 65 6c 3b 0a 20   pPtr->pLevel;. 
b5a0: 20 20 20 70 74 72 2e 70 53 65 67 20 3d 20 26 70     ptr.pSeg = &p
b5b0: 74 72 2e 70 4c 65 76 65 6c 2d 3e 61 52 68 73 5b  tr.pLevel->aRhs[
b5c0: 70 74 72 2e 70 4c 65 76 65 6c 2d 3e 6e 52 69 67  ptr.pLevel->nRig
b5d0: 68 74 2d 31 5d 3b 0a 20 20 20 20 72 63 20 3d 20  ht-1];.    rc = 
b5e0: 73 6f 72 74 65 64 52 68 73 46 69 72 73 74 28 70  sortedRhsFirst(p
b5f0: 43 73 72 2c 20 70 74 72 2e 70 4c 65 76 65 6c 2c  Csr, ptr.pLevel,
b600: 20 26 70 74 72 29 3b 0a 20 20 20 20 69 66 28 20   &ptr);.    if( 
b610: 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
b620: 20 20 20 20 72 63 20 3d 20 70 74 72 46 77 64 50      rc = ptrFwdP
b630: 6f 69 6e 74 65 72 28 70 74 72 2e 70 50 67 2c 20  ointer(ptr.pPg, 
b640: 70 74 72 2e 69 43 65 6c 6c 2c 20 70 74 72 2e 70  ptr.iCell, ptr.p
b650: 53 65 67 2c 20 26 69 4f 75 74 2c 20 26 62 46 6f  Seg, &iOut, &bFo
b660: 75 6e 64 29 3b 0a 20 20 20 20 20 20 70 74 72 2e  und);.      ptr.
b670: 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  pPg = 0;.    }. 
b680: 20 20 20 73 65 67 6d 65 6e 74 50 74 72 52 65 73     segmentPtrRes
b690: 65 74 28 26 70 74 72 2c 20 30 29 3b 0a 20 20 7d  et(&ptr, 0);.  }
b6a0: 0a 0a 20 20 2a 70 69 50 74 72 20 3d 20 69 4f 75  ..  *piPtr = iOu
b6b0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
b6c0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  }..static int se
b6d0: 67 6d 65 6e 74 50 74 72 53 65 65 6b 28 0a 20 20  gmentPtrSeek(.  
b6e0: 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73  MultiCursor *pCs
b6f0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
b700: 2f 2a 20 43 75 72 73 6f 72 20 63 6f 6e 74 65 78  /* Cursor contex
b710: 74 20 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 50 74  t */.  SegmentPt
b720: 72 20 2a 70 50 74 72 2c 20 20 20 20 20 20 20 20  r *pPtr,        
b730: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
b740: 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 69  r to seek */.  i
b750: 6e 74 20 69 54 6f 70 69 63 2c 20 20 20 20 20 20  nt iTopic,      
b760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b770: 2a 20 4b 65 79 20 74 6f 70 69 63 20 74 6f 20 73  * Key topic to s
b780: 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 76 6f 69 64  eek to */.  void
b790: 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79   *pKey, int nKey
b7a0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b  ,           /* K
b7b0: 65 79 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  ey to seek to */
b7c0: 0a 20 20 69 6e 74 20 65 53 65 65 6b 2c 20 20 20  .  int eSeek,   
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 62 69 61     /* Search bia
b7f0: 73 20 2d 20 73 65 65 20 61 62 6f 76 65 20 2a 2f  s - see above */
b800: 0a 20 20 69 6e 74 20 2a 70 69 50 74 72 2c 20 20  .  int *piPtr,  
b810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b820: 20 20 20 2f 2a 20 4f 55 54 3a 20 46 43 20 70 6f     /* OUT: FC po
b830: 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  inter */.  int *
b840: 70 62 53 74 6f 70 0a 29 7b 0a 20 20 69 6e 74 20  pbStop.){.  int 
b850: 28 2a 78 43 6d 70 29 28 76 6f 69 64 20 2a 2c 20  (*xCmp)(void *, 
b860: 69 6e 74 2c 20 76 6f 69 64 20 2a 2c 20 69 6e 74  int, void *, int
b870: 29 20 3d 20 70 43 73 72 2d 3e 70 44 62 2d 3e 78  ) = pCsr->pDb->x
b880: 43 6d 70 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d  Cmp;.  int res =
b890: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b8a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b8b0: 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73  sult of comparis
b8c0: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
b8d0: 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f    int rc = LSM_O
b8e0: 4b 3b 0a 20 20 69 6e 74 20 69 4d 69 6e 3b 0a 20  K;.  int iMin;. 
b8f0: 20 69 6e 74 20 69 4d 61 78 3b 0a 20 20 50 67 6e   int iMax;.  Pgn
b900: 6f 20 69 50 74 72 4f 75 74 20 3d 20 30 3b 0a 0a  o iPtrOut = 0;..
b910: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
b920: 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  ent page contain
b930: 73 20 61 6e 20 6f 76 65 72 73 69 7a 65 64 20 65  s an oversized e
b940: 6e 74 72 79 2c 20 74 68 65 6e 20 74 68 65 72 65  ntry, then there
b950: 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 70 6f 69   are no.  ** poi
b960: 6e 74 65 72 73 20 74 6f 20 6f 6e 65 20 6f 72 20  nters to one or 
b970: 6d 6f 72 65 20 6f 66 20 74 68 65 20 73 75 62 73  more of the subs
b980: 65 71 75 65 6e 74 20 70 61 67 65 73 20 69 6e 20  equent pages in 
b990: 74 68 65 20 73 6f 72 74 65 64 20 72 75 6e 2e 0a  the sorted run..
b9a0: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
b9b0: 6e 67 20 63 61 6c 6c 20 65 6e 73 75 72 65 73 20  ng call ensures 
b9c0: 74 68 61 74 20 74 68 65 20 73 65 67 6d 65 6e 74  that the segment
b9d0: 2d 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  -ptr points to t
b9e0: 68 65 20 63 6f 72 72 65 63 74 20 0a 20 20 2a 2a  he correct .  **
b9f0: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
ba00: 73 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  se.  */.  rc = s
ba10: 65 67 6d 65 6e 74 50 74 72 53 65 61 72 63 68 4f  egmentPtrSearchO
ba20: 76 65 72 73 69 7a 65 64 28 70 43 73 72 2c 20 70  versized(pCsr, p
ba30: 50 74 72 2c 20 69 54 6f 70 69 63 2c 20 70 4b 65  Ptr, iTopic, pKe
ba40: 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 69 50 74 72  y, nKey);.  iPtr
ba50: 4f 75 74 20 3d 20 70 50 74 72 2d 3e 69 50 74 72  Out = pPtr->iPtr
ba60: 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
ba70: 68 61 74 20 74 68 69 73 20 70 61 67 65 20 69 73  hat this page is
ba80: 20 74 68 65 20 72 69 67 68 74 20 70 61 67 65 20   the right page 
ba90: 6f 66 20 74 68 69 73 20 73 65 67 6d 65 6e 74 20  of this segment 
baa0: 66 6f 72 20 74 68 65 20 6b 65 79 0a 20 20 2a 2a  for the key.  **
bab0: 20 74 68 61 74 20 77 65 20 61 72 65 20 73 65 61   that we are sea
bac0: 72 63 68 69 6e 67 20 66 6f 72 2e 20 44 6f 20 74  rching for. Do t
bad0: 68 69 73 20 62 79 20 6c 6f 61 64 69 6e 67 20 70  his by loading p
bae0: 61 67 65 20 28 69 50 67 2d 31 29 20 61 6e 64 20  age (iPg-1) and 
baf0: 74 65 73 74 69 6e 67 0a 20 20 2a 2a 20 74 68 61  testing.  ** tha
bb00: 74 20 70 4b 65 79 2f 6e 4b 65 79 20 69 73 20 67  t pKey/nKey is g
bb10: 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
bb20: 6b 65 79 73 20 6f 6e 20 74 68 61 74 20 70 61 67  keys on that pag
bb30: 65 2c 20 61 6e 64 20 74 68 65 6e 20 62 79 20 0a  e, and then by .
bb40: 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 28 69 50    ** loading (iP
bb50: 67 2b 31 29 20 61 6e 64 20 74 65 73 74 69 6e 67  g+1) and testing
bb60: 20 74 68 61 74 20 70 4b 65 79 2f 6e 4b 65 79 20   that pKey/nKey 
bb70: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
bb80: 61 6c 6c 0a 20 20 2a 2a 20 74 68 65 20 6b 65 79  all.  ** the key
bb90: 73 20 69 74 20 68 6f 75 73 65 73 2e 20 20 0a 20  s it houses.  . 
bba0: 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 57   **.  ** TODO: W
bbb0: 69 74 68 20 72 61 6e 67 65 2d 64 65 6c 65 74 65  ith range-delete
bbc0: 73 20 69 6e 20 74 68 65 20 74 72 65 65 2c 20 74  s in the tree, t
bbd0: 68 65 20 74 65 73 74 20 64 65 73 63 72 69 62 65  he test describe
bbe0: 64 20 61 62 6f 76 65 20 6d 61 79 20 66 61 69 6c  d above may fail
bbf0: 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  ..  */.#if 0.  a
bc00: 73 73 65 72 74 28 20 61 73 73 65 72 74 4b 65 79  ssert( assertKey
bc10: 4c 6f 63 61 74 69 6f 6e 28 70 43 73 72 2c 20 70  Location(pCsr, p
bc20: 50 74 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29  Ptr, pKey, nKey)
bc30: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   );.#endif..  as
bc40: 73 65 72 74 28 20 70 50 74 72 2d 3e 6e 43 65 6c  sert( pPtr->nCel
bc50: 6c 3e 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  l>0 .       || p
bc60: 50 74 72 2d 3e 70 53 65 67 2d 3e 6e 53 69 7a 65  Ptr->pSeg->nSize
bc70: 3d 3d 31 20 0a 20 20 20 20 20 20 20 7c 7c 20 6c  ==1 .       || l
bc80: 73 6d 46 73 44 62 50 61 67 65 49 73 4c 61 73 74  smFsDbPageIsLast
bc90: 28 70 50 74 72 2d 3e 70 53 65 67 2c 20 70 50 74  (pPtr->pSeg, pPt
bca0: 72 2d 3e 70 50 67 29 0a 20 20 29 3b 0a 20 20 69  r->pPg).  );.  i
bcb0: 66 28 20 70 50 74 72 2d 3e 6e 43 65 6c 6c 3d 3d  f( pPtr->nCell==
bcc0: 30 20 29 7b 0a 20 20 20 20 73 65 67 6d 65 6e 74  0 ){.    segment
bcd0: 50 74 72 52 65 73 65 74 28 70 50 74 72 2c 20 4c  PtrReset(pPtr, L
bce0: 53 4d 5f 53 45 47 4d 45 4e 54 50 54 52 5f 46 52  SM_SEGMENTPTR_FR
bcf0: 45 45 5f 54 48 52 45 53 48 4f 4c 44 29 3b 0a 20  EE_THRESHOLD);. 
bd00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4d 69 6e   }else{.    iMin
bd10: 20 3d 20 30 3b 0a 20 20 20 20 69 4d 61 78 20 3d   = 0;.    iMax =
bd20: 20 70 50 74 72 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a   pPtr->nCell-1;.
bd30: 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b  .    while( 1 ){
bd40: 0a 20 20 20 20 20 20 69 6e 74 20 69 54 72 79 20  .      int iTry 
bd50: 3d 20 28 69 4d 69 6e 2b 69 4d 61 78 29 2f 32 3b  = (iMin+iMax)/2;
bd60: 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  .      void *pKe
bd70: 79 54 3b 20 69 6e 74 20 6e 4b 65 79 54 3b 20 20  yT; int nKeyT;  
bd80: 20 20 20 20 20 2f 2a 20 4b 65 79 20 66 6f 72 20       /* Key for 
bd90: 63 65 6c 6c 20 69 54 72 79 20 2a 2f 0a 20 20 20  cell iTry */.   
bda0: 20 20 20 69 6e 74 20 69 54 6f 70 69 63 54 3b 0a     int iTopicT;.
bdb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
bdc0: 54 72 79 3c 69 4d 61 78 20 7c 7c 20 69 4d 69 6e  Try<iMax || iMin
bdd0: 3d 3d 69 4d 61 78 20 29 3b 0a 0a 20 20 20 20 20  ==iMax );..     
bde0: 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72   rc = segmentPtr
bdf0: 4c 6f 61 64 43 65 6c 6c 28 70 50 74 72 2c 20 69  LoadCell(pPtr, i
be00: 54 72 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Try);.      if( 
be10: 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 62 72 65  rc!=LSM_OK ) bre
be20: 61 6b 3b 0a 0a 20 20 20 20 20 20 73 65 67 6d 65  ak;..      segme
be30: 6e 74 50 74 72 4b 65 79 28 70 50 74 72 2c 20 26  ntPtrKey(pPtr, &
be40: 70 4b 65 79 54 2c 20 26 6e 4b 65 79 54 29 3b 0a  pKeyT, &nKeyT);.
be50: 20 20 20 20 20 20 69 54 6f 70 69 63 54 20 3d 20        iTopicT = 
be60: 72 74 54 6f 70 69 63 28 70 50 74 72 2d 3e 65 54  rtTopic(pPtr->eT
be70: 79 70 65 29 3b 0a 0a 20 20 20 20 20 20 72 65 73  ype);..      res
be80: 20 3d 20 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70   = sortedKeyComp
be90: 61 72 65 28 78 43 6d 70 2c 20 69 54 6f 70 69 63  are(xCmp, iTopic
bea0: 54 2c 20 70 4b 65 79 54 2c 20 6e 4b 65 79 54 2c  T, pKeyT, nKeyT,
beb0: 20 69 54 6f 70 69 63 2c 20 70 4b 65 79 2c 20 6e   iTopic, pKey, n
bec0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
bed0: 72 65 73 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  res<=0 ){.      
bee0: 20 20 69 50 74 72 4f 75 74 20 3d 20 70 50 74 72    iPtrOut = pPtr
bef0: 2d 3e 69 50 74 72 20 2b 20 70 50 74 72 2d 3e 69  ->iPtr + pPtr->i
bf00: 50 67 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 0a  PgPtr;.      }..
bf10: 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
bf20: 20 7c 7c 20 69 4d 69 6e 3d 3d 69 4d 61 78 20 29   || iMin==iMax )
bf30: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
bf40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
bf50: 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20   res>0 ){.      
bf60: 20 20 69 4d 61 78 20 3d 20 4c 53 4d 5f 4d 41 58    iMax = LSM_MAX
bf70: 28 69 54 72 79 2d 31 2c 20 69 4d 69 6e 29 3b 0a  (iTry-1, iMin);.
bf80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bf90: 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54 72 79       iMin = iTry
bfa0: 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
bfb0: 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c  }..    if( rc==L
bfc0: 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  SM_OK ){.      a
bfd0: 73 73 65 72 74 28 20 72 65 73 3d 3d 30 20 7c 7c  ssert( res==0 ||
bfe0: 20 28 69 4d 69 6e 3d 3d 69 4d 61 78 20 26 26 20   (iMin==iMax && 
bff0: 69 4d 69 6e 3e 3d 30 20 26 26 20 69 4d 69 6e 3c  iMin>=0 && iMin<
c000: 70 50 74 72 2d 3e 6e 43 65 6c 6c 29 20 29 3b 0a  pPtr->nCell) );.
c010: 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b        if( res ){
c020: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
c030: 67 6d 65 6e 74 50 74 72 4c 6f 61 64 43 65 6c 6c  gmentPtrLoadCell
c040: 28 70 50 74 72 2c 20 69 4d 69 6e 29 3b 0a 20 20  (pPtr, iMin);.  
c050: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
c060: 72 74 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 7c  rt( rc!=LSM_OK |
c070: 7c 20 72 65 73 3e 30 20 7c 7c 20 69 50 74 72 4f  | res>0 || iPtrO
c080: 75 74 3d 3d 28 70 50 74 72 2d 3e 69 50 74 72 20  ut==(pPtr->iPtr 
c090: 2b 20 70 50 74 72 2d 3e 69 50 67 50 74 72 29 20  + pPtr->iPgPtr) 
c0a0: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63  );..      if( rc
c0b0: 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
c0c0: 20 20 20 20 73 77 69 74 63 68 28 20 65 53 65 65      switch( eSee
c0d0: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  k ){.          c
c0e0: 61 73 65 20 4c 53 4d 5f 53 45 45 4b 5f 45 51 3a  ase LSM_SEEK_EQ:
c0f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
c100: 6e 74 20 65 54 79 70 65 20 3d 20 70 50 74 72 2d  nt eType = pPtr-
c110: 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  >eType;.        
c120: 20 20 20 20 69 66 28 20 28 72 65 73 3c 30 20 26      if( (res<0 &
c130: 26 20 28 65 54 79 70 65 20 26 20 4c 53 4d 5f 53  & (eType & LSM_S
c140: 54 41 52 54 5f 44 45 4c 45 54 45 29 29 0a 20 20  TART_DELETE)).  
c150: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 72             || (r
c160: 65 73 3e 30 20 26 26 20 28 65 54 79 70 65 20 26  es>0 && (eType &
c170: 20 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45 54 45 29   LSM_END_DELETE)
c180: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  ).             |
c190: 7c 20 28 72 65 73 3d 3d 30 20 26 26 20 28 65 54  | (res==0 && (eT
c1a0: 79 70 65 20 26 20 4c 53 4d 5f 50 4f 49 4e 54 5f  ype & LSM_POINT_
c1b0: 44 45 4c 45 54 45 29 29 0a 20 20 20 20 20 20 20  DELETE)).       
c1c0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
c1d0: 20 20 20 20 20 20 2a 70 62 53 74 6f 70 20 3d 20        *pbStop = 
c1e0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
c1f0: 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20  else if( res==0 
c200: 26 26 20 28 65 54 79 70 65 20 26 20 4c 53 4d 5f  && (eType & LSM_
c210: 49 4e 53 45 52 54 29 20 29 7b 0a 20 20 20 20 20  INSERT) ){.     
c220: 20 20 20 20 20 20 20 20 20 6c 73 6d 5f 65 6e 76           lsm_env
c230: 20 2a 70 45 6e 76 20 3d 20 70 43 73 72 2d 3e 70   *pEnv = pCsr->p
c240: 44 62 2d 3e 70 45 6e 76 3b 0a 20 20 20 20 20 20  Db->pEnv;.      
c250: 20 20 20 20 20 20 20 20 2a 70 62 53 74 6f 70 20          *pbStop 
c260: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
c270: 20 20 20 70 43 73 72 2d 3e 65 54 79 70 65 20 3d     pCsr->eType =
c280: 20 70 50 74 72 2d 3e 65 54 79 70 65 3b 0a 20 20   pPtr->eType;.  
c290: 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
c2a0: 20 73 6f 72 74 65 64 42 6c 6f 62 53 65 74 28 70   sortedBlobSet(p
c2b0: 45 6e 76 2c 20 26 70 43 73 72 2d 3e 6b 65 79 2c  Env, &pCsr->key,
c2c0: 20 70 50 74 72 2d 3e 70 4b 65 79 2c 20 70 50 74   pPtr->pKey, pPt
c2d0: 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  r->nKey);.      
c2e0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
c2f0: 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  LSM_OK ){.      
c300: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
c310: 6f 72 74 65 64 42 6c 6f 62 53 65 74 28 70 45 6e  ortedBlobSet(pEn
c320: 76 2c 20 26 70 43 73 72 2d 3e 76 61 6c 2c 20 70  v, &pCsr->val, p
c330: 50 74 72 2d 3e 70 56 61 6c 2c 20 70 50 74 72 2d  Ptr->pVal, pPtr-
c340: 3e 6e 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  >nVal);.        
c350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c360: 20 20 20 20 20 20 70 43 73 72 2d 3e 66 6c 61 67        pCsr->flag
c370: 73 20 7c 3d 20 43 55 52 53 4f 52 5f 53 45 45 4b  s |= CURSOR_SEEK
c380: 5f 45 51 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _EQ;.           
c390: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
c3a0: 65 67 6d 65 6e 74 50 74 72 52 65 73 65 74 28 70  egmentPtrReset(p
c3b0: 50 74 72 2c 20 4c 53 4d 5f 53 45 47 4d 45 4e 54  Ptr, LSM_SEGMENT
c3c0: 50 54 52 5f 46 52 45 45 5f 54 48 52 45 53 48 4f  PTR_FREE_THRESHO
c3d0: 4c 44 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  LD);.           
c3e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c3f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 61    }.          ca
c400: 73 65 20 4c 53 4d 5f 53 45 45 4b 5f 4c 45 3a 0a  se LSM_SEEK_LE:.
c410: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
c420: 72 65 73 3e 30 20 29 20 72 63 20 3d 20 73 65 67  res>0 ) rc = seg
c430: 6d 65 6e 74 50 74 72 41 64 76 61 6e 63 65 28 70  mentPtrAdvance(p
c440: 43 73 72 2c 20 70 50 74 72 2c 20 31 29 3b 0a 20  Csr, pPtr, 1);. 
c450: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c460: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  ;.          case
c470: 20 4c 53 4d 5f 53 45 45 4b 5f 47 45 3a 20 7b 0a   LSM_SEEK_GE: {.
c480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
c490: 69 67 75 72 65 20 6f 75 74 20 69 66 20 77 65 20  igure out if we 
c4a0: 6e 65 65 64 20 74 6f 20 27 73 6b 69 70 27 20 74  need to 'skip' t
c4b0: 68 65 20 70 6f 69 6e 74 65 72 20 66 6f 72 77 61  he pointer forwa
c4c0: 72 64 20 6f 72 20 6e 6f 74 20 2a 2f 0a 20 20 20  rd or not */.   
c4d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
c4e0: 73 3c 3d 30 20 26 26 20 28 70 50 74 72 2d 3e 65  s<=0 && (pPtr->e
c4f0: 54 79 70 65 20 26 20 4c 53 4d 5f 53 54 41 52 54  Type & LSM_START
c500: 5f 44 45 4c 45 54 45 29 29 20 0a 20 20 20 20 20  _DELETE)) .     
c510: 20 20 20 20 20 20 20 20 7c 7c 20 28 72 65 73 3e          || (res>
c520: 30 20 20 26 26 20 28 70 50 74 72 2d 3e 65 54 79  0  && (pPtr->eTy
c530: 70 65 20 26 20 4c 53 4d 5f 45 4e 44 5f 44 45 4c  pe & LSM_END_DEL
c540: 45 54 45 29 29 20 0a 20 20 20 20 20 20 20 20 20  ETE)) .         
c550: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
c560: 20 20 20 20 72 63 20 3d 20 73 65 67 6d 65 6e 74      rc = segment
c570: 50 74 72 46 77 64 50 6f 69 6e 74 65 72 28 70 43  PtrFwdPointer(pC
c580: 73 72 2c 20 70 50 74 72 2c 20 26 69 50 74 72 4f  sr, pPtr, &iPtrO
c590: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
c5a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
c5b0: 66 28 20 72 65 73 3c 30 20 26 26 20 72 63 3d 3d  f( res<0 && rc==
c5c0: 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  LSM_OK ){.      
c5d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65 67          rc = seg
c5e0: 6d 65 6e 74 50 74 72 41 64 76 61 6e 63 65 28 70  mentPtrAdvance(p
c5f0: 43 73 72 2c 20 70 50 74 72 2c 20 30 29 3b 0a 20  Csr, pPtr, 0);. 
c600: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
c610: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c620: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c630: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c640: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
c650: 68 65 20 63 75 72 73 6f 72 20 73 65 65 6b 20 68  he cursor seek h
c660: 61 73 20 66 6f 75 6e 64 20 61 20 73 65 70 61 72  as found a separ
c670: 61 74 6f 72 20 6b 65 79 2c 20 61 6e 64 20 74 68  ator key, and th
c680: 69 73 20 63 75 72 73 6f 72 20 69 73 0a 20 20 20  is cursor is.   
c690: 20 2a 2a 20 73 75 70 70 6f 73 65 64 20 74 6f 20   ** supposed to 
c6a0: 69 67 6e 6f 72 65 20 73 65 70 61 72 61 74 6f 72  ignore separator
c6b0: 73 20 6b 65 79 73 2c 20 61 64 76 61 6e 63 65 20  s keys, advance 
c6c0: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
c6d0: 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  y.  */.    if( r
c6e0: 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 50 74  c==LSM_OK && pPt
c6f0: 72 2d 3e 70 50 67 0a 20 20 20 20 20 26 26 20 73  r->pPg.     && s
c700: 65 67 6d 65 6e 74 50 74 72 49 67 6e 6f 72 65 53  egmentPtrIgnoreS
c710: 65 70 61 72 61 74 6f 72 73 28 70 43 73 72 2c 20  eparators(pCsr, 
c720: 70 50 74 72 29 20 0a 20 20 20 20 20 26 26 20 72  pPtr) .     && r
c730: 74 49 73 53 65 70 61 72 61 74 6f 72 28 70 50 74  tIsSeparator(pPt
c740: 72 2d 3e 65 54 79 70 65 29 0a 20 20 20 20 29 7b  r->eType).    ){
c750: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
c760: 53 65 65 6b 21 3d 4c 53 4d 5f 53 45 45 4b 5f 45  Seek!=LSM_SEEK_E
c770: 51 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Q );.      rc = 
c780: 73 65 67 6d 65 6e 74 50 74 72 41 64 76 61 6e 63  segmentPtrAdvanc
c790: 65 28 70 43 73 72 2c 20 70 50 74 72 2c 20 65 53  e(pCsr, pPtr, eS
c7a0: 65 65 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 4c 45  eek==LSM_SEEK_LE
c7b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
c7c0: 61 73 73 65 72 74 28 20 72 63 21 3d 4c 53 4d 5f  assert( rc!=LSM_
c7d0: 4f 4b 20 7c 7c 20 61 73 73 65 72 74 53 65 65 6b  OK || assertSeek
c7e0: 52 65 73 75 6c 74 28 70 43 73 72 2c 70 50 74 72  Result(pCsr,pPtr
c7f0: 2c 69 54 6f 70 69 63 2c 70 4b 65 79 2c 6e 4b 65  ,iTopic,pKey,nKe
c800: 79 2c 65 53 65 65 6b 29 20 29 3b 0a 20 20 2a 70  y,eSeek) );.  *p
c810: 69 50 74 72 20 3d 20 28 69 6e 74 29 69 50 74 72  iPtr = (int)iPtr
c820: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Out;.  return rc
c830: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
c840: 73 65 65 6b 49 6e 42 74 72 65 65 28 0a 20 20 4d  seekInBtree(.  M
c850: 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72  ultiCursor *pCsr
c860: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
c870: 2a 20 4d 75 6c 74 69 2d 63 75 72 73 6f 72 20 6f  * Multi-cursor o
c880: 62 6a 65 63 74 20 2a 2f 0a 20 20 53 65 67 6d 65  bject */.  Segme
c890: 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20  nt *pSeg,       
c8a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c8b0: 65 6b 20 77 69 74 68 69 6e 20 74 68 69 73 20 73  ek within this s
c8c0: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
c8d0: 69 54 6f 70 69 63 2c 0a 20 20 76 6f 69 64 20 2a  iTopic,.  void *
c8e0: 70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 2c 20  pKey, int nKey, 
c8f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79            /* Key
c900: 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20   to seek to */. 
c910: 20 50 67 6e 6f 20 2a 61 50 67 2c 20 20 20 20 20   Pgno *aPg,     
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c930: 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75   /* OUT: Page nu
c940: 6d 62 65 72 73 20 2a 2f 0a 20 20 50 61 67 65 20  mbers */.  Page 
c950: 2a 2a 70 70 50 67 20 20 20 20 20 20 20 20 20 20  **ppPg          
c960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
c970: 54 3a 20 4c 65 61 66 20 28 73 6f 72 74 65 64 2d  T: Leaf (sorted-
c980: 72 75 6e 29 20 70 61 67 65 20 72 65 66 65 72 65  run) page refere
c990: 6e 63 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nce */.){.  int 
c9a0: 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  i = 0;.  int rc;
c9b0: 0a 20 20 69 6e 74 20 69 50 67 3b 0a 20 20 50 61  .  int iPg;.  Pa
c9c0: 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 42  ge *pPg = 0;.  B
c9d0: 6c 6f 62 20 62 6c 6f 62 20 3d 20 7b 30 2c 20 30  lob blob = {0, 0
c9e0: 2c 20 30 7d 3b 0a 0a 20 20 69 50 67 20 3d 20 28  , 0};..  iPg = (
c9f0: 69 6e 74 29 70 53 65 67 2d 3e 69 52 6f 6f 74 3b  int)pSeg->iRoot;
ca00: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 50 67 6e 6f  .  do {.    Pgno
ca10: 20 2a 70 69 46 69 72 73 74 20 3d 20 30 3b 0a 20   *piFirst = 0;. 
ca20: 20 20 20 69 66 28 20 61 50 67 20 29 7b 0a 20 20     if( aPg ){.  
ca30: 20 20 20 20 61 50 67 5b 69 2b 2b 5d 20 3d 20 69      aPg[i++] = i
ca40: 50 67 3b 0a 20 20 20 20 20 20 70 69 46 69 72 73  Pg;.      piFirs
ca50: 74 20 3d 20 26 61 50 67 5b 69 5d 3b 0a 20 20 20  t = &aPg[i];.   
ca60: 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d   }..    rc = lsm
ca70: 46 73 44 62 50 61 67 65 47 65 74 28 70 43 73 72  FsDbPageGet(pCsr
ca80: 2d 3e 70 44 62 2d 3e 70 46 53 2c 20 70 53 65 67  ->pDb->pFS, pSeg
ca90: 2c 20 69 50 67 2c 20 26 70 50 67 29 3b 0a 20 20  , iPg, &pPg);.  
caa0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 4c 53    assert( rc==LS
cab0: 4d 5f 4f 4b 20 7c 7c 20 70 50 67 3d 3d 30 20 29  M_OK || pPg==0 )
cac0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53  ;.    if( rc==LS
cad0: 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 38  M_OK ){.      u8
cae0: 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20   *aData;        
caf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
cb00: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  fer containing p
cb10: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  age data */.    
cb20: 20 20 69 6e 74 20 6e 44 61 74 61 3b 20 20 20 20    int nData;    
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb40: 20 53 69 7a 65 20 6f 66 20 61 44 61 74 61 5b 5d   Size of aData[]
cb50: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
cb60: 20 20 20 69 6e 74 20 69 4d 69 6e 3b 0a 20 20 20     int iMin;.   
cb70: 20 20 20 69 6e 74 20 69 4d 61 78 3b 0a 20 20 20     int iMax;.   
cb80: 20 20 20 69 6e 74 20 6e 52 65 63 3b 0a 20 20 20     int nRec;.   
cb90: 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 0a 20     int flags;.. 
cba0: 20 20 20 20 20 61 44 61 74 61 20 3d 20 66 73 50       aData = fsP
cbb0: 61 67 65 44 61 74 61 28 70 50 67 2c 20 26 6e 44  ageData(pPg, &nD
cbc0: 61 74 61 29 3b 0a 20 20 20 20 20 20 66 6c 61 67  ata);.      flag
cbd0: 73 20 3d 20 70 61 67 65 47 65 74 46 6c 61 67 73  s = pageGetFlags
cbe0: 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a  (aData, nData);.
cbf0: 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73        if( (flags
cc00: 20 26 20 53 45 47 4d 45 4e 54 5f 42 54 52 45 45   & SEGMENT_BTREE
cc10: 5f 46 4c 41 47 29 3d 3d 30 20 29 20 62 72 65 61  _FLAG)==0 ) brea
cc20: 6b 3b 0a 0a 20 20 20 20 20 20 69 50 67 20 3d 20  k;..      iPg = 
cc30: 28 69 6e 74 29 70 61 67 65 47 65 74 50 74 72 28  (int)pageGetPtr(
cc40: 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  aData, nData);. 
cc50: 20 20 20 20 20 6e 52 65 63 20 3d 20 70 61 67 65       nRec = page
cc60: 47 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e  GetNRec(aData, n
cc70: 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 69 4d  Data);..      iM
cc80: 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 4d  in = 0;.      iM
cc90: 61 78 20 3d 20 6e 52 65 63 2d 31 3b 0a 20 20 20  ax = nRec-1;.   
cca0: 20 20 20 77 68 69 6c 65 28 20 69 4d 61 78 3e 3d     while( iMax>=
ccb0: 69 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  iMin ){.        
ccc0: 69 6e 74 20 69 54 72 79 20 3d 20 28 69 4d 69 6e  int iTry = (iMin
ccd0: 2b 69 4d 61 78 29 2f 32 3b 0a 20 20 20 20 20 20  +iMax)/2;.      
cce0: 20 20 76 6f 69 64 20 2a 70 4b 65 79 54 3b 20 69    void *pKeyT; i
ccf0: 6e 74 20 6e 4b 65 79 54 3b 20 20 20 20 20 20 20  nt nKeyT;       
cd00: 2f 2a 20 4b 65 79 20 66 6f 72 20 63 65 6c 6c 20  /* Key for cell 
cd10: 69 54 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  iTry */.        
cd20: 69 6e 74 20 69 54 6f 70 69 63 54 3b 20 20 20 20  int iTopicT;    
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd40: 20 54 6f 70 69 63 20 66 6f 72 20 6b 65 79 20 70   Topic for key p
cd50: 4b 65 79 54 2f 6e 4b 65 79 54 20 2a 2f 0a 20 20  KeyT/nKeyT */.  
cd60: 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 3b        Pgno iPtr;
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 61      /* Pointer a
cd90: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
cda0: 65 6c 6c 20 69 54 72 79 20 2a 2f 0a 20 20 20 20  ell iTry */.    
cdb0: 20 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20      int res;    
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdd0: 20 20 2f 2a 20 28 70 4b 65 79 20 2d 20 70 4b 65    /* (pKey - pKe
cde0: 79 54 29 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  yT) */..        
cdf0: 72 63 20 3d 20 70 61 67 65 47 65 74 42 74 72 65  rc = pageGetBtre
ce00: 65 4b 65 79 28 0a 20 20 20 20 20 20 20 20 20 20  eKey(.          
ce10: 20 20 70 53 65 67 2c 20 70 50 67 2c 20 69 54 72    pSeg, pPg, iTr
ce20: 79 2c 20 26 69 50 74 72 2c 20 26 69 54 6f 70 69  y, &iPtr, &iTopi
ce30: 63 54 2c 20 26 70 4b 65 79 54 2c 20 26 6e 4b 65  cT, &pKeyT, &nKe
ce40: 79 54 2c 20 26 62 6c 6f 62 0a 20 20 20 20 20 20  yT, &blob.      
ce50: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
ce60: 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 62 72   rc!=LSM_OK ) br
ce70: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
ce80: 20 70 69 46 69 72 73 74 20 26 26 20 70 4b 65 79   piFirst && pKey
ce90: 54 3d 3d 62 6c 6f 62 2e 70 44 61 74 61 20 29 7b  T==blob.pData ){
cea0: 0a 20 20 20 20 20 20 20 20 20 20 2a 70 69 46 69  .          *piFi
ceb0: 72 73 74 20 3d 20 70 61 67 65 47 65 74 42 74 72  rst = pageGetBtr
cec0: 65 65 52 65 66 28 70 50 67 2c 20 69 54 72 79 29  eeRef(pPg, iTry)
ced0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 69 46 69  ;.          piFi
cee0: 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rst = 0;.       
cef0: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
cf00: 7d 0a 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  }..        res =
cf10: 20 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72   sortedKeyCompar
cf20: 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e(.            p
cf30: 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70 2c 20  Csr->pDb->xCmp, 
cf40: 69 54 6f 70 69 63 2c 20 70 4b 65 79 2c 20 6e 4b  iTopic, pKey, nK
cf50: 65 79 2c 20 69 54 6f 70 69 63 54 2c 20 70 4b 65  ey, iTopicT, pKe
cf60: 79 54 2c 20 6e 4b 65 79 54 0a 20 20 20 20 20 20  yT, nKeyT.      
cf70: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
cf80: 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
cf90: 20 20 20 20 69 50 67 20 3d 20 28 69 6e 74 29 69      iPg = (int)i
cfa0: 50 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Ptr;.          i
cfb0: 4d 61 78 20 3d 20 69 54 72 79 2d 31 3b 0a 20 20  Max = iTry-1;.  
cfc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cfd0: 20 20 20 20 20 20 20 69 4d 69 6e 20 3d 20 69 54         iMin = iT
cfe0: 72 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ry+1;.        }.
cff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 73        }.      ls
d000: 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65 28 70  mFsPageRelease(p
d010: 50 67 29 3b 0a 20 20 20 20 20 20 70 50 67 20 3d  Pg);.      pPg =
d020: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69   0;.    }.  }whi
d030: 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  le( rc==LSM_OK )
d040: 3b 0a 0a 20 20 73 6f 72 74 65 64 42 6c 6f 62 46  ;..  sortedBlobF
d050: 72 65 65 28 26 62 6c 6f 62 29 3b 0a 20 20 61 73  ree(&blob);.  as
d060: 73 65 72 74 28 20 28 72 63 3d 3d 4c 53 4d 5f 4f  sert( (rc==LSM_O
d070: 4b 29 3d 3d 28 70 50 67 21 3d 30 29 20 29 3b 0a  K)==(pPg!=0) );.
d080: 20 20 69 66 28 20 70 70 50 67 20 29 7b 0a 20 20    if( ppPg ){.  
d090: 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20    *ppPg = pPg;. 
d0a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 73 6d 46   }else{.    lsmF
d0b0: 73 50 61 67 65 52 65 6c 65 61 73 65 28 70 50 67  sPageRelease(pPg
d0c0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d0d0: 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
d0e0: 74 20 73 65 65 6b 49 6e 53 65 67 6d 65 6e 74 28  t seekInSegment(
d0f0: 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  .  MultiCursor *
d100: 70 43 73 72 2c 20 0a 20 20 53 65 67 6d 65 6e 74  pCsr, .  Segment
d110: 50 74 72 20 2a 70 50 74 72 2c 0a 20 20 69 6e 74  Ptr *pPtr,.  int
d120: 20 69 54 6f 70 69 63 2c 0a 20 20 76 6f 69 64 20   iTopic,.  void 
d130: 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 2c  *pKey, int nKey,
d140: 0a 20 20 69 6e 74 20 69 50 67 2c 20 20 20 20 20  .  int iPg,     
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d160: 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 73 65     /* Page to se
d170: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 65 53  arch */.  int eS
d180: 65 65 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  eek,            
d190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
d1a0: 72 63 68 20 62 69 61 73 20 2d 20 73 65 65 20 61  rch bias - see a
d1b0: 62 6f 76 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  bove */.  int *p
d1c0: 69 50 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  iPtr,           
d1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
d1e0: 3a 20 46 43 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  : FC pointer */.
d1f0: 20 20 69 6e 74 20 2a 70 62 53 74 6f 70 20 20 20    int *pbStop   
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 20 20 2f 2a 20 4f 55 54 3a 20 53 74 6f 70 20 73    /* OUT: Stop s
d220: 65 61 72 63 68 20 66 6c 61 67 20 2a 2f 0a 29 7b  earch flag */.){
d230: 0a 20 20 69 6e 74 20 69 50 74 72 20 3d 20 69 50  .  int iPtr = iP
d240: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  g;.  int rc = LS
d250: 4d 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 74  M_OK;..  if( pPt
d260: 72 2d 3e 70 53 65 67 2d 3e 69 52 6f 6f 74 20 29  r->pSeg->iRoot )
d270: 7b 0a 20 20 20 20 50 61 67 65 20 2a 70 50 67 3b  {.    Page *pPg;
d280: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 74  .    assert( pPt
d290: 72 2d 3e 70 53 65 67 2d 3e 69 52 6f 6f 74 21 3d  r->pSeg->iRoot!=
d2a0: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 65  0 );.    rc = se
d2b0: 65 6b 49 6e 42 74 72 65 65 28 70 43 73 72 2c 20  ekInBtree(pCsr, 
d2c0: 70 50 74 72 2d 3e 70 53 65 67 2c 20 69 54 6f 70  pPtr->pSeg, iTop
d2d0: 69 63 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20  ic, pKey, nKey, 
d2e0: 30 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66  0, &pPg);.    if
d2f0: 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 73  ( rc==LSM_OK ) s
d300: 65 67 6d 65 6e 74 50 74 72 53 65 74 50 61 67 65  egmentPtrSetPage
d310: 28 70 50 74 72 2c 20 70 50 67 29 3b 0a 20 20 7d  (pPtr, pPg);.  }
d320: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 69 50  else{.    if( iP
d330: 74 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  tr==0 ){.      i
d340: 50 74 72 20 3d 20 28 69 6e 74 29 70 50 74 72 2d  Ptr = (int)pPtr-
d350: 3e 70 53 65 67 2d 3e 69 46 69 72 73 74 3b 0a 20  >pSeg->iFirst;. 
d360: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
d370: 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =LSM_OK ){.     
d380: 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72   rc = segmentPtr
d390: 4c 6f 61 64 50 61 67 65 28 70 43 73 72 2d 3e 70  LoadPage(pCsr->p
d3a0: 44 62 2d 3e 70 46 53 2c 20 70 50 74 72 2c 20 69  Db->pFS, pPtr, i
d3b0: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Ptr);.    }.  }.
d3c0: 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f  .  if( rc==LSM_O
d3d0: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  K ){.    rc = se
d3e0: 67 6d 65 6e 74 50 74 72 53 65 65 6b 28 70 43 73  gmentPtrSeek(pCs
d3f0: 72 2c 20 70 50 74 72 2c 20 69 54 6f 70 69 63 2c  r, pPtr, iTopic,
d400: 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 65 53 65   pKey, nKey, eSe
d410: 65 6b 2c 20 70 69 50 74 72 2c 20 70 62 53 74 6f  ek, piPtr, pbSto
d420: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
d430: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
d440: 65 6b 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20  ek each segment 
d450: 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 61  pointer in the a
d460: 72 72 61 79 20 6f 66 20 28 70 4c 76 6c 2d 3e 6e  rray of (pLvl->n
d470: 52 69 67 68 74 2b 31 29 20 61 74 20 61 50 74 72  Right+1) at aPtr
d480: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 70 62 53 74 6f 70  []..**.** pbStop
d490: 3a 0a 2a 2a 20 20 20 54 68 69 73 20 70 61 72 61  :.**   This para
d4a0: 6d 65 74 65 72 20 69 73 20 6f 6e 6c 79 20 73 69  meter is only si
d4b0: 67 6e 69 66 69 63 61 6e 74 20 69 66 20 70 61 72  gnificant if par
d4c0: 61 6d 65 74 65 72 20 65 53 65 65 6b 20 69 73 20  ameter eSeek is 
d4d0: 73 65 74 20 74 6f 0a 2a 2a 20 20 20 4c 53 4d 5f  set to.**   LSM_
d4e0: 53 45 45 4b 5f 45 51 2e 20 49 6e 20 74 68 69 73  SEEK_EQ. In this
d4f0: 20 63 61 73 65 2c 20 69 74 20 69 73 20 73 65 74   case, it is set
d500: 20 74 6f 20 74 72 75 65 20 62 65 66 6f 72 65 20   to true before 
d510: 72 65 74 75 72 6e 69 6e 67 20 69 66 0a 2a 2a 20  returning if.** 
d520: 20 20 74 68 65 20 73 65 65 6b 20 6f 70 65 72 61    the seek opera
d530: 74 69 6f 6e 20 69 73 20 66 69 6e 69 73 68 65 64  tion is finished
d540: 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65  . This can happe
d550: 6e 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a  n in two ways:.*
d560: 2a 20 20 20 0a 2a 2a 20 20 20 20 20 61 29 20 41  *   .**     a) A
d570: 20 6b 65 79 20 6d 61 74 63 68 69 6e 67 20 28 70   key matching (p
d580: 4b 65 79 2f 6e 4b 65 79 29 20 69 73 20 66 6f 75  Key/nKey) is fou
d590: 6e 64 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 62 29  nd, or.**     b)
d5a0: 20 41 20 70 6f 69 6e 74 2d 64 65 6c 65 74 65 20   A point-delete 
d5b0: 6f 72 20 72 61 6e 67 65 2d 64 65 6c 65 74 65 20  or range-delete 
d5c0: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6b 65 79  deleting the key
d5d0: 20 69 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a   is found..**.**
d5e0: 20 20 20 49 6e 20 63 61 73 65 20 28 61 29 2c 20     In case (a), 
d5f0: 74 68 65 20 6d 75 6c 74 69 2d 63 75 72 73 6f 72  the multi-cursor
d600: 20 43 55 52 53 4f 52 5f 53 45 45 4b 5f 45 51 20   CURSOR_SEEK_EQ 
d610: 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
d620: 74 68 65 20 70 43 73 72 2d 3e 6b 65 79 0a 2a 2a  the pCsr->key.**
d630: 20 20 20 61 6e 64 20 70 43 73 72 2d 3e 76 61 6c     and pCsr->val
d640: 20 62 6c 6f 62 73 20 70 6f 70 75 6c 61 74 65 64   blobs populated
d650: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
d660: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
d670: 20 73 65 65 6b 49 6e 4c 65 76 65 6c 28 0a 20 20   seekInLevel(.  
d680: 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73  MultiCursor *pCs
d690: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
d6a0: 2f 2a 20 53 6f 72 74 65 64 20 63 75 72 73 6f 72  /* Sorted cursor
d6b0: 20 6f 62 6a 65 63 74 20 74 6f 20 73 65 65 6b 20   object to seek 
d6c0: 2a 2f 0a 20 20 53 65 67 6d 65 6e 74 50 74 72 20  */.  SegmentPtr 
d6d0: 2a 61 50 74 72 2c 20 20 20 20 20 20 20 20 20 20  *aPtr,          
d6e0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
d6f0: 74 6f 20 61 72 72 61 79 20 6f 66 20 28 6e 52 68  to array of (nRh
d700: 73 2b 31 29 20 53 50 73 20 2a 2f 0a 20 20 69 6e  s+1) SPs */.  in
d710: 74 20 65 53 65 65 6b 2c 20 20 20 20 20 20 20 20  t eSeek,        
d720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d730: 20 53 65 61 72 63 68 20 62 69 61 73 20 2d 20 73   Search bias - s
d740: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 69 6e  ee above */.  in
d750: 74 20 69 54 6f 70 69 63 2c 20 20 20 20 20 20 20  t iTopic,       
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d770: 20 4b 65 79 20 74 6f 70 69 63 20 74 6f 20 73 65   Key topic to se
d780: 61 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 76 6f  arch for */.  vo
d790: 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74 20 6e 4b  id *pKey, int nK
d7a0: 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
d7b0: 20 4b 65 79 20 74 6f 20 73 65 61 72 63 68 20 66   Key to search f
d7c0: 6f 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 69  or */.  Pgno *pi
d7d0: 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Pgno,           
d7e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
d7f0: 54 3a 20 66 72 61 63 74 69 6f 6e 20 63 61 73 63  T: fraction casc
d800: 61 64 65 20 70 6f 69 6e 74 65 72 20 28 6f 72 20  ade pointer (or 
d810: 30 29 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 53  0) */.  int *pbS
d820: 74 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  top             
d830: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
d840: 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 29 7b 0a  See above */.){.
d850: 20 20 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20    Level *pLvl = 
d860: 61 50 74 72 5b 30 5d 2e 70 4c 65 76 65 6c 3b 20  aPtr[0].pLevel; 
d870: 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 73 65    /* Level to se
d880: 65 6b 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69  ek within */.  i
d890: 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20  nt rc = LSM_OK; 
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d8b0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
d8c0: 0a 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b  .  int iOut = 0;
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8e0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
d8f0: 20 72 65 74 75 72 6e 20 74 6f 20 63 61 6c 6c 65   return to calle
d900: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  r */.  int res =
d910: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   -1;            
d920: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
d930: 20 6f 66 20 78 43 6d 70 28 70 4b 65 79 2c 20 73   of xCmp(pKey, s
d940: 70 6c 69 74 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  plit) */.  int n
d950: 52 68 73 20 3d 20 70 4c 76 6c 2d 3e 6e 52 69 67  Rhs = pLvl->nRig
d960: 68 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ht;        /* Nu
d970: 6d 62 65 72 20 6f 66 20 72 69 67 68 74 2d 68 61  mber of right-ha
d980: 6e 64 2d 73 69 64 65 20 73 65 67 6d 65 6e 74 73  nd-side segments
d990: 20 2a 2f 0a 20 20 69 6e 74 20 62 53 74 6f 70 20   */.  int bStop 
d9a0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  = 0;..  /* If th
d9b0: 69 73 20 69 73 20 61 20 63 6f 6d 70 6f 73 69 74  is is a composit
d9c0: 65 20 6c 65 76 65 6c 20 28 6f 6e 65 20 63 75 72  e level (one cur
d9d0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 67 6f 69 6e  rently undergoin
d9e0: 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
d9f0: 0a 20 20 2a 2a 20 6d 65 72 67 65 29 2c 20 66 69  .  ** merge), fi
da00: 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 65 20  gure out if the 
da10: 73 65 61 72 63 68 20 6b 65 79 20 69 73 20 6c 61  search key is la
da20: 72 67 65 72 20 6f 72 20 73 6d 61 6c 6c 65 72 20  rger or smaller 
da30: 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 6c 65  than the.  ** le
da40: 76 65 6c 73 20 73 70 6c 69 74 2d 6b 65 79 2e 20  vels split-key. 
da50: 20 2a 2f 0a 20 20 69 66 28 20 6e 52 68 73 20 29   */.  if( nRhs )
da60: 7b 0a 20 20 20 20 72 65 73 20 3d 20 73 6f 72 74  {.    res = sort
da70: 65 64 4b 65 79 43 6f 6d 70 61 72 65 28 70 43 73  edKeyCompare(pCs
da80: 72 2d 3e 70 44 62 2d 3e 78 43 6d 70 2c 20 69 54  r->pDb->xCmp, iT
da90: 6f 70 69 63 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  opic, pKey, nKey
daa0: 2c 20 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  , .        pLvl-
dab0: 3e 69 53 70 6c 69 74 54 6f 70 69 63 2c 20 70 4c  >iSplitTopic, pL
dac0: 76 6c 2d 3e 70 53 70 6c 69 74 4b 65 79 2c 20 70  vl->pSplitKey, p
dad0: 4c 76 6c 2d 3e 6e 53 70 6c 69 74 4b 65 79 0a 20  Lvl->nSplitKey. 
dae0: 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20     );.  }..  /* 
daf0: 49 66 20 28 72 65 73 3c 30 29 2c 20 74 68 65 6e  If (res<0), then
db00: 20 6b 65 79 20 70 4b 65 79 2f 6e 4b 65 79 20 69   key pKey/nKey i
db10: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
db20: 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 28 6f 72  he split-key (or
db30: 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f   this.  ** is no
db40: 74 20 61 20 63 6f 6d 70 6f 73 69 74 65 20 6c 65  t a composite le
db50: 76 65 6c 20 61 6e 64 20 74 68 65 72 65 20 69 73  vel and there is
db60: 20 6e 6f 20 73 70 6c 69 74 2d 6b 65 79 29 2e 20   no split-key). 
db70: 53 65 61 72 63 68 20 74 68 65 20 0a 20 20 2a 2a  Search the .  **
db80: 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
db90: 6f 66 20 74 68 65 20 6c 65 76 65 6c 20 69 6e 20  of the level in 
dba0: 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
dbb0: 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
dbc0: 20 20 69 6e 74 20 69 50 74 72 20 3d 20 30 3b 0a    int iPtr = 0;.
dbd0: 20 20 20 20 69 66 28 20 6e 52 68 73 3d 3d 30 20      if( nRhs==0 
dbe0: 29 20 69 50 74 72 20 3d 20 28 69 6e 74 29 2a 70  ) iPtr = (int)*p
dbf0: 69 50 67 6e 6f 3b 0a 0a 20 20 20 20 72 63 20 3d  iPgno;..    rc =
dc00: 20 73 65 65 6b 49 6e 53 65 67 6d 65 6e 74 28 0a   seekInSegment(.
dc10: 20 20 20 20 20 20 20 20 70 43 73 72 2c 20 26 61          pCsr, &a
dc20: 50 74 72 5b 30 5d 2c 20 69 54 6f 70 69 63 2c 20  Ptr[0], iTopic, 
dc30: 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 69 50 74 72  pKey, nKey, iPtr
dc40: 2c 20 65 53 65 65 6b 2c 20 26 69 4f 75 74 2c 20  , eSeek, &iOut, 
dc50: 26 62 53 74 6f 70 0a 20 20 20 20 29 3b 0a 20 20  &bStop.    );.  
dc60: 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b    if( rc==LSM_OK
dc70: 20 26 26 20 6e 52 68 73 3e 30 20 26 26 20 65 53   && nRhs>0 && eS
dc80: 65 65 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 47 45  eek==LSM_SEEK_GE
dc90: 20 26 26 20 61 50 74 72 5b 30 5d 2e 70 50 67 3d   && aPtr[0].pPg=
dca0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  =0 ){.      res 
dcb0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
dcc0: 20 0a 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29   .  if( res>=0 )
dcd0: 7b 0a 20 20 20 20 69 6e 74 20 62 48 69 74 20 3d  {.    int bHit =
dce0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
dcf0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
dd00: 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 68 73 20  t least one rhs 
dd10: 69 73 20 6e 6f 74 20 45 4f 46 20 2a 2f 0a 20 20  is not EOF */.  
dd20: 20 20 69 6e 74 20 69 50 74 72 20 3d 20 28 69 6e    int iPtr = (in
dd30: 74 29 2a 70 69 50 67 6e 6f 3b 0a 20 20 20 20 69  t)*piPgno;.    i
dd40: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
dd50: 31 3b 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  1; rc==LSM_OK &&
dd60: 20 69 3c 3d 6e 52 68 73 20 26 26 20 62 53 74 6f   i<=nRhs && bSto
dd70: 70 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  p==0; i++){.    
dd80: 20 20 53 65 67 6d 65 6e 74 50 74 72 20 2a 70 50    SegmentPtr *pP
dd90: 74 72 20 3d 20 26 61 50 74 72 5b 69 5d 3b 0a 20  tr = &aPtr[i];. 
dda0: 20 20 20 20 20 69 4f 75 74 20 3d 20 30 3b 0a 20       iOut = 0;. 
ddb0: 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b 49 6e       rc = seekIn
ddc0: 53 65 67 6d 65 6e 74 28 0a 20 20 20 20 20 20 20  Segment(.       
ddd0: 20 20 20 70 43 73 72 2c 20 70 50 74 72 2c 20 69     pCsr, pPtr, i
dde0: 54 6f 70 69 63 2c 20 70 4b 65 79 2c 20 6e 4b 65  Topic, pKey, nKe
ddf0: 79 2c 20 69 50 74 72 2c 20 65 53 65 65 6b 2c 20  y, iPtr, eSeek, 
de00: 26 69 4f 75 74 2c 20 26 62 53 74 6f 70 0a 20 20  &iOut, &bStop.  
de10: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 50 74      );.      iPt
de20: 72 20 3d 20 69 4f 75 74 3b 0a 0a 20 20 20 20 20  r = iOut;..     
de30: 20 2f 2a 20 49 66 20 74 68 65 20 73 65 67 6d 65   /* If the segme
de40: 6e 74 2d 70 6f 69 6e 74 65 72 20 68 61 73 20 73  nt-pointer has s
de50: 65 74 74 6c 65 64 20 6f 6e 20 61 20 6b 65 79 20  ettled on a key 
de60: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  that is smaller 
de70: 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  than.      ** th
de80: 65 20 73 70 6c 69 74 6b 65 79 2c 20 69 6e 76 61  e splitkey, inva
de90: 6c 69 64 61 74 65 20 74 68 65 20 73 65 67 6d 65  lidate the segme
dea0: 6e 74 2d 70 6f 69 6e 74 65 72 2e 20 20 2a 2f 0a  nt-pointer.  */.
deb0: 20 20 20 20 20 20 69 66 28 20 70 50 74 72 2d 3e        if( pPtr->
dec0: 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pPg ){.        r
ded0: 65 73 20 3d 20 73 6f 72 74 65 64 4b 65 79 43 6f  es = sortedKeyCo
dee0: 6d 70 61 72 65 28 70 43 73 72 2d 3e 70 44 62 2d  mpare(pCsr->pDb-
def0: 3e 78 43 6d 70 2c 20 0a 20 20 20 20 20 20 20 20  >xCmp, .        
df00: 20 20 20 20 72 74 54 6f 70 69 63 28 70 50 74 72      rtTopic(pPtr
df10: 2d 3e 65 54 79 70 65 29 2c 20 70 50 74 72 2d 3e  ->eType), pPtr->
df20: 70 4b 65 79 2c 20 70 50 74 72 2d 3e 6e 4b 65 79  pKey, pPtr->nKey
df30: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  , .            p
df40: 4c 76 6c 2d 3e 69 53 70 6c 69 74 54 6f 70 69 63  Lvl->iSplitTopic
df50: 2c 20 70 4c 76 6c 2d 3e 70 53 70 6c 69 74 4b 65  , pLvl->pSplitKe
df60: 79 2c 20 70 4c 76 6c 2d 3e 6e 53 70 6c 69 74 4b  y, pLvl->nSplitK
df70: 65 79 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ey.        );.  
df80: 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20        if( res<0 
df90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
dfa0: 20 70 50 74 72 2d 3e 65 54 79 70 65 20 26 20 4c   pPtr->eType & L
dfb0: 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54 45 20  SM_START_DELETE 
dfc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
dfd0: 50 74 72 2d 3e 65 54 79 70 65 20 26 3d 20 7e 4c  Ptr->eType &= ~L
dfe0: 53 4d 5f 49 4e 53 45 52 54 3b 0a 20 20 20 20 20  SM_INSERT;.     
dff0: 20 20 20 20 20 20 20 70 50 74 72 2d 3e 70 4b 65         pPtr->pKe
e000: 79 20 3d 20 70 4c 76 6c 2d 3e 70 53 70 6c 69 74  y = pLvl->pSplit
e010: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Key;.           
e020: 20 70 50 74 72 2d 3e 6e 4b 65 79 20 3d 20 70 4c   pPtr->nKey = pL
e030: 76 6c 2d 3e 6e 53 70 6c 69 74 4b 65 79 3b 0a 20  vl->nSplitKey;. 
e040: 20 20 20 20 20 20 20 20 20 20 20 70 50 74 72 2d             pPtr-
e050: 3e 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >pVal = 0;.     
e060: 20 20 20 20 20 20 20 70 50 74 72 2d 3e 6e 56 61         pPtr->nVa
e070: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  l = 0;.         
e080: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e090: 20 20 20 20 73 65 67 6d 65 6e 74 50 74 72 52 65      segmentPtrRe
e0a0: 73 65 74 28 70 50 74 72 2c 20 4c 53 4d 5f 53 45  set(pPtr, LSM_SE
e0b0: 47 4d 45 4e 54 50 54 52 5f 46 52 45 45 5f 54 48  GMENTPTR_FREE_TH
e0c0: 52 45 53 48 4f 4c 44 29 3b 0a 20 20 20 20 20 20  RESHOLD);.      
e0d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
e0e0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
e0f0: 66 28 20 61 50 74 72 5b 69 5d 2e 70 4b 65 79 20  f( aPtr[i].pKey 
e100: 29 20 62 48 69 74 20 3d 20 31 3b 0a 20 20 20 20  ) bHit = 1;.    
e110: 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c  }..    if( rc==L
e120: 53 4d 5f 4f 4b 20 26 26 20 65 53 65 65 6b 3d 3d  SM_OK && eSeek==
e130: 4c 53 4d 5f 53 45 45 4b 5f 4c 45 20 26 26 20 62  LSM_SEEK_LE && b
e140: 48 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Hit==0 ){.      
e150: 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 45  rc = segmentPtrE
e160: 6e 64 28 70 43 73 72 2c 20 26 61 50 74 72 5b 30  nd(pCsr, &aPtr[0
e170: 5d 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], 1);.    }.  }
e180: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 53 65 65  ..  assert( eSee
e190: 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 45 51 20 7c  k==LSM_SEEK_EQ |
e1a0: 7c 20 62 53 74 6f 70 3d 3d 30 20 29 3b 0a 20 20  | bStop==0 );.  
e1b0: 2a 70 69 50 67 6e 6f 20 3d 20 69 4f 75 74 3b 0a  *piPgno = iOut;.
e1c0: 20 20 2a 70 62 53 74 6f 70 20 3d 20 62 53 74 6f    *pbStop = bSto
e1d0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  p;.  return rc;.
e1e0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  }..static void m
e1f0: 75 6c 74 69 43 75 72 73 6f 72 47 65 74 4b 65 79  ultiCursorGetKey
e200: 28 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20  (.  MultiCursor 
e210: 2a 70 43 73 72 2c 20 0a 20 20 69 6e 74 20 69 4b  *pCsr, .  int iK
e220: 65 79 2c 0a 20 20 69 6e 74 20 2a 70 65 54 79 70  ey,.  int *peTyp
e230: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
e240: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4b 65        /* OUT: Ke
e250: 79 20 74 79 70 65 20 28 53 4f 52 54 45 44 5f 57  y type (SORTED_W
e260: 52 49 54 45 20 65 74 63 2e 29 20 2a 2f 0a 20 20  RITE etc.) */.  
e270: 76 6f 69 64 20 2a 2a 70 70 4b 65 79 2c 20 20 20  void **ppKey,   
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e290: 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  /* OUT: Pointer 
e2a0: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
e2b0: 6e 69 6e 67 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ning key */.  in
e2c0: 74 20 2a 70 6e 4b 65 79 20 20 20 20 20 20 20 20  t *pnKey        
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e2e0: 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 2a 70   OUT: Size of *p
e2f0: 70 4b 65 79 20 69 6e 20 62 79 74 65 73 20 2a 2f  pKey in bytes */
e300: 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d  .){.  int nKey =
e310: 20 30 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79   0;.  void *pKey
e320: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65 54 79 70   = 0;.  int eTyp
e330: 65 20 3d 20 30 3b 0a 0a 20 20 73 77 69 74 63 68  e = 0;..  switch
e340: 28 20 69 4b 65 79 20 29 7b 0a 20 20 20 20 63 61  ( iKey ){.    ca
e350: 73 65 20 43 55 52 53 4f 52 5f 44 41 54 41 5f 54  se CURSOR_DATA_T
e360: 52 45 45 30 3a 0a 20 20 20 20 63 61 73 65 20 43  REE0:.    case C
e370: 55 52 53 4f 52 5f 44 41 54 41 5f 54 52 45 45 31  URSOR_DATA_TREE1
e380: 3a 20 7b 0a 20 20 20 20 20 20 54 72 65 65 43 75  : {.      TreeCu
e390: 72 73 6f 72 20 2a 70 54 72 65 65 43 73 72 20 3d  rsor *pTreeCsr =
e3a0: 20 70 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72   pCsr->apTreeCsr
e3b0: 5b 69 4b 65 79 2d 43 55 52 53 4f 52 5f 44 41 54  [iKey-CURSOR_DAT
e3c0: 41 5f 54 52 45 45 30 5d 3b 0a 20 20 20 20 20 20  A_TREE0];.      
e3d0: 69 66 28 20 6c 73 6d 54 72 65 65 43 75 72 73 6f  if( lsmTreeCurso
e3e0: 72 56 61 6c 69 64 28 70 54 72 65 65 43 73 72 29  rValid(pTreeCsr)
e3f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 73 6d 54   ){.        lsmT
e400: 72 65 65 43 75 72 73 6f 72 4b 65 79 28 70 54 72  reeCursorKey(pTr
e410: 65 65 43 73 72 2c 20 26 65 54 79 70 65 2c 20 26  eeCsr, &eType, &
e420: 70 4b 65 79 2c 20 26 6e 4b 65 79 29 3b 0a 20 20  pKey, &nKey);.  
e430: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
e440: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
e450: 73 65 20 43 55 52 53 4f 52 5f 44 41 54 41 5f 53  se CURSOR_DATA_S
e460: 59 53 54 45 4d 3a 20 7b 0a 20 20 20 20 20 20 53  YSTEM: {.      S
e470: 6e 61 70 73 68 6f 74 20 2a 70 57 6f 72 6b 65 72  napshot *pWorker
e480: 20 3d 20 70 43 73 72 2d 3e 70 44 62 2d 3e 70 57   = pCsr->pDb->pW
e490: 6f 72 6b 65 72 3b 0a 20 20 20 20 20 20 69 66 28  orker;.      if(
e4a0: 20 70 57 6f 72 6b 65 72 20 26 26 20 28 70 43 73   pWorker && (pCs
e4b0: 72 2d 3e 66 6c 61 67 73 20 26 20 43 55 52 53 4f  r->flags & CURSO
e4c0: 52 5f 46 4c 55 53 48 5f 46 52 45 45 4c 49 53 54  R_FLUSH_FREELIST
e4d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
e4e0: 20 6e 45 6e 74 72 79 20 3d 20 70 57 6f 72 6b 65   nEntry = pWorke
e4f0: 72 2d 3e 66 72 65 65 6c 69 73 74 2e 6e 45 6e 74  r->freelist.nEnt
e500: 72 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ry;.        if( 
e510: 70 43 73 72 2d 3e 69 46 72 65 65 20 3c 20 28 6e  pCsr->iFree < (n
e520: 45 6e 74 72 79 2a 32 29 20 29 7b 0a 20 20 20 20  Entry*2) ){.    
e530: 20 20 20 20 20 20 46 72 65 65 6c 69 73 74 45 6e        FreelistEn
e540: 74 72 79 20 2a 61 45 6e 74 72 79 20 3d 20 70 57  try *aEntry = pW
e550: 6f 72 6b 65 72 2d 3e 66 72 65 65 6c 69 73 74 2e  orker->freelist.
e560: 61 45 6e 74 72 79 3b 0a 20 20 20 20 20 20 20 20  aEntry;.        
e570: 20 20 69 6e 74 20 69 20 3d 20 6e 45 6e 74 72 79    int i = nEntry
e580: 20 2d 20 31 20 2d 20 28 70 43 73 72 2d 3e 69 46   - 1 - (pCsr->iF
e590: 72 65 65 20 2f 20 32 29 3b 0a 20 20 20 20 20 20  ree / 2);.      
e5a0: 20 20 20 20 75 33 32 20 69 4b 65 79 32 20 3d 20      u32 iKey2 = 
e5b0: 30 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  0;..          if
e5c0: 28 20 28 70 43 73 72 2d 3e 69 46 72 65 65 20 25  ( (pCsr->iFree %
e5d0: 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   2) ){.         
e5e0: 20 20 20 65 54 79 70 65 20 3d 20 4c 53 4d 5f 45     eType = LSM_E
e5f0: 4e 44 5f 44 45 4c 45 54 45 7c 4c 53 4d 5f 53 59  ND_DELETE|LSM_SY
e600: 53 54 45 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20  STEMKEY;.       
e610: 20 20 20 20 20 69 4b 65 79 32 20 3d 20 61 45 6e       iKey2 = aEn
e620: 74 72 79 5b 69 5d 2e 69 42 6c 6b 2d 31 3b 0a 20  try[i].iBlk-1;. 
e630: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
e640: 66 28 20 61 45 6e 74 72 79 5b 69 5d 2e 69 49 64  f( aEntry[i].iId
e650: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
e660: 20 20 20 65 54 79 70 65 20 3d 20 4c 53 4d 5f 49     eType = LSM_I
e670: 4e 53 45 52 54 7c 4c 53 4d 5f 53 59 53 54 45 4d  NSERT|LSM_SYSTEM
e680: 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KEY;.           
e690: 20 69 4b 65 79 32 20 3d 20 61 45 6e 74 72 79 5b   iKey2 = aEntry[
e6a0: 69 5d 2e 69 42 6c 6b 3b 0a 0a 20 20 20 20 20 20  i].iBlk;..      
e6b0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
e6c0: 69 6e 2d 6d 65 6d 6f 72 79 20 65 6e 74 72 79 20  in-memory entry 
e6d0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 66 6f  immediately befo
e6e0: 72 65 20 74 68 69 73 20 6f 6e 65 20 77 61 73 20  re this one was 
e6f0: 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  a.             *
e700: 2a 20 44 45 4c 45 54 45 2c 20 61 6e 64 20 74 68  * DELETE, and th
e710: 65 20 62 6c 6f 63 6b 20 6e 75 6d 62 65 72 20 69  e block number i
e720: 73 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68  s one greater th
e730: 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  an the current. 
e740: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
e750: 6c 6f 63 6b 20 6e 75 6d 62 65 72 2c 20 6d 61 72  lock number, mar
e760: 6b 20 74 68 69 73 20 65 6e 74 72 79 20 61 73 20  k this entry as 
e770: 61 6e 20 22 65 6e 64 2d 64 65 6c 65 74 65 2d 72  an "end-delete-r
e780: 61 6e 67 65 22 2e 20 2a 2f 0a 20 20 20 20 20 20  ange". */.      
e790: 20 20 20 20 20 20 69 66 28 20 69 3c 28 6e 45 6e        if( i<(nEn
e7a0: 74 72 79 2d 31 29 20 26 26 20 61 45 6e 74 72 79  try-1) && aEntry
e7b0: 5b 69 2b 31 5d 2e 69 42 6c 6b 3d 3d 69 4b 65 79  [i+1].iBlk==iKey
e7c0: 32 2b 31 20 26 26 20 61 45 6e 74 72 79 5b 69 2b  2+1 && aEntry[i+
e7d0: 31 5d 2e 69 49 64 3c 30 20 29 7b 0a 20 20 20 20  1].iId<0 ){.    
e7e0: 20 20 20 20 20 20 20 20 20 20 65 54 79 70 65 20            eType 
e7f0: 7c 3d 20 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45 54  |= LSM_END_DELET
e800: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  E;.            }
e810: 0a 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ..          }els
e820: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  e{.            e
e830: 54 79 70 65 20 3d 20 4c 53 4d 5f 53 54 41 52 54  Type = LSM_START
e840: 5f 44 45 4c 45 54 45 7c 4c 53 4d 5f 53 59 53 54  _DELETE|LSM_SYST
e850: 45 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20  EMKEY;.         
e860: 20 20 20 69 4b 65 79 32 20 3d 20 61 45 6e 74 72     iKey2 = aEntr
e870: 79 5b 69 5d 2e 69 42 6c 6b 20 2b 20 31 3b 0a 20  y[i].iBlk + 1;. 
e880: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
e890: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
e8a0: 69 6e 2d 6d 65 6d 6f 72 79 20 65 6e 74 72 79 20  in-memory entry 
e8b0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
e8c0: 72 20 74 68 69 73 20 6f 6e 65 20 69 73 20 61 0a  r this one is a.
e8d0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 44 45 4c            ** DEL
e8e0: 45 54 45 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f  ETE, and the blo
e8f0: 63 6b 20 6e 75 6d 62 65 72 20 69 73 20 6f 6e 65  ck number is one
e900: 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 63   less than the c
e910: 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20  urrent.         
e920: 20 2a 2a 20 6b 65 79 2c 20 6d 61 72 6b 20 74 68   ** key, mark th
e930: 69 73 20 65 6e 74 72 79 20 61 73 20 61 6e 20 22  is entry as an "
e940: 73 74 61 72 74 2d 64 65 6c 65 74 65 2d 72 61 6e  start-delete-ran
e950: 67 65 22 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ge".  */.       
e960: 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 61 45     if( i>0 && aE
e970: 6e 74 72 79 5b 69 2d 31 5d 2e 69 42 6c 6b 3d 3d  ntry[i-1].iBlk==
e980: 69 4b 65 79 32 2d 31 20 26 26 20 61 45 6e 74 72  iKey2-1 && aEntr
e990: 79 5b 69 2d 31 5d 2e 69 49 64 3c 30 20 29 7b 0a  y[i-1].iId<0 ){.
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 65 54 79 70              eTyp
e9b0: 65 20 7c 3d 20 4c 53 4d 5f 53 54 41 52 54 5f 44  e |= LSM_START_D
e9c0: 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 20  ELETE;.         
e9d0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 4b   }..          pK
e9e0: 65 79 20 3d 20 70 43 73 72 2d 3e 70 53 79 73 74  ey = pCsr->pSyst
e9f0: 65 6d 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  emVal;.         
ea00: 20 6e 4b 65 79 20 3d 20 34 3b 0a 20 20 20 20 20   nKey = 4;.     
ea10: 20 20 20 20 20 6c 73 6d 50 75 74 55 33 32 28 70       lsmPutU32(p
ea20: 4b 65 79 2c 20 7e 69 4b 65 79 32 29 3b 0a 20 20  Key, ~iKey2);.  
ea30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ea40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ea50: 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   }..    default:
ea60: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74   {.      int iPt
ea70: 72 20 3d 20 69 4b 65 79 20 2d 20 43 55 52 53 4f  r = iKey - CURSO
ea80: 52 5f 44 41 54 41 5f 53 45 47 4d 45 4e 54 3b 0a  R_DATA_SEGMENT;.
ea90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 50        assert( iP
eaa0: 74 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  tr>=0 );.      i
eab0: 66 28 20 69 50 74 72 3d 3d 70 43 73 72 2d 3e 6e  f( iPtr==pCsr->n
eac0: 50 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Ptr ){.        i
ead0: 66 28 20 70 43 73 72 2d 3e 70 42 74 43 73 72 20  f( pCsr->pBtCsr 
eae0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65  ){.          pKe
eaf0: 79 20 3d 20 70 43 73 72 2d 3e 70 42 74 43 73 72  y = pCsr->pBtCsr
eb00: 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ->pKey;.        
eb10: 20 20 6e 4b 65 79 20 3d 20 70 43 73 72 2d 3e 70    nKey = pCsr->p
eb20: 42 74 43 73 72 2d 3e 6e 4b 65 79 3b 0a 20 20 20  BtCsr->nKey;.   
eb30: 20 20 20 20 20 20 20 65 54 79 70 65 20 3d 20 70         eType = p
eb40: 43 73 72 2d 3e 70 42 74 43 73 72 2d 3e 65 54 79  Csr->pBtCsr->eTy
eb50: 70 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  pe;.        }.  
eb60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50      }else if( iP
eb70: 74 72 3c 70 43 73 72 2d 3e 6e 50 74 72 20 29 7b  tr<pCsr->nPtr ){
eb80: 0a 20 20 20 20 20 20 20 20 53 65 67 6d 65 6e 74  .        Segment
eb90: 50 74 72 20 2a 70 50 74 72 20 3d 20 26 70 43 73  Ptr *pPtr = &pCs
eba0: 72 2d 3e 61 50 74 72 5b 69 50 74 72 5d 3b 0a 20  r->aPtr[iPtr];. 
ebb0: 20 20 20 20 20 20 20 69 66 28 20 70 50 74 72 2d         if( pPtr-
ebc0: 3e 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20  >pPg ){.        
ebd0: 20 20 70 4b 65 79 20 3d 20 70 50 74 72 2d 3e 70    pKey = pPtr->p
ebe0: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  Key;.          n
ebf0: 4b 65 79 20 3d 20 70 50 74 72 2d 3e 6e 4b 65 79  Key = pPtr->nKey
ec00: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 54 79 70  ;.          eTyp
ec10: 65 20 3d 20 70 50 74 72 2d 3e 65 54 79 70 65 3b  e = pPtr->eType;
ec20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ec30: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
ec40: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
ec50: 20 70 65 54 79 70 65 20 29 20 2a 70 65 54 79 70   peType ) *peTyp
ec60: 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 69 66 28  e = eType;.  if(
ec70: 20 70 6e 4b 65 79 20 29 20 2a 70 6e 4b 65 79 20   pnKey ) *pnKey 
ec80: 3d 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 70 70  = nKey;.  if( pp
ec90: 4b 65 79 20 29 20 2a 70 70 4b 65 79 20 3d 20 70  Key ) *ppKey = p
eca0: 4b 65 79 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  Key;.}..static i
ecb0: 6e 74 20 73 6f 72 74 65 64 44 62 4b 65 79 43 6f  nt sortedDbKeyCo
ecc0: 6d 70 61 72 65 28 0a 20 20 4d 75 6c 74 69 43 75  mpare(.  MultiCu
ecd0: 72 73 6f 72 20 2a 70 43 73 72 2c 0a 20 20 69 6e  rsor *pCsr,.  in
ece0: 74 20 69 4c 68 73 46 6c 61 67 73 2c 20 76 6f 69  t iLhsFlags, voi
ecf0: 64 20 2a 70 4c 68 73 4b 65 79 2c 20 69 6e 74 20  d *pLhsKey, int 
ed00: 6e 4c 68 73 4b 65 79 2c 0a 20 20 69 6e 74 20 69  nLhsKey,.  int i
ed10: 52 68 73 46 6c 61 67 73 2c 20 76 6f 69 64 20 2a  RhsFlags, void *
ed20: 70 52 68 73 4b 65 79 2c 20 69 6e 74 20 6e 52 68  pRhsKey, int nRh
ed30: 73 4b 65 79 0a 29 7b 0a 20 20 69 6e 74 20 28 2a  sKey.){.  int (*
ed40: 78 43 6d 70 29 28 76 6f 69 64 20 2a 2c 20 69 6e  xCmp)(void *, in
ed50: 74 2c 20 76 6f 69 64 20 2a 2c 20 69 6e 74 29 20  t, void *, int) 
ed60: 3d 20 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d  = pCsr->pDb->xCm
ed70: 70 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  p;.  int res;.. 
ed80: 20 2f 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20   /* Compare the 
ed90: 6b 65 79 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  keys, including 
eda0: 74 68 65 20 73 79 73 74 65 6d 20 66 6c 61 67 2e  the system flag.
edb0: 20 2a 2f 0a 20 20 72 65 73 20 3d 20 73 6f 72 74   */.  res = sort
edc0: 65 64 4b 65 79 43 6f 6d 70 61 72 65 28 78 43 6d  edKeyCompare(xCm
edd0: 70 2c 20 0a 20 20 20 20 72 74 54 6f 70 69 63 28  p, .    rtTopic(
ede0: 69 4c 68 73 46 6c 61 67 73 29 2c 20 70 4c 68 73  iLhsFlags), pLhs
edf0: 4b 65 79 2c 20 6e 4c 68 73 4b 65 79 2c 0a 20 20  Key, nLhsKey,.  
ee00: 20 20 72 74 54 6f 70 69 63 28 69 52 68 73 46 6c    rtTopic(iRhsFl
ee10: 61 67 73 29 2c 20 70 52 68 73 4b 65 79 2c 20 6e  ags), pRhsKey, n
ee20: 52 68 73 4b 65 79 0a 20 20 29 3b 0a 0a 20 20 2f  RhsKey.  );..  /
ee30: 2a 20 49 66 20 61 20 6b 65 79 20 68 61 73 20 74  * If a key has t
ee40: 68 65 20 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c  he LSM_START_DEL
ee50: 45 54 45 20 66 6c 61 67 20 73 65 74 2c 20 62 75  ETE flag set, bu
ee60: 74 20 6e 6f 74 20 74 68 65 20 4c 53 4d 5f 49 4e  t not the LSM_IN
ee70: 53 45 52 54 20 6f 72 0a 20 20 2a 2a 20 4c 53 4d  SERT or.  ** LSM
ee80: 5f 50 4f 49 4e 54 5f 44 45 4c 45 54 45 20 66 6c  _POINT_DELETE fl
ee90: 61 67 73 2c 20 69 74 20 69 73 20 63 6f 6e 73 69  ags, it is consi
eea0: 64 65 72 65 64 20 61 20 64 65 6c 74 61 20 6c 61  dered a delta la
eeb0: 72 67 65 72 2e 20 54 68 69 73 20 70 72 65 76 65  rger. This preve
eec0: 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20 62 65 67  nts.  ** the beg
eed0: 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65  inning of an ope
eee0: 6e 2d 65 6e 64 65 64 20 73 65 74 20 66 72 6f 6d  n-ended set from
eef0: 20 6d 61 73 6b 69 6e 67 20 61 20 64 61 74 61 62   masking a datab
ef00: 61 73 65 20 65 6e 74 72 79 20 6f 72 0a 20 20 2a  ase entry or.  *
ef10: 2a 20 64 65 6c 65 74 65 20 61 74 20 61 20 6c 6f  * delete at a lo
ef20: 77 65 72 20 6c 65 76 65 6c 2e 20 20 2a 2f 0a 20  wer level.  */. 
ef30: 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28   if( res==0 && (
ef40: 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 43 55  pCsr->flags & CU
ef50: 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 44 45 4c 45  RSOR_IGNORE_DELE
ef60: 54 45 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  TE) ){.    const
ef70: 20 69 6e 74 20 6d 20 3d 20 4c 53 4d 5f 50 4f 49   int m = LSM_POI
ef80: 4e 54 5f 44 45 4c 45 54 45 7c 4c 53 4d 5f 49 4e  NT_DELETE|LSM_IN
ef90: 53 45 52 54 7c 4c 53 4d 5f 45 4e 44 5f 44 45 4c  SERT|LSM_END_DEL
efa0: 45 54 45 20 7c 4c 53 4d 5f 53 54 41 52 54 5f 44  ETE |LSM_START_D
efb0: 45 4c 45 54 45 3b 0a 20 20 20 20 69 6e 74 20 69  ELETE;.    int i
efc0: 44 65 6c 31 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Del1 = 0;.    in
efd0: 74 20 69 44 65 6c 32 20 3d 20 30 3b 0a 0a 20 20  t iDel2 = 0;..  
efe0: 20 20 69 66 28 20 4c 53 4d 5f 53 54 41 52 54 5f    if( LSM_START_
eff0: 44 45 4c 45 54 45 3d 3d 28 69 4c 68 73 46 6c 61  DELETE==(iLhsFla
f000: 67 73 20 26 20 6d 29 20 29 20 69 44 65 6c 31 20  gs & m) ) iDel1 
f010: 3d 20 2b 31 3b 0a 20 20 20 20 69 66 28 20 4c 53  = +1;.    if( LS
f020: 4d 5f 45 4e 44 5f 44 45 4c 45 54 45 20 20 3d 3d  M_END_DELETE  ==
f030: 28 69 4c 68 73 46 6c 61 67 73 20 26 20 6d 29 20  (iLhsFlags & m) 
f040: 29 20 69 44 65 6c 31 20 3d 20 2d 31 3b 0a 20 20  ) iDel1 = -1;.  
f050: 20 20 69 66 28 20 4c 53 4d 5f 53 54 41 52 54 5f    if( LSM_START_
f060: 44 45 4c 45 54 45 3d 3d 28 69 52 68 73 46 6c 61  DELETE==(iRhsFla
f070: 67 73 20 26 20 6d 29 20 29 20 69 44 65 6c 32 20  gs & m) ) iDel2 
f080: 3d 20 2b 31 3b 0a 20 20 20 20 69 66 28 20 4c 53  = +1;.    if( LS
f090: 4d 5f 45 4e 44 5f 44 45 4c 45 54 45 20 20 3d 3d  M_END_DELETE  ==
f0a0: 28 69 52 68 73 46 6c 61 67 73 20 26 20 6d 29 20  (iRhsFlags & m) 
f0b0: 29 20 69 44 65 6c 32 20 3d 20 2d 31 3b 0a 0a 20  ) iDel2 = -1;.. 
f0c0: 20 20 20 72 65 73 20 3d 20 28 69 44 65 6c 31 20     res = (iDel1 
f0d0: 2d 20 69 44 65 6c 32 29 3b 0a 20 20 7d 0a 0a 20  - iDel2);.  }.. 
f0e0: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
f0f0: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 75 6c 74  static void mult
f100: 69 43 75 72 73 6f 72 44 6f 43 6f 6d 70 61 72 65  iCursorDoCompare
f110: 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43  (MultiCursor *pC
f120: 73 72 2c 20 69 6e 74 20 69 4f 75 74 2c 20 69 6e  sr, int iOut, in
f130: 74 20 62 52 65 76 65 72 73 65 29 7b 0a 20 20 69  t bReverse){.  i
f140: 6e 74 20 69 31 3b 0a 20 20 69 6e 74 20 69 32 3b  nt i1;.  int i2;
f150: 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 76  .  int iRes;.  v
f160: 6f 69 64 20 2a 70 4b 65 79 31 3b 20 69 6e 74 20  oid *pKey1; int 
f170: 6e 4b 65 79 31 3b 20 69 6e 74 20 65 54 79 70 65  nKey1; int eType
f180: 31 3b 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 32  1;.  void *pKey2
f190: 3b 20 69 6e 74 20 6e 4b 65 79 32 3b 20 69 6e 74  ; int nKey2; int
f1a0: 20 65 54 79 70 65 32 3b 0a 20 20 63 6f 6e 73 74   eType2;.  const
f1b0: 20 69 6e 74 20 6d 75 6c 20 3d 20 28 62 52 65 76   int mul = (bRev
f1c0: 65 72 73 65 20 3f 20 2d 31 20 3a 20 31 29 3b 0a  erse ? -1 : 1);.
f1d0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
f1e0: 3e 61 54 72 65 65 20 26 26 20 69 4f 75 74 3c 70  >aTree && iOut<p
f1f0: 43 73 72 2d 3e 6e 54 72 65 65 20 29 3b 0a 20 20  Csr->nTree );.  
f200: 69 66 28 20 69 4f 75 74 3e 3d 28 70 43 73 72 2d  if( iOut>=(pCsr-
f210: 3e 6e 54 72 65 65 2f 32 29 20 29 7b 0a 20 20 20  >nTree/2) ){.   
f220: 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 43   i1 = (iOut - pC
f230: 73 72 2d 3e 6e 54 72 65 65 2f 32 29 20 2a 20 32  sr->nTree/2) * 2
f240: 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20  ;.    i2 = i1 + 
f250: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
f260: 69 31 20 3d 20 70 43 73 72 2d 3e 61 54 72 65 65  i1 = pCsr->aTree
f270: 5b 69 4f 75 74 2a 32 5d 3b 0a 20 20 20 20 69 32  [iOut*2];.    i2
f280: 20 3d 20 70 43 73 72 2d 3e 61 54 72 65 65 5b 69   = pCsr->aTree[i
f290: 4f 75 74 2a 32 2b 31 5d 3b 0a 20 20 7d 0a 0a 20  Out*2+1];.  }.. 
f2a0: 20 6d 75 6c 74 69 43 75 72 73 6f 72 47 65 74 4b   multiCursorGetK
f2b0: 65 79 28 70 43 73 72 2c 20 69 31 2c 20 26 65 54  ey(pCsr, i1, &eT
f2c0: 79 70 65 31 2c 20 26 70 4b 65 79 31 2c 20 26 6e  ype1, &pKey1, &n
f2d0: 4b 65 79 31 29 3b 0a 20 20 6d 75 6c 74 69 43 75  Key1);.  multiCu
f2e0: 72 73 6f 72 47 65 74 4b 65 79 28 70 43 73 72 2c  rsorGetKey(pCsr,
f2f0: 20 69 32 2c 20 26 65 54 79 70 65 32 2c 20 26 70   i2, &eType2, &p
f300: 4b 65 79 32 2c 20 26 6e 4b 65 79 32 29 3b 0a 0a  Key2, &nKey2);..
f310: 20 20 69 66 28 20 70 4b 65 79 31 3d 3d 30 20 29    if( pKey1==0 )
f320: 7b 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b  {.    iRes = i2;
f330: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65  .  }else if( pKe
f340: 79 32 3d 3d 30 20 29 7b 0a 20 20 20 20 69 52 65  y2==0 ){.    iRe
f350: 73 20 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b  s = i1;.  }else{
f360: 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  .    int res;.. 
f370: 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 74 68     /* Compare th
f380: 65 20 6b 65 79 73 20 2a 2f 0a 20 20 20 20 72 65  e keys */.    re
f390: 73 20 3d 20 73 6f 72 74 65 64 44 62 4b 65 79 43  s = sortedDbKeyC
f3a0: 6f 6d 70 61 72 65 28 70 43 73 72 2c 0a 20 20 20  ompare(pCsr,.   
f3b0: 20 20 20 20 20 65 54 79 70 65 31 2c 20 70 4b 65       eType1, pKe
f3c0: 79 31 2c 20 6e 4b 65 79 31 2c 20 65 54 79 70 65  y1, nKey1, eType
f3d0: 32 2c 20 70 4b 65 79 32 2c 20 6e 4b 65 79 32 0a  2, pKey2, nKey2.
f3e0: 20 20 20 20 29 3b 0a 0a 20 20 20 20 72 65 73 20      );..    res 
f3f0: 3d 20 72 65 73 20 2a 20 6d 75 6c 3b 0a 20 20 20  = res * mul;.   
f400: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
f410: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
f420: 6b 65 79 73 20 61 72 65 20 69 64 65 6e 74 69 63  keys are identic
f430: 61 6c 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  al. Normally, th
f440: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
f450: 65 20 6b 65 79 20 66 72 6f 6d 0a 20 20 20 20 20  e key from.     
f460: 20 2a 2a 20 74 68 65 20 6e 65 77 65 72 20 72 75   ** the newer ru
f470: 6e 20 63 6c 6f 62 62 65 72 73 20 74 68 65 20 6f  n clobbers the o
f480: 6c 64 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ld. However, if 
f490: 74 68 65 20 6e 65 77 65 72 20 6b 65 79 20 69 73  the newer key is
f4a0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 65 70 61   a.      ** sepa
f4b0: 72 61 74 6f 72 20 6b 65 79 2c 20 6f 72 20 61 20  rator key, or a 
f4c0: 72 61 6e 67 65 2d 64 65 6c 65 74 65 2d 62 6f 75  range-delete-bou
f4d0: 6e 64 61 72 79 20 6f 6e 6c 79 2c 20 64 6f 20 6e  ndary only, do n
f4e0: 6f 74 20 61 6c 6c 6f 77 20 69 74 0a 20 20 20 20  ot allow it.    
f4f0: 20 20 2a 2a 20 74 6f 20 63 6c 6f 62 62 65 72 20    ** to clobber 
f500: 61 6e 20 6f 6c 64 65 72 20 65 6e 74 72 79 2e 20  an older entry. 
f510: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 63   */.      int nc
f520: 31 20 3d 20 28 65 54 79 70 65 31 20 26 20 28 4c  1 = (eType1 & (L
f530: 53 4d 5f 49 4e 53 45 52 54 7c 4c 53 4d 5f 50 4f  SM_INSERT|LSM_PO
f540: 49 4e 54 5f 44 45 4c 45 54 45 29 29 3d 3d 30 3b  INT_DELETE))==0;
f550: 0a 20 20 20 20 20 20 69 6e 74 20 6e 63 32 20 3d  .      int nc2 =
f560: 20 28 65 54 79 70 65 32 20 26 20 28 4c 53 4d 5f   (eType2 & (LSM_
f570: 49 4e 53 45 52 54 7c 4c 53 4d 5f 50 4f 49 4e 54  INSERT|LSM_POINT
f580: 5f 44 45 4c 45 54 45 29 29 3d 3d 30 3b 0a 20 20  _DELETE))==0;.  
f590: 20 20 20 20 69 52 65 73 20 3d 20 28 6e 63 31 20      iRes = (nc1 
f5a0: 3e 20 6e 63 32 29 20 3f 20 69 32 20 3a 20 69 31  > nc2) ? i2 : i1
f5b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
f5c0: 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  res<0 ){.      i
f5d0: 52 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65  Res = i1;.    }e
f5e0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20  lse{.      iRes 
f5f0: 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = i2;.    }.  }.
f600: 0a 20 20 70 43 73 72 2d 3e 61 54 72 65 65 5b 69  .  pCsr->aTree[i
f610: 4f 75 74 5d 20 3d 20 69 52 65 73 3b 0a 7d 0a 0a  Out] = iRes;.}..
f620: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
f630: 69 6f 6e 20 61 64 76 61 6e 63 65 73 20 73 65 67  ion advances seg
f640: 6d 65 6e 74 20 70 6f 69 6e 74 65 72 20 69 50 74  ment pointer iPt
f650: 72 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 6d  r belonging to m
f660: 75 6c 74 69 2d 63 75 72 73 6f 72 0a 2a 2a 20 70  ulti-cursor.** p
f670: 43 73 72 20 66 6f 72 77 61 72 64 20 28 62 52 65  Csr forward (bRe
f680: 76 65 72 73 65 3d 3d 30 29 20 6f 72 20 62 61 63  verse==0) or bac
f690: 6b 77 61 72 64 20 28 62 52 65 76 65 72 73 65 21  kward (bReverse!
f6a0: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  =0)..**.** If th
f6b0: 65 20 73 65 67 6d 65 6e 74 20 70 6f 69 6e 74 65  e segment pointe
f6c0: 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 65  r points to a se
f6d0: 67 6d 65 6e 74 20 74 68 61 74 20 69 73 20 70 61  gment that is pa
f6e0: 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 73 69 74  rt of a composit
f6f0: 65 0a 2a 2a 20 6c 65 76 65 6c 2c 20 74 68 65 6e  e.** level, then
f700: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
f710: 70 65 63 69 61 6c 20 63 61 73 65 20 69 73 20 68  pecial case is h
f720: 61 6e 64 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  andled..**.**   
f730: 2a 20 49 66 20 69 50 74 72 20 69 73 20 74 68 65  * If iPtr is the
f740: 20 6c 68 73 20 6f 66 20 61 20 63 6f 6d 70 6f 73   lhs of a compos
f750: 69 74 65 20 6c 65 76 65 6c 2c 20 61 6e 64 20 74  ite level, and t
f760: 68 65 20 63 75 72 73 6f 72 20 69 73 20 62 65 69  he cursor is bei
f770: 6e 67 0a 2a 2a 20 20 20 20 20 61 64 76 61 6e 63  ng.**     advanc
f780: 65 64 20 66 6f 72 77 61 72 64 73 2c 20 61 6e 64  ed forwards, and
f790: 20 73 65 67 6d 65 6e 74 20 69 50 74 72 20 69 73   segment iPtr is
f7a0: 20 61 74 20 45 4f 46 2c 20 6d 6f 76 65 20 61 6c   at EOF, move al
f7b0: 6c 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 20 20  l pointers.**   
f7c0: 20 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e    that correspon
f7d0: 64 20 74 6f 20 72 68 73 20 73 65 67 6d 65 6e 74  d to rhs segment
f7e0: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 65  s of the same le
f7f0: 76 65 6c 20 74 6f 20 74 68 65 20 66 69 72 73 74  vel to the first
f800: 0a 2a 2a 20 20 20 20 20 6b 65 79 20 69 6e 20 74  .**     key in t
f810: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
f820: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
f830: 69 6e 74 20 73 65 67 6d 65 6e 74 43 75 72 73 6f  int segmentCurso
f840: 72 41 64 76 61 6e 63 65 28 0a 20 20 4d 75 6c 74  rAdvance(.  Mult
f850: 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a  iCursor *pCsr, .
f860: 20 20 69 6e 74 20 69 50 74 72 2c 0a 20 20 69 6e    int iPtr,.  in
f870: 74 20 62 52 65 76 65 72 73 65 0a 29 7b 0a 20 20  t bReverse.){.  
f880: 69 6e 74 20 72 63 3b 0a 20 20 53 65 67 6d 65 6e  int rc;.  Segmen
f890: 74 50 74 72 20 2a 70 50 74 72 20 3d 20 26 70 43  tPtr *pPtr = &pC
f8a0: 73 72 2d 3e 61 50 74 72 5b 69 50 74 72 5d 3b 0a  sr->aPtr[iPtr];.
f8b0: 20 20 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20    Level *pLvl = 
f8c0: 70 50 74 72 2d 3e 70 4c 65 76 65 6c 3b 0a 20 20  pPtr->pLevel;.  
f8d0: 69 6e 74 20 62 43 6f 6d 70 6f 73 69 74 65 3b 20  int bComposite; 
f8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8f0: 2f 2a 20 54 72 75 65 20 69 66 20 70 50 74 72 20  /* True if pPtr 
f900: 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6d 70 6f  is part of compo
f910: 73 69 74 65 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20  site level */.. 
f920: 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20   /* Advance the 
f930: 73 65 67 6d 65 6e 74 2d 70 6f 69 6e 74 65 72 20  segment-pointer 
f940: 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 72 63 20  object. */.  rc 
f950: 3d 20 73 65 67 6d 65 6e 74 50 74 72 41 64 76 61  = segmentPtrAdva
f960: 6e 63 65 28 70 43 73 72 2c 20 70 50 74 72 2c 20  nce(pCsr, pPtr, 
f970: 62 52 65 76 65 72 73 65 29 3b 0a 20 20 69 66 28  bReverse);.  if(
f980: 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72 65   rc!=LSM_OK ) re
f990: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 62 43 6f 6d  turn rc;..  bCom
f9a0: 70 6f 73 69 74 65 20 3d 20 28 70 4c 76 6c 2d 3e  posite = (pLvl->
f9b0: 6e 52 69 67 68 74 3e 30 20 26 26 20 70 43 73 72  nRight>0 && pCsr
f9c0: 2d 3e 6e 50 74 72 3e 70 4c 76 6c 2d 3e 6e 52 69  ->nPtr>pLvl->nRi
f9d0: 67 68 74 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d  ght);.  if( bCom
f9e0: 70 6f 73 69 74 65 20 26 26 20 70 50 74 72 2d 3e  posite && pPtr->
f9f0: 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  pPg==0 ){.    in
fa00: 74 20 62 46 69 78 20 3d 20 30 3b 0a 20 20 20 20  t bFix = 0;.    
fa10: 69 66 28 20 28 62 52 65 76 65 72 73 65 3d 3d 30  if( (bReverse==0
fa20: 29 3d 3d 28 70 50 74 72 2d 3e 70 53 65 67 3d 3d  )==(pPtr->pSeg==
fa30: 26 70 4c 76 6c 2d 3e 6c 68 73 29 20 29 7b 0a 20  &pLvl->lhs) ){. 
fa40: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
fa50: 20 20 69 66 28 20 62 52 65 76 65 72 73 65 20 29    if( bReverse )
fa60: 7b 0a 20 20 20 20 20 20 20 20 53 65 67 6d 65 6e  {.        Segmen
fa70: 74 50 74 72 20 2a 70 4c 68 73 20 3d 20 26 70 43  tPtr *pLhs = &pC
fa80: 73 72 2d 3e 61 50 74 72 5b 69 50 74 72 20 2d 20  sr->aPtr[iPtr - 
fa90: 31 20 2d 20 28 70 50 74 72 2d 3e 70 53 65 67 20  1 - (pPtr->pSeg 
faa0: 2d 20 70 4c 76 6c 2d 3e 61 52 68 73 29 5d 3b 0a  - pLvl->aRhs)];.
fab0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
fac0: 20 69 3c 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 3b   i<pLvl->nRight;
fad0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
fae0: 20 69 66 28 20 70 4c 68 73 5b 69 2b 31 5d 2e 70   if( pLhs[i+1].p
faf0: 50 67 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  Pg ) break;.    
fb00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
fb10: 28 20 69 3d 3d 70 4c 76 6c 2d 3e 6e 52 69 67 68  ( i==pLvl->nRigh
fb20: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  t ){.          b
fb30: 46 69 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Fix = 1;.       
fb40: 20 20 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50     rc = segmentP
fb50: 74 72 45 6e 64 28 70 43 73 72 2c 20 70 4c 68 73  trEnd(pCsr, pLhs
fb60: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 1);.        }.
fb70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fb80: 20 20 20 20 20 62 46 69 78 20 3d 20 31 3b 0a 20       bFix = 1;. 
fb90: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
fba0: 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 69 3c  rc==LSM_OK && i<
fbb0: 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 3b 20 69 2b  pLvl->nRight; i+
fbc0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  +){.          rc
fbd0: 20 3d 20 73 6f 72 74 65 64 52 68 73 46 69 72 73   = sortedRhsFirs
fbe0: 74 28 70 43 73 72 2c 20 70 4c 76 6c 2c 20 26 70  t(pCsr, pLvl, &p
fbf0: 43 73 72 2d 3e 61 50 74 72 5b 69 50 74 72 2b 31  Csr->aPtr[iPtr+1
fc00: 2b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  +i]);.        }.
fc10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
fc20: 20 20 20 69 66 28 20 62 46 69 78 20 29 7b 0a 20     if( bFix ){. 
fc30: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
fc40: 20 20 66 6f 72 28 69 3d 70 43 73 72 2d 3e 6e 54    for(i=pCsr->nT
fc50: 72 65 65 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  ree-1; i>0; i--)
fc60: 7b 0a 20 20 20 20 20 20 20 20 6d 75 6c 74 69 43  {.        multiC
fc70: 75 72 73 6f 72 44 6f 43 6f 6d 70 61 72 65 28 70  ursorDoCompare(p
fc80: 43 73 72 2c 20 69 2c 20 62 52 65 76 65 72 73 65  Csr, i, bReverse
fc90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
fca0: 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 69 66  .  }..#if 0.  if
fcb0: 28 20 62 43 6f 6d 70 6f 73 69 74 65 20 26 26 20  ( bComposite && 
fcc0: 70 50 74 72 2d 3e 70 53 65 67 3d 3d 26 70 4c 76  pPtr->pSeg==&pLv
fcd0: 6c 2d 3e 6c 68 73 20 20 20 20 20 20 20 2f 2a 20  l->lhs       /* 
fce0: 6c 68 73 20 6f 66 20 63 6f 6d 70 6f 73 69 74 65  lhs of composite
fcf0: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 26 26 20   level */.   && 
fd00: 62 52 65 76 65 72 73 65 3d 3d 30 20 20 20 20 20  bReverse==0     
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 73             /* cs
fd30: 72 20 61 64 76 61 6e 63 65 64 20 66 6f 72 77 61  r advanced forwa
fd40: 72 64 73 20 2a 2f 0a 20 20 20 26 26 20 70 50 74  rds */.   && pPt
fd50: 72 2d 3e 70 50 67 3d 3d 30 20 20 20 20 20 20 20  r->pPg==0       
fd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd70: 20 20 20 20 20 20 20 20 2f 2a 20 73 65 67 6d 65          /* segme
fd80: 6e 74 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 29  nt at EOF */.  )
fd90: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
fda0: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 4c 53   for(i=0; rc==LS
fdb0: 4d 5f 4f 4b 20 26 26 20 69 3c 70 4c 76 6c 2d 3e  M_OK && i<pLvl->
fdc0: 6e 52 69 67 68 74 3b 20 69 2b 2b 29 7b 0a 20 20  nRight; i++){.  
fdd0: 20 20 20 20 72 63 20 3d 20 73 6f 72 74 65 64 52      rc = sortedR
fde0: 68 73 46 69 72 73 74 28 70 43 73 72 2c 20 70 4c  hsFirst(pCsr, pL
fdf0: 76 6c 2c 20 26 70 43 73 72 2d 3e 61 50 74 72 5b  vl, &pCsr->aPtr[
fe00: 69 50 74 72 2b 31 2b 69 5d 29 3b 0a 20 20 20 20  iPtr+1+i]);.    
fe10: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 70 43 73 72  }.    for(i=pCsr
fe20: 2d 3e 6e 54 72 65 65 2d 31 3b 20 69 3e 30 3b 20  ->nTree-1; i>0; 
fe30: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6d 75 6c 74  i--){.      mult
fe40: 69 43 75 72 73 6f 72 44 6f 43 6f 6d 70 61 72 65  iCursorDoCompare
fe50: 28 70 43 73 72 2c 20 69 2c 20 30 29 3b 0a 20 20  (pCsr, i, 0);.  
fe60: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
fe70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
fe80: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 63 75 72  static void mcur
fe90: 73 6f 72 46 72 65 65 43 6f 6d 70 6f 6e 65 6e 74  sorFreeComponent
fea0: 73 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70  s(MultiCursor *p
feb0: 43 73 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Csr){.  int i;. 
fec0: 20 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 20 3d   lsm_env *pEnv =
fed0: 20 70 43 73 72 2d 3e 70 44 62 2d 3e 70 45 6e 76   pCsr->pDb->pEnv
fee0: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68  ;..  /* Close th
fef0: 65 20 74 72 65 65 20 63 75 72 73 6f 72 2c 20 69  e tree cursor, i
ff00: 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 6c 73 6d 54  f any. */.  lsmT
ff10: 72 65 65 43 75 72 73 6f 72 44 65 73 74 72 6f 79  reeCursorDestroy
ff20: 28 70 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72  (pCsr->apTreeCsr
ff30: 5b 30 5d 29 3b 0a 20 20 6c 73 6d 54 72 65 65 43  [0]);.  lsmTreeC
ff40: 75 72 73 6f 72 44 65 73 74 72 6f 79 28 70 43 73  ursorDestroy(pCs
ff50: 72 2d 3e 61 70 54 72 65 65 43 73 72 5b 31 5d 29  r->apTreeCsr[1])
ff60: 3b 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 74 68  ;..  /* Reset th
ff70: 65 20 73 65 67 6d 65 6e 74 20 70 6f 69 6e 74 65  e segment pointe
ff80: 72 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  rs */.  for(i=0;
ff90: 20 69 3c 70 43 73 72 2d 3e 6e 50 74 72 3b 20 69   i<pCsr->nPtr; i
ffa0: 2b 2b 29 7b 0a 20 20 20 20 73 65 67 6d 65 6e 74  ++){.    segment
ffb0: 50 74 72 52 65 73 65 74 28 26 70 43 73 72 2d 3e  PtrReset(&pCsr->
ffc0: 61 50 74 72 5b 69 5d 2c 20 30 29 3b 0a 20 20 7d  aPtr[i], 0);.  }
ffd0: 0a 0a 20 20 2f 2a 20 41 6e 64 20 74 68 65 20 62  ..  /* And the b
ffe0: 2d 74 72 65 65 20 63 75 72 73 6f 72 2c 20 69 66  -tree cursor, if
fff0: 20 61 6e 79 20 2a 2f 0a 20 20 62 74 72 65 65 43   any */.  btreeC
10000 75 72 73 6f 72 46 72 65 65 28 70 43 73 72 2d 3e  ursorFree(pCsr->
10010 70 42 74 43 73 72 29 3b 0a 0a 20 20 2f 2a 20 46  pBtCsr);..  /* F
10020 72 65 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ree allocations 
10030 2a 2f 0a 20 20 6c 73 6d 46 72 65 65 28 70 45 6e  */.  lsmFree(pEn
10040 76 2c 20 70 43 73 72 2d 3e 61 50 74 72 29 3b 0a  v, pCsr->aPtr);.
10050 20 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c 20    lsmFree(pEnv, 
10060 70 43 73 72 2d 3e 61 54 72 65 65 29 3b 0a 20 20  pCsr->aTree);.  
10070 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c 20 70 43  lsmFree(pEnv, pC
10080 73 72 2d 3e 70 53 79 73 74 65 6d 56 61 6c 29 3b  sr->pSystemVal);
10090 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 66 69 65 6c  ..  /* Zero fiel
100a0 64 73 20 2a 2f 0a 20 20 70 43 73 72 2d 3e 6e 50  ds */.  pCsr->nP
100b0 74 72 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d 3e  tr = 0;.  pCsr->
100c0 61 50 74 72 20 3d 20 30 3b 0a 20 20 70 43 73 72  aPtr = 0;.  pCsr
100d0 2d 3e 6e 54 72 65 65 20 3d 20 30 3b 0a 20 20 70  ->nTree = 0;.  p
100e0 43 73 72 2d 3e 61 54 72 65 65 20 3d 20 30 3b 0a  Csr->aTree = 0;.
100f0 20 20 70 43 73 72 2d 3e 70 53 79 73 74 65 6d 56    pCsr->pSystemV
10100 61 6c 20 3d 20 30 3b 0a 20 20 70 43 73 72 2d 3e  al = 0;.  pCsr->
10110 61 70 54 72 65 65 43 73 72 5b 30 5d 20 3d 20 30  apTreeCsr[0] = 0
10120 3b 0a 20 20 70 43 73 72 2d 3e 61 70 54 72 65 65  ;.  pCsr->apTree
10130 43 73 72 5b 31 5d 20 3d 20 30 3b 0a 20 20 70 43  Csr[1] = 0;.  pC
10140 73 72 2d 3e 70 42 74 43 73 72 20 3d 20 30 3b 0a  sr->pBtCsr = 0;.
10150 7d 0a 0a 76 6f 69 64 20 6c 73 6d 4d 43 75 72 73  }..void lsmMCurs
10160 6f 72 46 72 65 65 43 61 63 68 65 28 6c 73 6d 5f  orFreeCache(lsm_
10170 64 62 20 2a 70 44 62 29 7b 0a 20 20 4d 75 6c 74  db *pDb){.  Mult
10180 69 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 4d 75  iCursor *p;.  Mu
10190 6c 74 69 43 75 72 73 6f 72 20 2a 70 4e 65 78 74  ltiCursor *pNext
101a0 3b 0a 20 20 66 6f 72 28 70 3d 70 44 62 2d 3e 70  ;.  for(p=pDb->p
101b0 43 73 72 43 61 63 68 65 3b 20 70 3b 20 70 3d 70  CsrCache; p; p=p
101c0 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
101d0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
101e0 20 6c 73 6d 4d 43 75 72 73 6f 72 43 6c 6f 73 65   lsmMCursorClose
101f0 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 44  (p, 0);.  }.  pD
10200 62 2d 3e 70 43 73 72 43 61 63 68 65 20 3d 20 30  b->pCsrCache = 0
10210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
10220 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
10230 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
10240 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
10250 49 66 20 74 68 65 20 62 43 61 63 68 65 20 70 61  If the bCache pa
10260 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2c  rameter is true,
10270 20 74 68 65 6e 20 73 68 69 66 74 20 74 68 65 20   then shift the 
10280 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 43  cursor to the pC
10290 73 72 43 61 63 68 65 0a 2a 2a 20 6c 69 73 74 20  srCache.** list 
102a0 66 6f 72 20 70 6f 73 73 69 62 6c 65 20 72 65 75  for possible reu
102b0 73 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 63  se instead of ac
102c0 74 75 61 6c 6c 79 20 64 65 6c 65 74 69 6e 67 20  tually deleting 
102d0 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 6c 73 6d 4d  it..*/.void lsmM
102e0 43 75 72 73 6f 72 43 6c 6f 73 65 28 4d 75 6c 74  CursorClose(Mult
102f0 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 69  iCursor *pCsr, i
10300 6e 74 20 62 43 61 63 68 65 29 7b 0a 20 20 69 66  nt bCache){.  if
10310 28 20 70 43 73 72 20 29 7b 0a 20 20 20 20 6c 73  ( pCsr ){.    ls
10320 6d 5f 64 62 20 2a 70 44 62 20 3d 20 70 43 73 72  m_db *pDb = pCsr
10330 2d 3e 70 44 62 3b 0a 20 20 20 20 4d 75 6c 74 69  ->pDb;.    Multi
10340 43 75 72 73 6f 72 20 2a 2a 70 70 3b 20 20 20 20  Cursor **pp;    
10350 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
10360 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
10370 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72  ..    /* The cur
10380 73 6f 72 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  sor may or may n
10390 6f 74 20 62 65 20 63 75 72 72 65 6e 74 6c 79 20  ot be currently 
103a0 70 61 72 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b  part of the link
103b0 65 64 20 6c 69 73 74 20 0a 20 20 20 20 2a 2a 20  ed list .    ** 
103c0 73 74 61 72 74 69 6e 67 20 61 74 20 6c 73 6d 5f  starting at lsm_
103d0 64 62 2e 70 43 73 72 2e 20 49 66 20 69 74 20 69  db.pCsr. If it i
103e0 73 2c 20 65 78 74 72 61 63 74 20 69 74 2e 20 20  s, extract it.  
103f0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 70  */.    for(pp=&p
10400 44 62 2d 3e 70 43 73 72 3b 20 2a 70 70 3b 20 70  Db->pCsr; *pp; p
10410 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
10420 29 29 7b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  )){.      if( *p
10430 70 3d 3d 70 43 73 72 20 29 7b 0a 20 20 20 20 20  p==pCsr ){.     
10440 20 20 20 2a 70 70 20 3d 20 70 43 73 72 2d 3e 70     *pp = pCsr->p
10450 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 62 72  Next;.        br
10460 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
10470 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 43 61 63   }..    if( bCac
10480 68 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  he ){.      int 
10490 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
104a0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
104b0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
104c0 67 68 20 73 65 67 6d 65 6e 74 2d 70 6f 69 6e 74  gh segment-point
104d0 65 72 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ers */..      /*
104e0 20 52 65 6c 65 61 73 65 20 61 6e 79 20 70 61 67   Release any pag
104f0 65 20 72 65 66 65 72 65 6e 63 65 73 20 68 65 6c  e references hel
10500 64 20 62 79 20 74 68 69 73 20 63 75 72 73 6f 72  d by this cursor
10510 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
10520 74 28 20 21 70 43 73 72 2d 3e 70 42 74 43 73 72  t( !pCsr->pBtCsr
10530 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
10540 30 3b 20 69 3c 70 43 73 72 2d 3e 6e 50 74 72 3b  0; i<pCsr->nPtr;
10550 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 53   i++){.        S
10560 65 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72 20  egmentPtr *pPtr 
10570 3d 20 26 70 43 73 72 2d 3e 61 50 74 72 5b 69 5d  = &pCsr->aPtr[i]
10580 3b 0a 20 20 20 20 20 20 20 20 6c 73 6d 46 73 50  ;.        lsmFsP
10590 61 67 65 52 65 6c 65 61 73 65 28 70 50 74 72 2d  ageRelease(pPtr-
105a0 3e 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70  >pPg);.        p
105b0 50 74 72 2d 3e 70 50 67 20 3d 20 30 3b 0a 20 20  Ptr->pPg = 0;.  
105c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
105d0 52 65 73 65 74 20 74 68 65 20 74 72 65 65 20 63  Reset the tree c
105e0 75 72 73 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  ursors */.      
105f0 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 52 65 73  lsmTreeCursorRes
10600 65 74 28 70 43 73 72 2d 3e 61 70 54 72 65 65 43  et(pCsr->apTreeC
10610 73 72 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6c 73  sr[0]);.      ls
10620 6d 54 72 65 65 43 75 72 73 6f 72 52 65 73 65 74  mTreeCursorReset
10630 28 70 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72  (pCsr->apTreeCsr
10640 5b 31 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  [1]);..      /* 
10650 41 64 64 20 74 68 65 20 63 75 72 73 6f 72 20 74  Add the cursor t
10660 6f 20 74 68 65 20 70 43 73 72 43 61 63 68 65 20  o the pCsrCache 
10670 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 70 43  list */.      pC
10680 73 72 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d  sr->pNext = pDb-
10690 3e 70 43 73 72 43 61 63 68 65 3b 0a 20 20 20 20  >pCsrCache;.    
106a0 20 20 70 44 62 2d 3e 70 43 73 72 43 61 63 68 65    pDb->pCsrCache
106b0 20 3d 20 70 43 73 72 3b 0a 20 20 20 20 7d 65 6c   = pCsr;.    }el
106c0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65  se{.      /* Fre
106d0 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
106e0 20 75 73 65 64 20 74 6f 20 63 61 63 68 65 20 74   used to cache t
106f0 68 65 20 63 75 72 72 65 6e 74 20 6b 65 79 2c 20  he current key, 
10700 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 20  if any. */.     
10710 20 73 6f 72 74 65 64 42 6c 6f 62 46 72 65 65 28   sortedBlobFree(
10720 26 70 43 73 72 2d 3e 6b 65 79 29 3b 0a 20 20 20  &pCsr->key);.   
10730 20 20 20 73 6f 72 74 65 64 42 6c 6f 62 46 72 65     sortedBlobFre
10740 65 28 26 70 43 73 72 2d 3e 76 61 6c 29 3b 0a 0a  e(&pCsr->val);..
10750 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68        /* Free th
10760 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 63 75 72 73  e component curs
10770 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 6d 63 75  ors */.      mcu
10780 72 73 6f 72 46 72 65 65 43 6f 6d 70 6f 6e 65 6e  rsorFreeComponen
10790 74 73 28 70 43 73 72 29 3b 0a 0a 20 20 20 20 20  ts(pCsr);..     
107a0 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 75 72   /* Free the cur
107b0 73 6f 72 20 73 74 72 75 63 74 75 72 65 20 69 74  sor structure it
107c0 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 6c 73  self */.      ls
107d0 6d 46 72 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c  mFree(pDb->pEnv,
107e0 20 70 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20   pCsr);.    }.  
107f0 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 54 52 45  }.}..#define TRE
10800 45 5f 4e 4f 4e 45 20 30 0a 23 64 65 66 69 6e 65  E_NONE 0.#define
10810 20 54 52 45 45 5f 4f 4c 44 20 20 31 0a 23 64 65   TREE_OLD  1.#de
10820 66 69 6e 65 20 54 52 45 45 5f 42 4f 54 48 20 32  fine TREE_BOTH 2
10830 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
10840 72 20 65 54 72 65 65 20 69 73 20 6f 6e 65 20 6f  r eTree is one o
10850 66 20 54 52 45 45 5f 4f 4c 44 20 6f 72 20 54 52  f TREE_OLD or TR
10860 45 45 5f 42 4f 54 48 2e 0a 2a 2f 0a 73 74 61 74  EE_BOTH..*/.stat
10870 69 63 20 69 6e 74 20 6d 75 6c 74 69 43 75 72 73  ic int multiCurs
10880 6f 72 41 64 64 54 72 65 65 28 4d 75 6c 74 69 43  orAddTree(MultiC
10890 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 53 6e 61  ursor *pCsr, Sna
108a0 70 73 68 6f 74 20 2a 70 53 6e 61 70 2c 20 69 6e  pshot *pSnap, in
108b0 74 20 65 54 72 65 65 29 7b 0a 20 20 69 6e 74 20  t eTree){.  int 
108c0 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 6c  rc = LSM_OK;.  l
108d0 73 6d 5f 64 62 20 2a 64 62 20 3d 20 70 43 73 72  sm_db *db = pCsr
108e0 2d 3e 70 44 62 3b 0a 0a 20 20 2f 2a 20 41 64 64  ->pDb;..  /* Add
108f0 20 61 20 74 72 65 65 20 63 75 72 73 6f 72 20 6f   a tree cursor o
10900 6e 20 74 68 65 20 27 6f 6c 64 27 20 74 72 65 65  n the 'old' tree
10910 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  , if it exists. 
10920 2a 2f 0a 20 20 69 66 28 20 65 54 72 65 65 21 3d  */.  if( eTree!=
10930 54 52 45 45 5f 4e 4f 4e 45 20 0a 20 20 20 26 26  TREE_NONE .   &&
10940 20 6c 73 6d 54 72 65 65 48 61 73 4f 6c 64 28 64   lsmTreeHasOld(d
10950 62 29 20 0a 20 20 20 26 26 20 64 62 2d 3e 74 72  b) .   && db->tr
10960 65 65 68 64 72 2e 69 4f 6c 64 4c 6f 67 21 3d 70  eehdr.iOldLog!=p
10970 53 6e 61 70 2d 3e 69 4c 6f 67 4f 66 66 20 0a 20  Snap->iLogOff . 
10980 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d   ){.    rc = lsm
10990 54 72 65 65 43 75 72 73 6f 72 4e 65 77 28 64 62  TreeCursorNew(db
109a0 2c 20 31 2c 20 26 70 43 73 72 2d 3e 61 70 54 72  , 1, &pCsr->apTr
109b0 65 65 43 73 72 5b 31 5d 29 3b 0a 20 20 7d 0a 0a  eeCsr[1]);.  }..
109c0 20 20 2f 2a 20 41 64 64 20 61 20 74 72 65 65 20    /* Add a tree 
109d0 63 75 72 73 6f 72 20 6f 6e 20 74 68 65 20 27 63  cursor on the 'c
109e0 75 72 72 65 6e 74 27 20 74 72 65 65 2c 20 69 66  urrent' tree, if
109f0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
10a00 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26  if( rc==LSM_OK &
10a10 26 20 65 54 72 65 65 3d 3d 54 52 45 45 5f 42 4f  & eTree==TREE_BO
10a20 54 48 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c  TH ){.    rc = l
10a30 73 6d 54 72 65 65 43 75 72 73 6f 72 4e 65 77 28  smTreeCursorNew(
10a40 64 62 2c 20 30 2c 20 26 70 43 73 72 2d 3e 61 70  db, 0, &pCsr->ap
10a50 54 72 65 65 43 73 72 5b 30 5d 29 3b 0a 20 20 7d  TreeCsr[0]);.  }
10a60 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
10a70 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  ..static int mul
10a80 74 69 43 75 72 73 6f 72 41 64 64 52 68 73 28 4d  tiCursorAddRhs(M
10a90 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72  ultiCursor *pCsr
10aa0 2c 20 4c 65 76 65 6c 20 2a 70 4c 76 6c 29 7b 0a  , Level *pLvl){.
10ab0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
10ac0 52 68 73 20 3d 20 70 4c 76 6c 2d 3e 6e 52 69 67  Rhs = pLvl->nRig
10ad0 68 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ht;..  assert( p
10ae0 4c 76 6c 2d 3e 6e 52 69 67 68 74 3e 30 20 29 3b  Lvl->nRight>0 );
10af0 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
10b00 3e 61 50 74 72 3d 3d 30 20 29 3b 0a 20 20 70 43  >aPtr==0 );.  pC
10b10 73 72 2d 3e 61 50 74 72 20 3d 20 6c 73 6d 4d 61  sr->aPtr = lsmMa
10b20 6c 6c 6f 63 5a 65 72 6f 28 70 43 73 72 2d 3e 70  llocZero(pCsr->p
10b30 44 62 2d 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66  Db->pEnv, sizeof
10b40 28 53 65 67 6d 65 6e 74 50 74 72 29 20 2a 20 6e  (SegmentPtr) * n
10b50 52 68 73 29 3b 0a 20 20 69 66 28 20 21 70 43 73  Rhs);.  if( !pCs
10b60 72 2d 3e 61 50 74 72 20 29 20 72 65 74 75 72 6e  r->aPtr ) return
10b70 20 4c 53 4d 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b   LSM_NOMEM_BKPT;
10b80 0a 20 20 70 43 73 72 2d 3e 6e 50 74 72 20 3d 20  .  pCsr->nPtr = 
10b90 6e 52 68 73 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  nRhs;..  for(i=0
10ba0 3b 20 69 3c 6e 52 68 73 3b 20 69 2b 2b 29 7b 0a  ; i<nRhs; i++){.
10bb0 20 20 20 20 70 43 73 72 2d 3e 61 50 74 72 5b 69      pCsr->aPtr[i
10bc0 5d 2e 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e  ].pSeg = &pLvl->
10bd0 61 52 68 73 5b 69 5d 3b 0a 20 20 20 20 70 43 73  aRhs[i];.    pCs
10be0 72 2d 3e 61 50 74 72 5b 69 5d 2e 70 4c 65 76 65  r->aPtr[i].pLeve
10bf0 6c 20 3d 20 70 4c 76 6c 3b 0a 20 20 7d 0a 0a 20  l = pLvl;.  }.. 
10c00 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a   return LSM_OK;.
10c10 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  }..static void m
10c20 75 6c 74 69 43 75 72 73 6f 72 41 64 64 4f 6e 65  ultiCursorAddOne
10c30 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43  (MultiCursor *pC
10c40 73 72 2c 20 4c 65 76 65 6c 20 2a 70 4c 76 6c 2c  sr, Level *pLvl,
10c50 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 66   int *pRc){.  if
10c60 28 20 2a 70 52 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  ( *pRc==LSM_OK )
10c70 7b 0a 20 20 20 20 69 6e 74 20 69 50 74 72 20 3d  {.    int iPtr =
10c80 20 70 43 73 72 2d 3e 6e 50 74 72 3b 0a 20 20 20   pCsr->nPtr;.   
10c90 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 43 73 72   int i;.    pCsr
10ca0 2d 3e 61 50 74 72 5b 69 50 74 72 5d 2e 70 4c 65  ->aPtr[iPtr].pLe
10cb0 76 65 6c 20 3d 20 70 4c 76 6c 3b 0a 20 20 20 20  vel = pLvl;.    
10cc0 70 43 73 72 2d 3e 61 50 74 72 5b 69 50 74 72 5d  pCsr->aPtr[iPtr]
10cd0 2e 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 6c  .pSeg = &pLvl->l
10ce0 68 73 3b 0a 20 20 20 20 69 50 74 72 2b 2b 3b 0a  hs;.    iPtr++;.
10cf0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
10d00 4c 76 6c 2d 3e 6e 52 69 67 68 74 3b 20 69 2b 2b  Lvl->nRight; i++
10d10 29 7b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 61  ){.      pCsr->a
10d20 50 74 72 5b 69 50 74 72 5d 2e 70 4c 65 76 65 6c  Ptr[iPtr].pLevel
10d30 20 3d 20 70 4c 76 6c 3b 0a 20 20 20 20 20 20 70   = pLvl;.      p
10d40 43 73 72 2d 3e 61 50 74 72 5b 69 50 74 72 5d 2e  Csr->aPtr[iPtr].
10d50 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 52  pSeg = &pLvl->aR
10d60 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 50 74  hs[i];.      iPt
10d70 72 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r++;.    }..    
10d80 69 66 28 20 70 4c 76 6c 2d 3e 6e 52 69 67 68 74  if( pLvl->nRight
10d90 20 26 26 20 70 4c 76 6c 2d 3e 70 53 70 6c 69 74   && pLvl->pSplit
10da0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
10db0 73 6f 72 74 65 64 53 70 6c 69 74 6b 65 79 28 70  sortedSplitkey(p
10dc0 43 73 72 2d 3e 70 44 62 2c 20 70 4c 76 6c 2c 20  Csr->pDb, pLvl, 
10dd0 70 52 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pRc);.    }.    
10de0 70 43 73 72 2d 3e 6e 50 74 72 20 3d 20 69 50 74  pCsr->nPtr = iPt
10df0 72 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  r;.  }.}..static
10e00 20 69 6e 74 20 6d 75 6c 74 69 43 75 72 73 6f 72   int multiCursor
10e10 41 64 64 41 6c 6c 28 4d 75 6c 74 69 43 75 72 73  AddAll(MultiCurs
10e20 6f 72 20 2a 70 43 73 72 2c 20 53 6e 61 70 73 68  or *pCsr, Snapsh
10e30 6f 74 20 2a 70 53 6e 61 70 29 7b 0a 20 20 4c 65  ot *pSnap){.  Le
10e40 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 69 6e 74  vel *pLvl;.  int
10e50 20 6e 50 74 72 20 3d 20 30 3b 0a 20 20 69 6e 74   nPtr = 0;.  int
10e60 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20   rc = LSM_OK;.. 
10e70 20 66 6f 72 28 70 4c 76 6c 3d 70 53 6e 61 70 2d   for(pLvl=pSnap-
10e80 3e 70 4c 65 76 65 6c 3b 20 70 4c 76 6c 3b 20 70  >pLevel; pLvl; p
10e90 4c 76 6c 3d 70 4c 76 6c 2d 3e 70 4e 65 78 74 29  Lvl=pLvl->pNext)
10ea0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
10eb0 4c 45 56 45 4c 5f 49 4e 43 4f 4d 50 4c 45 54 45  LEVEL_INCOMPLETE
10ec0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
10ed0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
10ee0 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a   is being.    **
10ef0 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63   called (indirec
10f00 74 6c 79 29 20 66 72 6f 6d 20 77 69 74 68 69 6e  tly) from within
10f10 20 61 20 73 6f 72 74 65 64 4e 65 77 54 6f 70 6c   a sortedNewTopl
10f20 65 76 65 6c 28 29 20 63 61 6c 6c 20 74 6f 0a 20  evel() call to. 
10f30 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20     ** construct 
10f40 70 4c 76 6c 2e 20 49 6e 20 74 68 69 73 20 63 61  pLvl. In this ca
10f50 73 65 20 69 67 6e 6f 72 65 20 70 4c 76 6c 20 2d  se ignore pLvl -
10f60 20 74 68 69 73 20 63 75 72 73 6f 72 20 69 73 20   this cursor is 
10f70 67 6f 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20  going to.    ** 
10f80 62 65 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  be used to retri
10f90 65 76 65 20 61 20 66 72 65 65 6c 69 73 74 20 65  eve a freelist e
10fa0 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 4c 53  ntry from the LS
10fb0 4d 2c 20 61 6e 64 20 74 68 65 20 70 61 72 74 69  M, and the parti
10fc0 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  ally.    ** comp
10fd0 6c 65 74 65 20 6c 65 76 65 6c 20 6d 61 79 20 63  lete level may c
10fe0 6f 6e 66 75 73 65 20 69 74 2e 20 20 2a 2f 0a 20  onfuse it.  */. 
10ff0 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 66 6c 61     if( pLvl->fla
11000 67 73 20 26 20 4c 45 56 45 4c 5f 49 4e 43 4f 4d  gs & LEVEL_INCOM
11010 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65  PLETE ) continue
11020 3b 0a 20 20 20 20 6e 50 74 72 20 2b 3d 20 28 31  ;.    nPtr += (1
11030 20 2b 20 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 29   + pLvl->nRight)
11040 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
11050 20 70 43 73 72 2d 3e 61 50 74 72 3d 3d 30 20 29   pCsr->aPtr==0 )
11060 3b 0a 20 20 70 43 73 72 2d 3e 61 50 74 72 20 3d  ;.  pCsr->aPtr =
11070 20 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63   lsmMallocZeroRc
11080 28 70 43 73 72 2d 3e 70 44 62 2d 3e 70 45 6e 76  (pCsr->pDb->pEnv
11090 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74  , sizeof(Segment
110a0 50 74 72 29 20 2a 20 6e 50 74 72 2c 20 26 72 63  Ptr) * nPtr, &rc
110b0 29 3b 0a 0a 20 20 66 6f 72 28 70 4c 76 6c 3d 70  );..  for(pLvl=p
110c0 53 6e 61 70 2d 3e 70 4c 65 76 65 6c 3b 20 70 4c  Snap->pLevel; pL
110d0 76 6c 3b 20 70 4c 76 6c 3d 70 4c 76 6c 2d 3e 70  vl; pLvl=pLvl->p
110e0 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
110f0 70 4c 76 6c 2d 3e 66 6c 61 67 73 20 26 20 4c 45  pLvl->flags & LE
11100 56 45 4c 5f 49 4e 43 4f 4d 50 4c 45 54 45 29 3d  VEL_INCOMPLETE)=
11110 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 75 6c 74  =0 ){.      mult
11120 69 43 75 72 73 6f 72 41 64 64 4f 6e 65 28 70 43  iCursorAddOne(pC
11130 73 72 2c 20 70 4c 76 6c 2c 20 26 72 63 29 3b 0a  sr, pLvl, &rc);.
11140 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
11150 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
11160 63 20 69 6e 74 20 6d 75 6c 74 69 43 75 72 73 6f  c int multiCurso
11170 72 49 6e 69 74 28 4d 75 6c 74 69 43 75 72 73 6f  rInit(MultiCurso
11180 72 20 2a 70 43 73 72 2c 20 53 6e 61 70 73 68 6f  r *pCsr, Snapsho
11190 74 20 2a 70 53 6e 61 70 29 7b 0a 20 20 69 6e 74  t *pSnap){.  int
111a0 20 72 63 3b 0a 20 20 72 63 20 3d 20 6d 75 6c 74   rc;.  rc = mult
111b0 69 43 75 72 73 6f 72 41 64 64 41 6c 6c 28 70 43  iCursorAddAll(pC
111c0 73 72 2c 20 70 53 6e 61 70 29 3b 0a 20 20 69 66  sr, pSnap);.  if
111d0 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
111e0 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75      rc = multiCu
111f0 72 73 6f 72 41 64 64 54 72 65 65 28 70 43 73 72  rsorAddTree(pCsr
11200 2c 20 70 53 6e 61 70 2c 20 54 52 45 45 5f 42 4f  , pSnap, TREE_BO
11210 54 48 29 3b 0a 20 20 7d 0a 20 20 70 43 73 72 2d  TH);.  }.  pCsr-
11220 3e 66 6c 61 67 73 20 7c 3d 20 28 43 55 52 53 4f  >flags |= (CURSO
11230 52 5f 49 47 4e 4f 52 45 5f 53 59 53 54 45 4d 20  R_IGNORE_SYSTEM 
11240 7c 20 43 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f  | CURSOR_IGNORE_
11250 44 45 4c 45 54 45 29 3b 0a 20 20 72 65 74 75 72  DELETE);.  retur
11260 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
11270 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 6d 75 6c  MultiCursor *mul
11280 74 69 43 75 72 73 6f 72 4e 65 77 28 6c 73 6d 5f  tiCursorNew(lsm_
11290 64 62 20 2a 64 62 2c 20 69 6e 74 20 2a 70 52 63  db *db, int *pRc
112a0 29 7b 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72  ){.  MultiCursor
112b0 20 2a 70 43 73 72 3b 0a 20 20 70 43 73 72 20 3d   *pCsr;.  pCsr =
112c0 20 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 29   (MultiCursor *)
112d0 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63 28  lsmMallocZeroRc(
112e0 64 62 2d 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66  db->pEnv, sizeof
112f0 28 4d 75 6c 74 69 43 75 72 73 6f 72 29 2c 20 70  (MultiCursor), p
11300 52 63 29 3b 0a 20 20 69 66 28 20 70 43 73 72 20  Rc);.  if( pCsr 
11310 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 70 4e 65  ){.    pCsr->pNe
11320 78 74 20 3d 20 64 62 2d 3e 70 43 73 72 3b 0a 20  xt = db->pCsr;. 
11330 20 20 20 64 62 2d 3e 70 43 73 72 20 3d 20 70 43     db->pCsr = pC
11340 73 72 3b 0a 20 20 20 20 70 43 73 72 2d 3e 70 44  sr;.    pCsr->pD
11350 62 20 3d 20 64 62 3b 0a 20 20 7d 0a 20 20 72 65  b = db;.  }.  re
11360 74 75 72 6e 20 70 43 73 72 3b 0a 7d 0a 0a 0a 76  turn pCsr;.}...v
11370 6f 69 64 20 6c 73 6d 53 6f 72 74 65 64 52 65 6d  oid lsmSortedRem
11380 61 70 28 6c 73 6d 5f 64 62 20 2a 70 44 62 29 7b  ap(lsm_db *pDb){
11390 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  .  MultiCursor *
113a0 70 43 73 72 3b 0a 20 20 66 6f 72 28 70 43 73 72  pCsr;.  for(pCsr
113b0 3d 70 44 62 2d 3e 70 43 73 72 3b 20 70 43 73 72  =pDb->pCsr; pCsr
113c0 3b 20 70 43 73 72 3d 70 43 73 72 2d 3e 70 4e 65  ; pCsr=pCsr->pNe
113d0 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 74  xt){.    int iPt
113e0 72 3b 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d  r;.    if( pCsr-
113f0 3e 70 42 74 43 73 72 20 29 7b 0a 20 20 20 20 20  >pBtCsr ){.     
11400 20 62 74 72 65 65 43 75 72 73 6f 72 4c 6f 61 64   btreeCursorLoad
11410 4b 65 79 28 70 43 73 72 2d 3e 70 42 74 43 73 72  Key(pCsr->pBtCsr
11420 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
11430 28 69 50 74 72 3d 30 3b 20 69 50 74 72 3c 70 43  (iPtr=0; iPtr<pC
11440 73 72 2d 3e 6e 50 74 72 3b 20 69 50 74 72 2b 2b  sr->nPtr; iPtr++
11450 29 7b 0a 20 20 20 20 20 20 73 65 67 6d 65 6e 74  ){.      segment
11460 50 74 72 4c 6f 61 64 43 65 6c 6c 28 26 70 43 73  PtrLoadCell(&pCs
11470 72 2d 3e 61 50 74 72 5b 69 50 74 72 5d 2c 20 70  r->aPtr[iPtr], p
11480 43 73 72 2d 3e 61 50 74 72 5b 69 50 74 72 5d 2e  Csr->aPtr[iPtr].
11490 69 43 65 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  iCell);.    }.  
114a0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
114b0 20 6d 75 6c 74 69 43 75 72 73 6f 72 52 65 61 64   multiCursorRead
114c0 53 65 70 61 72 61 74 6f 72 73 28 4d 75 6c 74 69  Separators(Multi
114d0 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
114e0 20 69 66 28 20 70 43 73 72 2d 3e 6e 50 74 72 3e   if( pCsr->nPtr>
114f0 30 20 29 7b 0a 20 20 20 20 70 43 73 72 2d 3e 66  0 ){.    pCsr->f
11500 6c 61 67 73 20 7c 3d 20 43 55 52 53 4f 52 5f 52  lags |= CURSOR_R
11510 45 41 44 5f 53 45 50 41 52 41 54 4f 52 53 3b 0a  EAD_SEPARATORS;.
11520 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 61 76    }.}../*.** Hav
11530 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 73 6b  e this cursor sk
11540 69 70 20 6f 76 65 72 20 53 4f 52 54 45 44 5f 44  ip over SORTED_D
11550 45 4c 45 54 45 20 65 6e 74 72 69 65 73 2e 0a 2a  ELETE entries..*
11560 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 75  /.static void mu
11570 6c 74 69 43 75 72 73 6f 72 49 67 6e 6f 72 65 44  ltiCursorIgnoreD
11580 65 6c 65 74 65 28 4d 75 6c 74 69 43 75 72 73 6f  elete(MultiCurso
11590 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 66 28 20  r *pCsr){.  if( 
115a0 70 43 73 72 20 29 20 70 43 73 72 2d 3e 66 6c 61  pCsr ) pCsr->fla
115b0 67 73 20 7c 3d 20 43 55 52 53 4f 52 5f 49 47 4e  gs |= CURSOR_IGN
115c0 4f 52 45 5f 44 45 4c 45 54 45 3b 0a 7d 0a 0a 2f  ORE_DELETE;.}../
115d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 72 65 65  *.** If the free
115e0 2d 62 6c 6f 63 6b 20 6c 69 73 74 20 69 73 20 6e  -block list is n
115f0 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 68  ot empty, then h
11600 61 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ave this cursor 
11610 76 69 73 69 74 20 61 20 6b 65 79 0a 2a 2a 20 77  visit a key.** w
11620 69 74 68 20 28 61 29 20 74 68 65 20 73 79 73 74  ith (a) the syst
11630 65 6d 20 62 69 74 20 73 65 74 2c 20 61 6e 64 20  em bit set, and 
11640 28 62 29 20 74 68 65 20 6b 65 79 20 22 46 52 45  (b) the key "FRE
11650 45 4c 49 53 54 22 20 61 6e 64 20 28 63 29 20 61  ELIST" and (c) a
11660 20 76 61 6c 75 65 20 0a 2a 2a 20 62 6c 6f 62 20   value .** blob 
11670 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
11680 65 72 69 61 6c 69 7a 65 64 20 66 72 65 65 2d 62  erialized free-b
11690 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  lock list..*/.st
116a0 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 43 75  atic int multiCu
116b0 72 73 6f 72 56 69 73 69 74 46 72 65 65 6c 69 73  rsorVisitFreelis
116c0 74 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a 70  t(MultiCursor *p
116d0 43 73 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Csr){.  int rc =
116e0 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 70 43 73 72 2d   LSM_OK;.  pCsr-
116f0 3e 66 6c 61 67 73 20 7c 3d 20 43 55 52 53 4f 52  >flags |= CURSOR
11700 5f 46 4c 55 53 48 5f 46 52 45 45 4c 49 53 54 3b  _FLUSH_FREELIST;
11710 0a 20 20 70 43 73 72 2d 3e 70 53 79 73 74 65 6d  .  pCsr->pSystem
11720 56 61 6c 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 52  Val = lsmMallocR
11730 63 28 70 43 73 72 2d 3e 70 44 62 2d 3e 70 45 6e  c(pCsr->pDb->pEn
11740 76 2c 20 34 20 2b 20 38 2c 20 26 72 63 29 3b 0a  v, 4 + 8, &rc);.
11750 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11760 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
11770 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20  nd return a new 
11780 64 61 74 61 62 61 73 65 20 63 75 72 73 6f 72 2e  database cursor.
11790 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 74 68  .**.** This meth
117a0 6f 64 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  od should only b
117b0 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 6c 6c 6f  e called to allo
117c0 63 61 74 65 20 75 73 65 72 20 63 75 72 73 6f 72  cate user cursor
117d0 73 2e 20 41 73 20 69 74 20 6d 61 79 0a 2a 2a 20  s. As it may.** 
117e0 72 65 63 79 63 6c 65 20 61 20 63 75 72 73 6f 72  recycle a cursor
117f0 20 66 72 6f 6d 20 6c 73 6d 5f 64 62 2e 70 43 73   from lsm_db.pCs
11800 72 43 61 63 68 65 2e 0a 2a 2f 0a 69 6e 74 20 6c  rCache..*/.int l
11810 73 6d 4d 43 75 72 73 6f 72 4e 65 77 28 0a 20 20  smMCursorNew(.  
11820 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 20 20 20  lsm_db *pDb,    
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11840 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
11850 6c 65 20 2a 2f 0a 20 20 4d 75 6c 74 69 43 75 72  le */.  MultiCur
11860 73 6f 72 20 2a 2a 70 70 43 73 72 20 20 20 20 20  sor **ppCsr     
11870 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
11880 41 6c 6c 6f 63 61 74 65 64 20 63 75 72 73 6f 72  Allocated cursor
11890 20 2a 2f 0a 29 7b 0a 20 20 4d 75 6c 74 69 43 75   */.){.  MultiCu
118a0 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 30 3b 0a  rsor *pCsr = 0;.
118b0 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f    int rc = LSM_O
118c0 4b 3b 0a 0a 20 20 69 66 28 20 70 44 62 2d 3e 70  K;..  if( pDb->p
118d0 43 73 72 43 61 63 68 65 20 29 7b 0a 20 20 20 20  CsrCache ){.    
118e0 69 6e 74 20 62 4f 6c 64 3b 20 20 20 20 20 20 20  int bOld;       
118f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11900 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69   True if there i
11910 73 20 61 6e 20 6f 6c 64 20 69 6e 2d 6d 65 6d 6f  s an old in-memo
11920 72 79 20 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20  ry tree */..    
11930 2f 2a 20 52 65 6d 6f 76 65 20 61 20 63 75 72 73  /* Remove a curs
11940 6f 72 20 66 72 6f 6d 20 74 68 65 20 70 43 73 72  or from the pCsr
11950 43 61 63 68 65 20 6c 69 73 74 20 61 6e 64 20 61  Cache list and a
11960 64 64 20 69 74 20 74 6f 20 74 68 65 20 6f 70 65  dd it to the ope
11970 6e 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 70  n list. */.    p
11980 43 73 72 20 3d 20 70 44 62 2d 3e 70 43 73 72 43  Csr = pDb->pCsrC
11990 61 63 68 65 3b 0a 20 20 20 20 70 44 62 2d 3e 70  ache;.    pDb->p
119a0 43 73 72 43 61 63 68 65 20 3d 20 70 43 73 72 2d  CsrCache = pCsr-
119b0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 70 43 73 72  >pNext;.    pCsr
119c0 2d 3e 70 4e 65 78 74 20 3d 20 70 44 62 2d 3e 70  ->pNext = pDb->p
119d0 43 73 72 3b 0a 20 20 20 20 70 44 62 2d 3e 70 43  Csr;.    pDb->pC
119e0 73 72 20 3d 20 70 43 73 72 3b 0a 0a 20 20 20 20  sr = pCsr;..    
119f0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 63 61  /* The cursor ca
11a00 6e 20 61 6c 6d 6f 73 74 20 62 65 20 75 73 65 64  n almost be used
11a10 20 61 73 20 69 73 2c 20 65 78 63 65 70 74 20 74   as is, except t
11a20 68 61 74 20 74 68 65 20 6f 6c 64 20 69 6e 2d 6d  hat the old in-m
11a30 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 74 72 65  emory.    ** tre
11a40 65 20 63 75 72 73 6f 72 20 6d 61 79 20 62 65 20  e cursor may be 
11a50 70 72 65 73 65 6e 74 20 61 6e 64 20 6e 6f 74 20  present and not 
11a60 72 65 71 75 69 72 65 64 2c 20 6f 72 20 72 65 71  required, or req
11a70 75 69 72 65 64 20 61 6e 64 20 6e 6f 74 0a 20 20  uired and not.  
11a80 20 20 2a 2a 20 70 72 65 73 65 6e 74 2e 20 46 69    ** present. Fi
11a90 78 20 74 68 69 73 20 69 66 20 72 65 71 75 69 72  x this if requir
11aa0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 62 4f 6c 64  ed.  */.    bOld
11ab0 20 3d 20 28 6c 73 6d 54 72 65 65 48 61 73 4f 6c   = (lsmTreeHasOl
11ac0 64 28 70 44 62 29 20 26 26 20 70 44 62 2d 3e 74  d(pDb) && pDb->t
11ad0 72 65 65 68 64 72 2e 69 4f 6c 64 4c 6f 67 21 3d  reehdr.iOldLog!=
11ae0 70 44 62 2d 3e 70 43 6c 69 65 6e 74 2d 3e 69 4c  pDb->pClient->iL
11af0 6f 67 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20  ogOff);.    if( 
11b00 21 62 4f 6c 64 20 26 26 20 70 43 73 72 2d 3e 61  !bOld && pCsr->a
11b10 70 54 72 65 65 43 73 72 5b 31 5d 20 29 7b 0a 20  pTreeCsr[1] ){. 
11b20 20 20 20 20 20 6c 73 6d 54 72 65 65 43 75 72 73       lsmTreeCurs
11b30 6f 72 44 65 73 74 72 6f 79 28 70 43 73 72 2d 3e  orDestroy(pCsr->
11b40 61 70 54 72 65 65 43 73 72 5b 31 5d 29 3b 0a 20  apTreeCsr[1]);. 
11b50 20 20 20 20 20 70 43 73 72 2d 3e 61 70 54 72 65       pCsr->apTre
11b60 65 43 73 72 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  eCsr[1] = 0;.   
11b70 20 7d 65 6c 73 65 20 69 66 28 20 62 4f 6c 64 20   }else if( bOld 
11b80 26 26 20 21 70 43 73 72 2d 3e 61 70 54 72 65 65  && !pCsr->apTree
11b90 43 73 72 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Csr[1] ){.      
11ba0 72 63 20 3d 20 6c 73 6d 54 72 65 65 43 75 72 73  rc = lsmTreeCurs
11bb0 6f 72 4e 65 77 28 70 44 62 2c 20 31 2c 20 26 70  orNew(pDb, 1, &p
11bc0 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72 5b 31  Csr->apTreeCsr[1
11bd0 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ]);.    }..    p
11be0 43 73 72 2d 3e 66 6c 61 67 73 20 3d 20 28 43 55  Csr->flags = (CU
11bf0 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 53 59 53 54  RSOR_IGNORE_SYST
11c00 45 4d 20 7c 20 43 55 52 53 4f 52 5f 49 47 4e 4f  EM | CURSOR_IGNO
11c10 52 45 5f 44 45 4c 45 54 45 29 3b 0a 0a 20 20 7d  RE_DELETE);..  }
11c20 65 6c 73 65 7b 0a 20 20 20 20 70 43 73 72 20 3d  else{.    pCsr =
11c30 20 6d 75 6c 74 69 43 75 72 73 6f 72 4e 65 77 28   multiCursorNew(
11c40 70 44 62 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  pDb, &rc);.    i
11c50 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 20  f( rc==LSM_OK ) 
11c60 72 63 20 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72  rc = multiCursor
11c70 49 6e 69 74 28 70 43 73 72 2c 20 70 44 62 2d 3e  Init(pCsr, pDb->
11c80 70 43 6c 69 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20  pClient);.  }.. 
11c90 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20   if( rc!=LSM_OK 
11ca0 29 7b 0a 20 20 20 20 6c 73 6d 4d 43 75 72 73 6f  ){.    lsmMCurso
11cb0 72 43 6c 6f 73 65 28 70 43 73 72 2c 20 30 29 3b  rClose(pCsr, 0);
11cc0 0a 20 20 20 20 70 43 73 72 20 3d 20 30 3b 0a 20  .    pCsr = 0;. 
11cd0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 72 63   }.  assert( (rc
11ce0 3d 3d 4c 53 4d 5f 4f 4b 29 3d 3d 28 70 43 73 72  ==LSM_OK)==(pCsr
11cf0 21 3d 30 29 20 29 3b 0a 20 20 2a 70 70 43 73 72  !=0) );.  *ppCsr
11d00 20 3d 20 70 43 73 72 3b 0a 20 20 72 65 74 75 72   = pCsr;.  retur
11d10 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
11d20 69 6e 74 20 6d 75 6c 74 69 43 75 72 73 6f 72 47  int multiCursorG
11d30 65 74 56 61 6c 28 0a 20 20 4d 75 6c 74 69 43 75  etVal(.  MultiCu
11d40 72 73 6f 72 20 2a 70 43 73 72 2c 20 0a 20 20 69  rsor *pCsr, .  i
11d50 6e 74 20 69 56 61 6c 2c 20 0a 20 20 76 6f 69 64  nt iVal, .  void
11d60 20 2a 2a 70 70 56 61 6c 2c 20 0a 20 20 69 6e 74   **ppVal, .  int
11d70 20 2a 70 6e 56 61 6c 0a 29 7b 0a 20 20 69 6e 74   *pnVal.){.  int
11d80 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20   rc = LSM_OK;.. 
11d90 20 2a 70 70 56 61 6c 20 3d 20 30 3b 0a 20 20 2a   *ppVal = 0;.  *
11da0 70 6e 56 61 6c 20 3d 20 30 3b 0a 0a 20 20 73 77  pnVal = 0;..  sw
11db0 69 74 63 68 28 20 69 56 61 6c 20 29 7b 0a 20 20  itch( iVal ){.  
11dc0 20 20 63 61 73 65 20 43 55 52 53 4f 52 5f 44 41    case CURSOR_DA
11dd0 54 41 5f 54 52 45 45 30 3a 0a 20 20 20 20 63 61  TA_TREE0:.    ca
11de0 73 65 20 43 55 52 53 4f 52 5f 44 41 54 41 5f 54  se CURSOR_DATA_T
11df0 52 45 45 31 3a 20 7b 0a 20 20 20 20 20 20 54 72  REE1: {.      Tr
11e00 65 65 43 75 72 73 6f 72 20 2a 70 54 72 65 65 43  eeCursor *pTreeC
11e10 73 72 20 3d 20 70 43 73 72 2d 3e 61 70 54 72 65  sr = pCsr->apTre
11e20 65 43 73 72 5b 69 56 61 6c 2d 43 55 52 53 4f 52  eCsr[iVal-CURSOR
11e30 5f 44 41 54 41 5f 54 52 45 45 30 5d 3b 0a 20 20  _DATA_TREE0];.  
11e40 20 20 20 20 69 66 28 20 6c 73 6d 54 72 65 65 43      if( lsmTreeC
11e50 75 72 73 6f 72 56 61 6c 69 64 28 70 54 72 65 65  ursorValid(pTree
11e60 43 73 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Csr) ){.        
11e70 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 56 61 6c  lsmTreeCursorVal
11e80 75 65 28 70 54 72 65 65 43 73 72 2c 20 70 70 56  ue(pTreeCsr, ppV
11e90 61 6c 2c 20 70 6e 56 61 6c 29 3b 0a 20 20 20 20  al, pnVal);.    
11ea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11eb0 20 2a 70 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20   *ppVal = 0;.   
11ec0 20 20 20 20 20 2a 70 6e 56 61 6c 20 3d 20 30 3b       *pnVal = 0;
11ed0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11ee0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
11ef0 20 63 61 73 65 20 43 55 52 53 4f 52 5f 44 41 54   case CURSOR_DAT
11f00 41 5f 53 59 53 54 45 4d 3a 20 7b 0a 20 20 20 20  A_SYSTEM: {.    
11f10 20 20 53 6e 61 70 73 68 6f 74 20 2a 70 57 6f 72    Snapshot *pWor
11f20 6b 65 72 20 3d 20 70 43 73 72 2d 3e 70 44 62 2d  ker = pCsr->pDb-
11f30 3e 70 57 6f 72 6b 65 72 3b 0a 20 20 20 20 20 20  >pWorker;.      
11f40 69 66 28 20 70 57 6f 72 6b 65 72 20 0a 20 20 20  if( pWorker .   
11f50 20 20 20 20 26 26 20 28 70 43 73 72 2d 3e 69 46      && (pCsr->iF
11f60 72 65 65 20 25 20 32 29 3d 3d 30 0a 20 20 20 20  ree % 2)==0.    
11f70 20 20 20 26 26 20 70 43 73 72 2d 3e 69 46 72 65     && pCsr->iFre
11f80 65 20 3c 20 28 70 57 6f 72 6b 65 72 2d 3e 66 72  e < (pWorker->fr
11f90 65 65 6c 69 73 74 2e 6e 45 6e 74 72 79 2a 32 29  eelist.nEntry*2)
11fa0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
11fb0 20 20 69 6e 74 20 69 45 6e 74 72 79 20 3d 20 70    int iEntry = p
11fc0 57 6f 72 6b 65 72 2d 3e 66 72 65 65 6c 69 73 74  Worker->freelist
11fd0 2e 6e 45 6e 74 72 79 20 2d 20 31 20 2d 20 28 70  .nEntry - 1 - (p
11fe0 43 73 72 2d 3e 69 46 72 65 65 20 2f 20 32 29 3b  Csr->iFree / 2);
11ff0 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 56 61  .        u8 *aVa
12000 6c 20 3d 20 26 28 28 75 38 20 2a 29 28 70 43 73  l = &((u8 *)(pCs
12010 72 2d 3e 70 53 79 73 74 65 6d 56 61 6c 29 29 5b  r->pSystemVal))[
12020 34 5d 3b 0a 20 20 20 20 20 20 20 20 6c 73 6d 50  4];.        lsmP
12030 75 74 55 36 34 28 61 56 61 6c 2c 20 70 57 6f 72  utU64(aVal, pWor
12040 6b 65 72 2d 3e 66 72 65 65 6c 69 73 74 2e 61 45  ker->freelist.aE
12050 6e 74 72 79 5b 69 45 6e 74 72 79 5d 2e 69 49 64  ntry[iEntry].iId
12060 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 56 61  );.        *ppVa
12070 6c 20 3d 20 61 56 61 6c 3b 0a 20 20 20 20 20 20  l = aVal;.      
12080 20 20 2a 70 6e 56 61 6c 20 3d 20 38 3b 0a 20 20    *pnVal = 8;.  
12090 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
120a0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65  k;.    }..    de
120b0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
120c0 6e 74 20 69 50 74 72 20 3d 20 69 56 61 6c 2d 43  nt iPtr = iVal-C
120d0 55 52 53 4f 52 5f 44 41 54 41 5f 53 45 47 4d 45  URSOR_DATA_SEGME
120e0 4e 54 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  NT;.      if( iP
120f0 74 72 3c 70 43 73 72 2d 3e 6e 50 74 72 20 29 7b  tr<pCsr->nPtr ){
12100 0a 20 20 20 20 20 20 20 20 53 65 67 6d 65 6e 74  .        Segment
12110 50 74 72 20 2a 70 50 74 72 20 3d 20 26 70 43 73  Ptr *pPtr = &pCs
12120 72 2d 3e 61 50 74 72 5b 69 50 74 72 5d 3b 0a 20  r->aPtr[iPtr];. 
12130 20 20 20 20 20 20 20 69 66 28 20 70 50 74 72 2d         if( pPtr-
12140 3e 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20  >pPg ){.        
12150 20 20 2a 70 70 56 61 6c 20 3d 20 70 50 74 72 2d    *ppVal = pPtr-
12160 3e 70 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 20  >pVal;.         
12170 20 2a 70 6e 56 61 6c 20 3d 20 70 50 74 72 2d 3e   *pnVal = pPtr->
12180 6e 56 61 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nVal;.        }.
12190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
121a0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  }..  assert( rc=
121b0 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 28 2a 70 70 56  =LSM_OK || (*ppV
121c0 61 6c 3d 3d 30 20 26 26 20 2a 70 6e 56 61 6c 3d  al==0 && *pnVal=
121d0 3d 30 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  =0) );.  return 
121e0 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
121f0 74 20 6d 75 6c 74 69 43 75 72 73 6f 72 41 64 76  t multiCursorAdv
12200 61 6e 63 65 28 4d 75 6c 74 69 43 75 72 73 6f 72  ance(MultiCursor
12210 20 2a 70 43 73 72 2c 20 69 6e 74 20 62 52 65 76   *pCsr, int bRev
12220 65 72 73 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  erse);../*.** Th
12230 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
12240 61 6c 6c 65 64 20 62 79 20 77 6f 72 6b 65 72 20  alled by worker 
12250 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 77  connections to w
12260 61 6c 6b 20 74 68 65 20 70 61 72 74 20 6f 66 20  alk the part of 
12270 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
12280 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74   stored within t
12290 68 65 20 4c 53 4d 20 64 61 74 61 20 73 74 72 75  he LSM data stru
122a0 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 6c 73  cture..*/.int ls
122b0 6d 53 6f 72 74 65 64 57 61 6c 6b 46 72 65 65 6c  mSortedWalkFreel
122c0 69 73 74 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70  ist(.  lsm_db *p
122d0 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
122e0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
122f0 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  se handle */.  i
12300 6e 74 20 62 52 65 76 65 72 73 65 2c 20 20 20 20  nt bReverse,    
12310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12320 2a 20 54 72 75 65 20 74 6f 20 69 74 65 72 61 74  * True to iterat
12330 65 20 66 72 6f 6d 20 6c 61 72 67 65 73 74 20 74  e from largest t
12340 6f 20 73 6d 61 6c 6c 65 73 74 20 2a 2f 0a 20 20  o smallest */.  
12350 69 6e 74 20 28 2a 78 29 28 76 6f 69 64 20 2a 2c  int (*x)(void *,
12360 20 69 6e 74 2c 20 69 36 34 29 2c 20 20 20 20 20   int, i64),     
12370 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
12380 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
12390 70 43 74 78 20 20 20 20 20 20 20 20 20 20 20 20  pCtx            
123a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
123b0 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70  st argument to p
123c0 61 73 73 20 74 6f 20 63 61 6c 6c 62 61 63 6b 20  ass to callback 
123d0 2a 2f 0a 29 7b 0a 20 20 4d 75 6c 74 69 43 75 72  */.){.  MultiCur
123e0 73 6f 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20  sor *pCsr;      
123f0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
12400 72 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64  r used to read d
12410 62 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  b */.  int rc = 
12420 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  LSM_OK;         
12430 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
12440 20 43 6f 64 65 20 2a 2f 0a 20 20 53 6e 61 70 73   Code */.  Snaps
12450 68 6f 74 20 2a 70 53 6e 61 70 20 3d 20 30 3b 0a  hot *pSnap = 0;.
12460 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
12470 70 57 6f 72 6b 65 72 20 29 3b 0a 20 20 69 66 28  pWorker );.  if(
12480 20 70 44 62 2d 3e 62 49 6e 63 72 4d 65 72 67 65   pDb->bIncrMerge
12490 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d   ){.    rc = lsm
124a0 43 68 65 63 6b 70 6f 69 6e 74 44 65 73 65 72 69  CheckpointDeseri
124b0 61 6c 69 7a 65 28 70 44 62 2c 20 30 2c 20 70 44  alize(pDb, 0, pD
124c0 62 2d 3e 70 53 68 6d 68 64 72 2d 3e 61 53 6e 61  b->pShmhdr->aSna
124d0 70 31 2c 20 26 70 53 6e 61 70 29 3b 0a 20 20 20  p1, &pSnap);.   
124e0 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20   if( rc!=LSM_OK 
124f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
12500 65 6c 73 65 7b 0a 20 20 20 20 70 53 6e 61 70 20  else{.    pSnap 
12510 3d 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 3b 0a  = pDb->pWorker;.
12520 20 20 7d 0a 0a 20 20 70 43 73 72 20 3d 20 6d 75    }..  pCsr = mu
12530 6c 74 69 43 75 72 73 6f 72 4e 65 77 28 70 44 62  ltiCursorNew(pDb
12540 2c 20 26 72 63 29 3b 0a 20 20 69 66 28 20 70 43  , &rc);.  if( pC
12550 73 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  sr ){.    rc = m
12560 75 6c 74 69 43 75 72 73 6f 72 41 64 64 41 6c 6c  ultiCursorAddAll
12570 28 70 43 73 72 2c 20 70 53 6e 61 70 29 3b 0a 20  (pCsr, pSnap);. 
12580 20 20 20 70 43 73 72 2d 3e 66 6c 61 67 73 20 7c     pCsr->flags |
12590 3d 20 43 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f  = CURSOR_IGNORE_
125a0 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 20 20 0a 20  DELETE;.  }.  . 
125b0 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
125c0 29 7b 0a 20 20 20 20 69 66 28 20 62 52 65 76 65  ){.    if( bReve
125d0 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rse==0 ){.      
125e0 72 63 20 3d 20 6c 73 6d 4d 43 75 72 73 6f 72 4c  rc = lsmMCursorL
125f0 61 73 74 28 70 43 73 72 29 3b 0a 20 20 20 20 7d  ast(pCsr);.    }
12600 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
12610 20 6c 73 6d 4d 43 75 72 73 6f 72 53 65 65 6b 28   lsmMCursorSeek(
12620 70 43 73 72 2c 20 31 2c 20 22 22 2c 20 30 2c 20  pCsr, 1, "", 0, 
12630 4c 53 4d 5f 53 45 45 4b 5f 47 45 29 3b 0a 20 20  LSM_SEEK_GE);.  
12640 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20    }..    while( 
12650 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 6c 73  rc==LSM_OK && ls
12660 6d 4d 43 75 72 73 6f 72 56 61 6c 69 64 28 70 43  mMCursorValid(pC
12670 73 72 29 20 26 26 20 72 74 49 73 53 79 73 74 65  sr) && rtIsSyste
12680 6d 28 70 43 73 72 2d 3e 65 54 79 70 65 29 20 29  m(pCsr->eType) )
12690 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4b  {.      void *pK
126a0 65 79 3b 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20  ey; int nKey;.  
126b0 20 20 20 20 76 6f 69 64 20 2a 70 56 61 6c 20 3d      void *pVal =
126c0 20 30 3b 20 69 6e 74 20 6e 56 61 6c 20 3d 20 30   0; int nVal = 0
126d0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 73  ;..      rc = ls
126e0 6d 4d 43 75 72 73 6f 72 4b 65 79 28 70 43 73 72  mMCursorKey(pCsr
126f0 2c 20 26 70 4b 65 79 2c 20 26 6e 4b 65 79 29 3b  , &pKey, &nKey);
12700 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c  .      if( rc==L
12710 53 4d 5f 4f 4b 20 29 20 72 63 20 3d 20 6c 73 6d  SM_OK ) rc = lsm
12720 4d 43 75 72 73 6f 72 56 61 6c 75 65 28 70 43 73  MCursorValue(pCs
12730 72 2c 20 26 70 56 61 6c 2c 20 26 6e 56 61 6c 29  r, &pVal, &nVal)
12740 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
12750 4c 53 4d 5f 4f 4b 20 26 26 20 28 6e 4b 65 79 21  LSM_OK && (nKey!
12760 3d 34 20 7c 7c 20 6e 56 61 6c 21 3d 38 29 20 29  =4 || nVal!=8) )
12770 20 72 63 20 3d 20 4c 53 4d 5f 43 4f 52 52 55 50   rc = LSM_CORRUP
12780 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 20 20 69  T_BKPT;..      i
12790 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc==LSM_OK ){
127a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 42 6c  .        int iBl
127b0 6b 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  k;.        i64 i
127c0 53 6e 61 70 3b 0a 20 20 20 20 20 20 20 20 69 42  Snap;.        iB
127d0 6c 6b 20 3d 20 28 69 6e 74 29 28 7e 28 6c 73 6d  lk = (int)(~(lsm
127e0 47 65 74 55 33 32 28 28 75 38 20 2a 29 70 4b 65  GetU32((u8 *)pKe
127f0 79 29 29 29 3b 0a 20 20 20 20 20 20 20 20 69 53  y)));.        iS
12800 6e 61 70 20 3d 20 28 69 36 34 29 6c 73 6d 47 65  nap = (i64)lsmGe
12810 74 55 36 34 28 28 75 38 20 2a 29 70 56 61 6c 29  tU64((u8 *)pVal)
12820 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 28  ;.        if( x(
12830 70 43 74 78 2c 20 69 42 6c 6b 2c 20 69 53 6e 61  pCtx, iBlk, iSna
12840 70 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  p) ) break;.    
12850 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75      rc = multiCu
12860 72 73 6f 72 41 64 76 61 6e 63 65 28 70 43 73 72  rsorAdvance(pCsr
12870 2c 20 21 62 52 65 76 65 72 73 65 29 3b 0a 20 20  , !bReverse);.  
12880 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12890 0a 20 20 6c 73 6d 4d 43 75 72 73 6f 72 43 6c 6f  .  lsmMCursorClo
128a0 73 65 28 70 43 73 72 2c 20 30 29 3b 0a 20 20 69  se(pCsr, 0);.  i
128b0 66 28 20 70 53 6e 61 70 21 3d 70 44 62 2d 3e 70  f( pSnap!=pDb->p
128c0 57 6f 72 6b 65 72 20 29 7b 0a 20 20 20 20 6c 73  Worker ){.    ls
128d0 6d 46 72 65 65 53 6e 61 70 73 68 6f 74 28 70 44  mFreeSnapshot(pD
128e0 62 2d 3e 70 45 6e 76 2c 20 70 53 6e 61 70 29 3b  b->pEnv, pSnap);
128f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
12900 63 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 53 6f 72  c;.}..int lsmSor
12910 74 65 64 4c 6f 61 64 46 72 65 65 6c 69 73 74 28  tedLoadFreelist(
12920 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20  .  lsm_db *pDb, 
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12940 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
12950 61 6e 64 6c 65 20 28 6d 75 73 74 20 62 65 20 77  andle (must be w
12960 6f 72 6b 65 72 29 20 2a 2f 0a 20 20 76 6f 69 64  orker) */.  void
12970 20 2a 2a 70 70 56 61 6c 2c 20 20 20 20 20 20 20   **ppVal,       
12980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12990 55 54 3a 20 42 6c 6f 62 20 63 6f 6e 74 61 69 6e  UT: Blob contain
129a0 69 6e 67 20 4c 53 4d 20 66 72 65 65 2d 6c 69 73  ing LSM free-lis
129b0 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 56 61  t */.  int *pnVa
129c0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
129d0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
129e0 69 7a 65 20 6f 66 20 2a 70 70 56 61 6c 20 62 6c  ize of *ppVal bl
129f0 6f 62 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  ob in bytes */.)
12a00 7b 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20  {.  MultiCursor 
12a10 2a 70 43 73 72 3b 20 20 20 20 20 20 20 20 20 20  *pCsr;          
12a20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 75 73      /* Cursor us
12a30 65 64 20 74 6f 20 72 65 74 72 65 69 76 65 20 66  ed to retreive f
12a40 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
12a50 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20  t rc = LSM_OK;  
12a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12a70 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
12a80 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e  .  assert( pDb->
12a90 70 57 6f 72 6b 65 72 20 29 3b 0a 20 20 61 73 73  pWorker );.  ass
12aa0 65 72 74 28 20 2a 70 70 56 61 6c 3d 3d 30 20 26  ert( *ppVal==0 &
12ab0 26 20 2a 70 6e 56 61 6c 3d 3d 30 20 29 3b 0a 0a  & *pnVal==0 );..
12ac0 20 20 70 43 73 72 20 3d 20 6d 75 6c 74 69 43 75    pCsr = multiCu
12ad0 72 73 6f 72 4e 65 77 28 70 44 62 2c 20 26 72 63  rsorNew(pDb, &rc
12ae0 29 3b 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b  );.  if( pCsr ){
12af0 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 43  .    rc = multiC
12b00 75 72 73 6f 72 41 64 64 41 6c 6c 28 70 43 73 72  ursorAddAll(pCsr
12b10 2c 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 29 3b  , pDb->pWorker);
12b20 0a 20 20 20 20 70 43 73 72 2d 3e 66 6c 61 67 73  .    pCsr->flags
12b30 20 7c 3d 20 43 55 52 53 4f 52 5f 49 47 4e 4f 52   |= CURSOR_IGNOR
12b40 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 20 20  E_DELETE;.  }.  
12b50 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f  .  if( rc==LSM_O
12b60 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 73  K ){.    rc = ls
12b70 6d 4d 43 75 72 73 6f 72 4c 61 73 74 28 70 43 73  mMCursorLast(pCs
12b80 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
12b90 4c 53 4d 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20  LSM_OK .     && 
12ba0 72 74 49 73 57 72 69 74 65 28 70 43 73 72 2d 3e  rtIsWrite(pCsr->
12bb0 65 54 79 70 65 29 20 26 26 20 72 74 49 73 53 79  eType) && rtIsSy
12bc0 73 74 65 6d 28 70 43 73 72 2d 3e 65 54 79 70 65  stem(pCsr->eType
12bd0 29 0a 20 20 20 20 20 26 26 20 70 43 73 72 2d 3e  ).     && pCsr->
12be0 6b 65 79 2e 6e 44 61 74 61 3d 3d 38 20 0a 20 20  key.nData==8 .  
12bf0 20 20 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28     && 0==memcmp(
12c00 70 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74 61 2c  pCsr->key.pData,
12c10 20 22 46 52 45 45 4c 49 53 54 22 2c 20 38 29 0a   "FREELIST", 8).
12c20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 76 6f 69      ){.      voi
12c30 64 20 2a 70 56 61 6c 3b 20 69 6e 74 20 6e 56 61  d *pVal; int nVa
12c40 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61  l;         /* Va
12c50 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 64 61  lue read from da
12c60 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
12c70 72 63 20 3d 20 6c 73 6d 4d 43 75 72 73 6f 72 56  rc = lsmMCursorV
12c80 61 6c 75 65 28 70 43 73 72 2c 20 26 70 56 61 6c  alue(pCsr, &pVal
12c90 2c 20 26 6e 56 61 6c 29 3b 0a 20 20 20 20 20 20  , &nVal);.      
12ca0 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  if( rc==LSM_OK )
12cb0 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 56 61 6c  {.        *ppVal
12cc0 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 52 63 28 70   = lsmMallocRc(p
12cd0 44 62 2d 3e 70 45 6e 76 2c 20 6e 56 61 6c 2c 20  Db->pEnv, nVal, 
12ce0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
12cf0 28 20 2a 70 70 56 61 6c 20 29 7b 0a 20 20 20 20  ( *ppVal ){.    
12d00 20 20 20 20 20 20 6d 65 6d 63 70 79 28 2a 70 70        memcpy(*pp
12d10 56 61 6c 2c 20 70 56 61 6c 2c 20 6e 56 61 6c 29  Val, pVal, nVal)
12d20 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 6e 56  ;.          *pnV
12d30 61 6c 20 3d 20 6e 56 61 6c 3b 0a 20 20 20 20 20  al = nVal;.     
12d40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12d50 20 7d 0a 0a 20 20 20 20 6c 73 6d 4d 43 75 72 73   }..    lsmMCurs
12d60 6f 72 43 6c 6f 73 65 28 70 43 73 72 2c 20 30 29  orClose(pCsr, 0)
12d70 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
12d80 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
12d90 74 20 6d 75 6c 74 69 43 75 72 73 6f 72 41 6c 6c  t multiCursorAll
12da0 6f 63 54 72 65 65 28 4d 75 6c 74 69 43 75 72 73  ocTree(MultiCurs
12db0 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74  or *pCsr){.  int
12dc0 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20   rc = LSM_OK;.  
12dd0 69 66 28 20 70 43 73 72 2d 3e 61 54 72 65 65 3d  if( pCsr->aTree=
12de0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  =0 ){.    int nB
12df0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
12e00 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
12e10 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
12e20 6f 63 61 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74  ocate */.    int
12e30 20 6e 4d 69 6e 3b 20 20 20 20 20 20 20 20 20 20   nMin;          
12e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
12e50 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  tal number of cu
12e60 72 73 6f 72 73 20 62 65 69 6e 67 20 6d 65 72 67  rsors being merg
12e70 65 64 20 2a 2f 0a 0a 20 20 20 20 6e 4d 69 6e 20  ed */..    nMin 
12e80 3d 20 43 55 52 53 4f 52 5f 44 41 54 41 5f 53 45  = CURSOR_DATA_SE
12e90 47 4d 45 4e 54 20 2b 20 70 43 73 72 2d 3e 6e 50  GMENT + pCsr->nP
12ea0 74 72 20 2b 20 28 70 43 73 72 2d 3e 70 42 74 43  tr + (pCsr->pBtC
12eb0 73 72 21 3d 30 29 3b 0a 20 20 20 20 70 43 73 72  sr!=0);.    pCsr
12ec0 2d 3e 6e 54 72 65 65 20 3d 20 32 3b 0a 20 20 20  ->nTree = 2;.   
12ed0 20 77 68 69 6c 65 28 20 70 43 73 72 2d 3e 6e 54   while( pCsr->nT
12ee0 72 65 65 3c 6e 4d 69 6e 20 29 7b 0a 20 20 20 20  ree<nMin ){.    
12ef0 20 20 70 43 73 72 2d 3e 6e 54 72 65 65 20 3d 20    pCsr->nTree = 
12f00 70 43 73 72 2d 3e 6e 54 72 65 65 2a 32 3b 0a 20  pCsr->nTree*2;. 
12f10 20 20 20 7d 0a 0a 20 20 20 20 6e 42 79 74 65 20     }..    nByte 
12f20 3d 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 70 43  = sizeof(int)*pC
12f30 73 72 2d 3e 6e 54 72 65 65 2a 32 3b 0a 20 20 20  sr->nTree*2;.   
12f40 20 70 43 73 72 2d 3e 61 54 72 65 65 20 3d 20 28   pCsr->aTree = (
12f50 69 6e 74 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a  int *)lsmMallocZ
12f60 65 72 6f 52 63 28 70 43 73 72 2d 3e 70 44 62 2d  eroRc(pCsr->pDb-
12f70 3e 70 45 6e 76 2c 20 6e 42 79 74 65 2c 20 26 72  >pEnv, nByte, &r
12f80 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
12f90 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76   rc;.}..static v
12fa0 6f 69 64 20 6d 75 6c 74 69 43 75 72 73 6f 72 43  oid multiCursorC
12fb0 61 63 68 65 4b 65 79 28 4d 75 6c 74 69 43 75 72  acheKey(MultiCur
12fc0 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20 2a  sor *pCsr, int *
12fd0 70 52 63 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  pRc){.  if( *pRc
12fe0 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
12ff0 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20  void *pKey;.    
13000 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 6d 75  int nKey;.    mu
13010 6c 74 69 43 75 72 73 6f 72 47 65 74 4b 65 79 28  ltiCursorGetKey(
13020 70 43 73 72 2c 20 70 43 73 72 2d 3e 61 54 72 65  pCsr, pCsr->aTre
13030 65 5b 31 5d 2c 20 26 70 43 73 72 2d 3e 65 54 79  e[1], &pCsr->eTy
13040 70 65 2c 20 26 70 4b 65 79 2c 20 26 6e 4b 65 79  pe, &pKey, &nKey
13050 29 3b 0a 20 20 20 20 2a 70 52 63 20 3d 20 73 6f  );.    *pRc = so
13060 72 74 65 64 42 6c 6f 62 53 65 74 28 70 43 73 72  rtedBlobSet(pCsr
13070 2d 3e 70 44 62 2d 3e 70 45 6e 76 2c 20 26 70 43  ->pDb->pEnv, &pC
13080 73 72 2d 3e 6b 65 79 2c 20 70 4b 65 79 2c 20 6e  sr->key, pKey, n
13090 4b 65 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  Key);.  }.}..#if
130a0 64 65 66 20 4c 53 4d 5f 44 45 42 55 47 5f 45 58  def LSM_DEBUG_EX
130b0 50 45 4e 53 49 56 45 0a 73 74 61 74 69 63 20 76  PENSIVE.static v
130c0 6f 69 64 20 61 73 73 65 72 74 43 75 72 73 6f 72  oid assertCursor
130d0 54 72 65 65 28 4d 75 6c 74 69 43 75 72 73 6f 72  Tree(MultiCursor
130e0 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 62   *pCsr){.  int b
130f0 52 65 76 20 3d 20 21 21 28 70 43 73 72 2d 3e 66  Rev = !!(pCsr->f
13100 6c 61 67 73 20 26 20 43 55 52 53 4f 52 5f 50 52  lags & CURSOR_PR
13110 45 56 5f 4f 4b 29 3b 0a 20 20 69 6e 74 20 2a 61  EV_OK);.  int *a
13120 53 61 76 65 20 3d 20 70 43 73 72 2d 3e 61 54 72  Save = pCsr->aTr
13130 65 65 3b 0a 20 20 69 6e 74 20 6e 53 61 76 65 20  ee;.  int nSave 
13140 3d 20 70 43 73 72 2d 3e 6e 54 72 65 65 3b 0a 20  = pCsr->nTree;. 
13150 20 69 6e 74 20 72 63 3b 0a 0a 20 20 70 43 73 72   int rc;..  pCsr
13160 2d 3e 61 54 72 65 65 20 3d 20 30 3b 0a 20 20 70  ->aTree = 0;.  p
13170 43 73 72 2d 3e 6e 54 72 65 65 20 3d 20 30 3b 0a  Csr->nTree = 0;.
13180 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72 73    rc = multiCurs
13190 6f 72 41 6c 6c 6f 63 54 72 65 65 28 70 43 73 72  orAllocTree(pCsr
131a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d  );.  if( rc==LSM
131b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
131c0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 43 73 72  ;.    for(i=pCsr
131d0 2d 3e 6e 54 72 65 65 2d 31 3b 20 69 3e 30 3b 20  ->nTree-1; i>0; 
131e0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6d 75 6c 74  i--){.      mult
131f0 69 43 75 72 73 6f 72 44 6f 43 6f 6d 70 61 72 65  iCursorDoCompare
13200 28 70 43 73 72 2c 20 69 2c 20 62 52 65 76 29 3b  (pCsr, i, bRev);
13210 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
13220 72 74 28 20 6e 53 61 76 65 3d 3d 70 43 73 72 2d  rt( nSave==pCsr-
13230 3e 6e 54 72 65 65 20 0a 20 20 20 20 20 20 20 20  >nTree .        
13240 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 53 61  && 0==memcmp(aSa
13250 76 65 2c 20 70 43 73 72 2d 3e 61 54 72 65 65 2c  ve, pCsr->aTree,
13260 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 53 61   sizeof(int)*nSa
13270 76 65 29 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20  ve).    );..    
13280 6c 73 6d 46 72 65 65 28 70 43 73 72 2d 3e 70 44  lsmFree(pCsr->pD
13290 62 2d 3e 70 45 6e 76 2c 20 70 43 73 72 2d 3e 61  b->pEnv, pCsr->a
132a0 54 72 65 65 29 3b 0a 20 20 7d 0a 0a 20 20 70 43  Tree);.  }..  pC
132b0 73 72 2d 3e 61 54 72 65 65 20 3d 20 61 53 61 76  sr->aTree = aSav
132c0 65 3b 0a 20 20 70 43 73 72 2d 3e 6e 54 72 65 65  e;.  pCsr->nTree
132d0 20 3d 20 6e 53 61 76 65 3b 0a 7d 0a 23 65 6c 73   = nSave;.}.#els
132e0 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72  e.# define asser
132f0 74 43 75 72 73 6f 72 54 72 65 65 28 78 29 0a 23  tCursorTree(x).#
13300 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e  endif..static in
13310 74 20 6d 63 75 72 73 6f 72 4c 6f 63 61 74 69 6f  t mcursorLocatio
13320 6e 4f 6b 28 4d 75 6c 74 69 43 75 72 73 6f 72 20  nOk(MultiCursor 
13330 2a 70 43 73 72 2c 20 69 6e 74 20 62 44 65 6c 65  *pCsr, int bDele
13340 74 65 4f 6b 29 7b 0a 20 20 69 6e 74 20 65 54 79  teOk){.  int eTy
13350 70 65 20 3d 20 70 43 73 72 2d 3e 65 54 79 70 65  pe = pCsr->eType
13360 3b 0a 20 20 69 6e 74 20 69 4b 65 79 3b 0a 20 20  ;.  int iKey;.  
13370 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 64 6d  int i;.  int rdm
13380 61 73 6b 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ask;.  .  assert
13390 28 20 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20  ( pCsr->flags & 
133a0 28 43 55 52 53 4f 52 5f 4e 45 58 54 5f 4f 4b 7c  (CURSOR_NEXT_OK|
133b0 43 55 52 53 4f 52 5f 50 52 45 56 5f 4f 4b 29 20  CURSOR_PREV_OK) 
133c0 29 3b 0a 20 20 61 73 73 65 72 74 43 75 72 73 6f  );.  assertCurso
133d0 72 54 72 65 65 28 70 43 73 72 29 3b 0a 0a 20 20  rTree(pCsr);..  
133e0 72 64 6d 61 73 6b 20 3d 20 28 70 43 73 72 2d 3e  rdmask = (pCsr->
133f0 66 6c 61 67 73 20 26 20 43 55 52 53 4f 52 5f 4e  flags & CURSOR_N
13400 45 58 54 5f 4f 4b 29 20 3f 20 4c 53 4d 5f 45 4e  EXT_OK) ? LSM_EN
13410 44 5f 44 45 4c 45 54 45 20 3a 20 4c 53 4d 5f 53  D_DELETE : LSM_S
13420 54 41 52 54 5f 44 45 4c 45 54 45 3b 0a 0a 20 20  TART_DELETE;..  
13430 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
13440 20 64 6f 65 73 20 6e 6f 74 20 63 75 72 72 65 6e   does not curren
13450 74 6c 79 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  tly point to an 
13460 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
13470 6b 65 79 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69  key (i.e..  ** i
13480 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64 65  t points to a de
13490 6c 65 74 65 20 6b 65 79 2c 20 6f 72 20 74 68 65  lete key, or the
134a0 20 73 74 61 72 74 20 6f 72 20 65 6e 64 20 6f 66   start or end of
134b0 20 61 20 72 61 6e 67 65 2d 64 65 6c 65 74 65 29   a range-delete)
134c0 2c 20 61 6e 64 0a 20 20 2a 2a 20 74 68 65 20 43  , and.  ** the C
134d0 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 44 45 4c  URSOR_IGNORE_DEL
134e0 45 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ETE flag is set,
134f0 20 73 6b 69 70 20 70 61 73 74 20 74 68 69 73 20   skip past this 
13500 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 69 66 28  entry.  */.  if(
13510 20 28 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20   (pCsr->flags & 
13520 43 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 44 45  CURSOR_IGNORE_DE
13530 4c 45 54 45 29 20 26 26 20 62 44 65 6c 65 74 65  LETE) && bDelete
13540 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  Ok==0 ){.    if(
13550 20 28 65 54 79 70 65 20 26 20 4c 53 4d 5f 49 4e   (eType & LSM_IN
13560 53 45 52 54 29 3d 3d 30 20 29 20 72 65 74 75 72  SERT)==0 ) retur
13570 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
13580 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  f the cursor poi
13590 6e 74 73 20 74 6f 20 61 20 73 79 73 74 65 6d 20  nts to a system 
135a0 6b 65 79 20 28 66 72 65 65 2d 6c 69 73 74 20 65  key (free-list e
135b0 6e 74 72 79 29 2c 20 61 6e 64 20 74 68 65 0a 20  ntry), and the. 
135c0 20 2a 2a 20 43 55 52 53 4f 52 5f 49 47 4e 4f 52   ** CURSOR_IGNOR
135d0 45 5f 53 59 53 54 45 4d 20 66 6c 61 67 20 69 73  E_SYSTEM flag is
135e0 20 73 65 74 2c 20 73 6b 69 70 20 74 68 69 65 20   set, skip thie 
135f0 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 69 66 28  entry.  */.  if(
13600 20 28 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20   (pCsr->flags & 
13610 43 55 52 53 4f 52 5f 49 47 4e 4f 52 45 5f 53 59  CURSOR_IGNORE_SY
13620 53 54 45 4d 29 20 26 26 20 72 74 54 6f 70 69 63  STEM) && rtTopic
13630 28 65 54 79 70 65 29 21 3d 30 20 29 7b 0a 20 20  (eType)!=0 ){.  
13640 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
13650 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13660 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
13670 66 69 72 65 73 20 61 73 73 65 72 74 28 29 20 73  fires assert() s
13680 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 63 68 65  tatements to che
13690 63 6b 20 6f 6e 65 20 6f 66 20 74 68 65 20 61 73  ck one of the as
136a0 73 75 6d 70 74 69 6f 6e 73 0a 20 20 2a 2a 20 69  sumptions.  ** i
136b0 6e 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 62 65  n the comment be
136c0 6c 6f 77 20 2d 20 74 68 61 74 20 69 66 20 74 68  low - that if th
136d0 65 20 6c 68 73 20 73 75 62 2d 63 75 72 73 6f 72  e lhs sub-cursor
136e0 20 6f 66 20 61 20 6c 65 76 65 6c 20 75 6e 64 65   of a level unde
136f0 72 67 6f 69 6e 67 0a 20 20 2a 2a 20 61 20 6d 65  rgoing.  ** a me
13700 72 67 65 20 69 73 20 76 61 6c 69 64 2c 20 74 68  rge is valid, th
13710 65 6e 20 61 6c 6c 20 74 68 65 20 72 68 73 20 73  en all the rhs s
13720 75 62 2d 63 75 72 73 6f 72 73 20 6d 75 73 74 20  ub-cursors must 
13730 62 65 20 61 74 20 45 4f 46 2e 20 0a 20 20 2a 2a  be at EOF. .  **
13740 0a 20 20 2a 2a 20 41 6c 73 6f 20 61 73 73 65 72  .  ** Also asser
13750 74 20 74 68 61 74 20 61 6c 6c 20 72 68 73 20 73  t that all rhs s
13760 75 62 2d 63 75 72 73 6f 72 73 20 61 72 65 20 65  ub-cursors are e
13770 69 74 68 65 72 20 61 74 20 45 4f 46 20 6f 72 20  ither at EOF or 
13780 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 61 20  point to.  ** a 
13790 6b 65 79 20 74 68 61 74 20 69 73 20 6e 6f 74 20  key that is not 
137a0 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 65  less than the le
137b0 76 65 6c 20 73 70 6c 69 74 2d 6b 65 79 2e 20 20  vel split-key.  
137c0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
137d0 70 43 73 72 2d 3e 6e 50 74 72 3b 20 69 2b 2b 29  pCsr->nPtr; i++)
137e0 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 50 74 72  {.    SegmentPtr
137f0 20 2a 70 50 74 72 20 3d 20 26 70 43 73 72 2d 3e   *pPtr = &pCsr->
13800 61 50 74 72 5b 69 5d 3b 0a 20 20 20 20 4c 65 76  aPtr[i];.    Lev
13810 65 6c 20 2a 70 4c 76 6c 20 3d 20 70 50 74 72 2d  el *pLvl = pPtr-
13820 3e 70 4c 65 76 65 6c 3b 0a 20 20 20 20 69 66 28  >pLevel;.    if(
13830 20 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 20 26 26   pLvl->nRight &&
13840 20 70 50 74 72 2d 3e 70 50 67 20 29 7b 0a 20 20   pPtr->pPg ){.  
13850 20 20 20 20 69 66 28 20 70 50 74 72 2d 3e 70 53      if( pPtr->pS
13860 65 67 3d 3d 26 70 4c 76 6c 2d 3e 6c 68 73 20 29  eg==&pLvl->lhs )
13870 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  {.        int j;
13880 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
13890 3b 20 6a 3c 70 4c 76 6c 2d 3e 6e 52 69 67 68 74  ; j<pLvl->nRight
138a0 3b 20 6a 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; j++) assert( p
138b0 50 74 72 5b 6a 2b 31 5d 2e 70 50 67 3d 3d 30 20  Ptr[j+1].pPg==0 
138c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
138d0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20          int res 
138e0 3d 20 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61  = sortedKeyCompa
138f0 72 65 28 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43  re(pCsr->pDb->xC
13900 6d 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  mp, .           
13910 20 72 74 54 6f 70 69 63 28 70 50 74 72 2d 3e 65   rtTopic(pPtr->e
13920 54 79 70 65 29 2c 20 70 50 74 72 2d 3e 70 4b 65  Type), pPtr->pKe
13930 79 2c 20 70 50 74 72 2d 3e 6e 4b 65 79 2c 0a 20  y, pPtr->nKey,. 
13940 20 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d             pLvl-
13950 3e 69 53 70 6c 69 74 54 6f 70 69 63 2c 20 70 4c  >iSplitTopic, pL
13960 76 6c 2d 3e 70 53 70 6c 69 74 4b 65 79 2c 20 70  vl->pSplitKey, p
13970 4c 76 6c 2d 3e 6e 53 70 6c 69 74 4b 65 79 0a 20  Lvl->nSplitKey. 
13980 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
13990 20 20 61 73 73 65 72 74 28 20 72 65 73 3e 3d 30    assert( res>=0
139a0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
139b0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
139c0 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 69 66 20  /* Now check if 
139d0 74 68 69 73 20 6b 65 79 20 68 61 73 20 61 6c 72  this key has alr
139e0 65 61 64 79 20 62 65 65 6e 20 64 65 6c 65 74 65  eady been delete
139f0 64 20 62 79 20 61 20 72 61 6e 67 65 2d 64 65 6c  d by a range-del
13a00 65 74 65 2e 20 49 66 20 0a 20 20 2a 2a 20 73 6f  ete. If .  ** so
13a10 2c 20 73 6b 69 70 20 70 61 73 74 20 69 74 2e 0a  , skip past it..
13a20 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 73 75 6d 65    **.  ** Assume
13a30 2c 20 66 6f 72 20 74 68 65 20 6d 6f 6d 65 6e 74  , for the moment
13a40 2c 20 74 68 61 74 20 74 68 65 20 74 72 65 65 20  , that the tree 
13a50 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 6c 65 76 65  contains no leve
13a60 6c 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 20 20  ls currently .  
13a70 2a 2a 20 75 6e 64 65 72 67 6f 69 6e 67 20 69 6e  ** undergoing in
13a80 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 2c  cremental merge,
13a90 20 61 6e 64 20 74 68 61 74 20 74 68 69 73 20 63   and that this c
13aa0 75 72 73 6f 72 20 69 73 20 69 74 65 72 61 74 69  ursor is iterati
13ab0 6e 67 20 66 6f 72 77 61 72 64 73 0a 20 20 2a 2a  ng forwards.  **
13ac0 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
13ad0 61 62 61 73 65 20 6b 65 79 73 2e 20 54 68 65 20  abase keys. The 
13ae0 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79  cursor currently
13af0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6b 65 79   points to a key
13b00 20 69 6e 0a 20 20 2a 2a 20 6c 65 76 65 6c 20 4c   in.  ** level L
13b10 2e 20 54 68 69 73 20 6b 65 79 20 68 61 73 20 61  . This key has a
13b20 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 6c 65  lready been dele
13b30 74 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ted if any of th
13b40 65 20 73 75 62 2d 63 75 72 73 6f 72 73 0a 20 20  e sub-cursors.  
13b50 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
13b60 20 6c 65 76 65 6c 73 20 6e 65 77 65 72 20 74 68   levels newer th
13b70 61 6e 20 4c 20 28 6f 72 20 74 6f 20 74 68 65 20  an L (or to the 
13b80 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65 29 20  in-memory tree) 
13b90 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 61 20  point to.  ** a 
13ba0 6b 65 79 20 67 72 65 61 74 65 72 20 74 68 61 6e  key greater than
13bb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6b 65 79   the current key
13bc0 20 77 69 74 68 20 74 68 65 20 4c 53 4d 5f 45 4e   with the LSM_EN
13bd0 44 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 73 65  D_DELETE flag se
13be0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c  t..  **.  ** Or,
13bf0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
13c00 73 20 69 74 65 72 61 74 69 6e 67 20 62 61 63 6b  s iterating back
13c10 77 61 72 64 73 20 74 68 72 6f 75 67 68 20 64 61  wards through da
13c20 74 61 20 6b 65 79 73 2c 20 69 66 20 61 6e 79 0a  ta keys, if any.
13c30 20 20 2a 2a 20 73 75 63 68 20 73 75 62 2d 63 75    ** such sub-cu
13c40 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  rsor points to a
13c50 20 6b 65 79 20 73 6d 61 6c 6c 65 72 20 74 68 61   key smaller tha
13c60 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6b 65  n the current ke
13c70 79 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  y with the.  ** 
13c80 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54 45  LSM_START_DELETE
13c90 20 66 6c 61 67 20 73 65 74 2e 0a 20 20 2a 2a 0a   flag set..  **.
13ca0 20 20 2a 2a 20 57 68 79 20 69 74 20 77 6f 72 6b    ** Why it work
13cb0 73 20 77 69 74 68 20 6c 65 76 65 6c 73 20 75 6e  s with levels un
13cc0 64 65 72 67 6f 69 6e 67 20 61 20 6d 65 72 67 65  dergoing a merge
13cd0 20 74 6f 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   too:.  **.  ** 
13ce0 57 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 74  When a cursor it
13cf0 65 72 61 74 65 73 20 66 6f 72 77 61 72 64 73 2c  erates forwards,
13d00 20 74 68 65 20 73 75 62 2d 63 75 72 73 6f 72 73   the sub-cursors
13d10 20 66 6f 72 20 74 68 65 20 72 68 73 20 6f 66 20   for the rhs of 
13d20 61 20 0a 20 20 2a 2a 20 6c 65 76 65 6c 20 61 72  a .  ** level ar
13d30 65 20 6f 6e 6c 79 20 61 63 74 69 76 61 74 65 64  e only activated
13d40 20 6f 6e 63 65 20 74 68 65 20 6c 68 73 20 72 65   once the lhs re
13d50 61 63 68 65 73 20 45 4f 46 2e 20 53 6f 20 77 68  aches EOF. So wh
13d60 65 6e 20 69 74 65 72 61 74 69 6e 67 0a 20 20 2a  en iterating.  *
13d70 2a 20 66 6f 72 77 61 72 64 73 2c 20 74 68 65 20  * forwards, the 
13d80 6b 65 79 73 20 76 69 73 69 74 65 64 20 61 72 65  keys visited are
13d90 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 66 20   the same as if 
13da0 74 68 65 20 6c 65 76 65 6c 20 77 61 73 20 63 6f  the level was co
13db0 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 6d 65  mpletely.  ** me
13dc0 72 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rged..  **.  ** 
13dd0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
13de0 20 69 74 65 72 61 74 69 6e 67 20 62 61 63 6b 77   iterating backw
13df0 61 72 64 73 2c 20 74 68 65 6e 20 74 68 65 20 6c  ards, then the l
13e00 68 73 20 73 75 62 2d 63 75 72 73 6f 72 20 69 73  hs sub-cursor is
13e10 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 69 74 69   not .  ** initi
13e20 61 6c 69 7a 65 64 20 75 6e 74 69 6c 20 74 68 65  alized until the
13e30 20 6c 61 73 74 20 6f 66 20 74 68 65 20 72 68 73   last of the rhs
13e40 20 73 75 62 2d 63 75 72 73 6f 72 73 20 68 61 73   sub-cursors has
13e50 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 20 20   reached EOF..  
13e60 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  ** Additionally,
13e70 20 69 66 20 74 68 65 20 53 54 41 52 54 5f 44 45   if the START_DE
13e80 4c 45 54 45 20 66 6c 61 67 20 69 73 20 73 65 74  LETE flag is set
13e90 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 65 6e 74   on the last ent
13ea0 72 79 20 28 69 6e 0a 20 20 2a 2a 20 72 65 76 65  ry (in.  ** reve
13eb0 72 73 65 20 6f 72 64 65 72 20 2d 20 73 6f 20 74  rse order - so t
13ec0 68 65 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  he entry with th
13ed0 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 29 20  e smallest key) 
13ee0 6f 66 20 61 20 72 68 73 20 73 75 62 2d 63 75 72  of a rhs sub-cur
13ef0 73 6f 72 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 61  sor,.  ** then a
13f00 20 70 73 65 75 64 6f 2d 6b 65 79 20 65 71 75 61   pseudo-key equa
13f10 6c 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 73 20  l to the levels 
13f20 73 70 6c 69 74 2d 6b 65 79 20 77 69 74 68 20 74  split-key with t
13f30 68 65 20 45 4e 44 5f 44 45 4c 45 54 45 0a 20 20  he END_DELETE.  
13f40 2a 2a 20 66 6c 61 67 20 73 65 74 20 69 73 20 76  ** flag set is v
13f50 69 73 69 74 65 64 20 62 79 20 74 68 65 20 73 75  isited by the su
13f60 62 2d 63 75 72 73 6f 72 2e 0a 20 20 2a 2f 20 0a  b-cursor..  */ .
13f70 20 20 69 4b 65 79 20 3d 20 70 43 73 72 2d 3e 61    iKey = pCsr->a
13f80 54 72 65 65 5b 31 5d 3b 0a 20 20 66 6f 72 28 69  Tree[1];.  for(i
13f90 3d 30 3b 20 69 3c 69 4b 65 79 3b 20 69 2b 2b 29  =0; i<iKey; i++)
13fa0 7b 0a 20 20 20 20 69 6e 74 20 63 73 72 66 6c 61  {.    int csrfla
13fb0 67 73 3b 0a 20 20 20 20 6d 75 6c 74 69 43 75 72  gs;.    multiCur
13fc0 73 6f 72 47 65 74 4b 65 79 28 70 43 73 72 2c 20  sorGetKey(pCsr, 
13fd0 69 2c 20 26 63 73 72 66 6c 61 67 73 2c 20 30 2c  i, &csrflags, 0,
13fe0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28 72 64   0);.    if( (rd
13ff0 6d 61 73 6b 20 26 20 63 73 72 66 6c 61 67 73 29  mask & csrflags)
14000 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
14010 69 6e 74 20 53 44 5f 45 44 20 3d 20 28 4c 53 4d  int SD_ED = (LSM
14020 5f 53 54 41 52 54 5f 44 45 4c 45 54 45 7c 4c 53  _START_DELETE|LS
14030 4d 5f 45 4e 44 5f 44 45 4c 45 54 45 29 3b 0a 20  M_END_DELETE);. 
14040 20 20 20 20 20 69 66 28 20 28 63 73 72 66 6c 61       if( (csrfla
14050 67 73 20 26 20 53 44 5f 45 44 29 3d 3d 53 44 5f  gs & SD_ED)==SD_
14060 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ED .       || (p
14070 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 43 55 52  Csr->flags & CUR
14080 53 4f 52 5f 49 47 4e 4f 52 45 5f 44 45 4c 45 54  SOR_IGNORE_DELET
14090 45 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  E)==0.      ){. 
140a0 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4b 65         void *pKe
140b0 79 3b 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20  y; int nKey;.   
140c0 20 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f 72       multiCursor
140d0 47 65 74 4b 65 79 28 70 43 73 72 2c 20 69 2c 20  GetKey(pCsr, i, 
140e0 30 2c 20 26 70 4b 65 79 2c 20 26 6e 4b 65 79 29  0, &pKey, &nKey)
140f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
14100 3d 73 6f 72 74 65 64 4b 65 79 43 6f 6d 70 61 72  =sortedKeyCompar
14110 65 28 70 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d  e(pCsr->pDb->xCm
14120 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
14130 20 72 74 54 6f 70 69 63 28 65 54 79 70 65 29 2c   rtTopic(eType),
14140 20 70 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74 61   pCsr->key.pData
14150 2c 20 70 43 73 72 2d 3e 6b 65 79 2e 6e 44 61 74  , pCsr->key.nDat
14160 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a,.             
14170 20 72 74 54 6f 70 69 63 28 63 73 72 66 6c 61 67   rtTopic(csrflag
14180 73 29 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 0a 20  s), pKey, nKey. 
14190 20 20 20 20 20 20 20 29 29 7b 0a 20 20 20 20 20         )){.     
141a0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
141b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
141c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
141d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
141e0 20 54 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   The current cur
141f0 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 73 20  sor position is 
14200 6f 6e 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  one this cursor 
14210 73 68 6f 75 6c 64 20 76 69 73 69 74 2e 20 52 65  should visit. Re
14220 74 75 72 6e 20 31 2e 20 2a 2f 0a 20 20 72 65 74  turn 1. */.  ret
14230 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 1;.}..static
14240 20 69 6e 74 20 6d 75 6c 74 69 43 75 72 73 6f 72   int multiCursor
14250 53 65 74 75 70 54 72 65 65 28 4d 75 6c 74 69 43  SetupTree(MultiC
14260 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74  ursor *pCsr, int
14270 20 62 52 65 76 29 7b 0a 20 20 69 6e 74 20 72 63   bRev){.  int rc
14280 3b 0a 0a 20 20 72 63 20 3d 20 6d 75 6c 74 69 43  ;..  rc = multiC
14290 75 72 73 6f 72 41 6c 6c 6f 63 54 72 65 65 28 70  ursorAllocTree(p
142a0 43 73 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Csr);.  if( rc==
142b0 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  LSM_OK ){.    in
142c0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
142d0 43 73 72 2d 3e 6e 54 72 65 65 2d 31 3b 20 69 3e  Csr->nTree-1; i>
142e0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6d  0; i--){.      m
142f0 75 6c 74 69 43 75 72 73 6f 72 44 6f 43 6f 6d 70  ultiCursorDoComp
14300 61 72 65 28 70 43 73 72 2c 20 69 2c 20 62 52 65  are(pCsr, i, bRe
14310 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  v);.    }.  }.. 
14320 20 61 73 73 65 72 74 43 75 72 73 6f 72 54 72 65   assertCursorTre
14330 65 28 70 43 73 72 29 3b 0a 20 20 6d 75 6c 74 69  e(pCsr);.  multi
14340 43 75 72 73 6f 72 43 61 63 68 65 4b 65 79 28 70  CursorCacheKey(p
14350 43 73 72 2c 20 26 72 63 29 3b 0a 0a 20 20 69 66  Csr, &rc);..  if
14360 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20  ( rc==LSM_OK && 
14370 6d 63 75 72 73 6f 72 4c 6f 63 61 74 69 6f 6e 4f  mcursorLocationO
14380 6b 28 70 43 73 72 2c 20 30 29 3d 3d 30 20 29 7b  k(pCsr, 0)==0 ){
14390 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 43  .    rc = multiC
143a0 75 72 73 6f 72 41 64 76 61 6e 63 65 28 70 43 73  ursorAdvance(pCs
143b0 72 2c 20 62 52 65 76 29 3b 0a 20 20 7d 0a 20 20  r, bRev);.  }.  
143c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73  return rc;.}...s
143d0 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 43  tatic int multiC
143e0 75 72 73 6f 72 45 6e 64 28 4d 75 6c 74 69 43 75  ursorEnd(MultiCu
143f0 72 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e 74 20  rsor *pCsr, int 
14400 62 4c 61 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  bLast){.  int rc
14410 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 6e 74   = LSM_OK;.  int
14420 20 69 3b 0a 0a 20 20 70 43 73 72 2d 3e 66 6c 61   i;..  pCsr->fla
14430 67 73 20 26 3d 20 7e 28 43 55 52 53 4f 52 5f 4e  gs &= ~(CURSOR_N
14440 45 58 54 5f 4f 4b 20 7c 20 43 55 52 53 4f 52 5f  EXT_OK | CURSOR_
14450 50 52 45 56 5f 4f 4b 29 3b 0a 20 20 70 43 73 72  PREV_OK);.  pCsr
14460 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 62 4c 61 73  ->flags |= (bLas
14470 74 20 3f 20 43 55 52 53 4f 52 5f 50 52 45 56 5f  t ? CURSOR_PREV_
14480 4f 4b 20 3a 20 43 55 52 53 4f 52 5f 4e 45 58 54  OK : CURSOR_NEXT
14490 5f 4f 4b 29 3b 0a 20 20 70 43 73 72 2d 3e 69 46  _OK);.  pCsr->iF
144a0 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50  ree = 0;..  /* P
144b0 6f 73 69 74 69 6f 6e 20 74 68 65 20 74 77 6f 20  osition the two 
144c0 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65 65 20 63  in-memory tree c
144d0 75 72 73 6f 72 73 20 2a 2f 0a 20 20 66 6f 72 28  ursors */.  for(
144e0 69 3d 30 3b 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20  i=0; rc==LSM_OK 
144f0 26 26 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20  && i<2; i++){.  
14500 20 20 69 66 28 20 70 43 73 72 2d 3e 61 70 54 72    if( pCsr->apTr
14510 65 65 43 73 72 5b 69 5d 20 29 7b 0a 20 20 20 20  eeCsr[i] ){.    
14520 20 20 72 63 20 3d 20 6c 73 6d 54 72 65 65 43 75    rc = lsmTreeCu
14530 72 73 6f 72 45 6e 64 28 70 43 73 72 2d 3e 61 70  rsorEnd(pCsr->ap
14540 54 72 65 65 43 73 72 5b 69 5d 2c 20 62 4c 61 73  TreeCsr[i], bLas
14550 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
14560 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 4c 53   for(i=0; rc==LS
14570 4d 5f 4f 4b 20 26 26 20 69 3c 70 43 73 72 2d 3e  M_OK && i<pCsr->
14580 6e 50 74 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nPtr; i++){.    
14590 53 65 67 6d 65 6e 74 50 74 72 20 2a 70 50 74 72  SegmentPtr *pPtr
145a0 20 3d 20 26 70 43 73 72 2d 3e 61 50 74 72 5b 69   = &pCsr->aPtr[i
145b0 5d 3b 0a 20 20 20 20 4c 65 76 65 6c 20 2a 70 4c  ];.    Level *pL
145c0 76 6c 20 3d 20 70 50 74 72 2d 3e 70 4c 65 76 65  vl = pPtr->pLeve
145d0 6c 3b 0a 20 20 20 20 69 6e 74 20 69 52 68 73 3b  l;.    int iRhs;
145e0 0a 20 20 20 20 69 6e 74 20 62 48 69 74 20 3d 20  .    int bHit = 
145f0 30 3b 0a 0a 20 20 20 20 69 66 28 20 62 4c 61 73  0;..    if( bLas
14600 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  t ){.      for(i
14610 52 68 73 3d 30 3b 20 69 52 68 73 3c 70 4c 76 6c  Rhs=0; iRhs<pLvl
14620 2d 3e 6e 52 69 67 68 74 20 26 26 20 72 63 3d 3d  ->nRight && rc==
14630 4c 53 4d 5f 4f 4b 3b 20 69 52 68 73 2b 2b 29 7b  LSM_OK; iRhs++){
14640 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 65  .        rc = se
14650 67 6d 65 6e 74 50 74 72 45 6e 64 28 70 43 73 72  gmentPtrEnd(pCsr
14660 2c 20 26 70 50 74 72 5b 69 52 68 73 2b 31 5d 2c  , &pPtr[iRhs+1],
14670 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
14680 20 70 50 74 72 5b 69 52 68 73 2b 31 5d 2e 70 50   pPtr[iRhs+1].pP
14690 67 20 29 20 62 48 69 74 20 3d 20 31 3b 0a 20 20  g ) bHit = 1;.  
146a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
146b0 62 48 69 74 3d 3d 30 20 26 26 20 72 63 3d 3d 4c  bHit==0 && rc==L
146c0 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  SM_OK ){.       
146d0 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72   rc = segmentPtr
146e0 45 6e 64 28 70 43 73 72 2c 20 70 50 74 72 2c 20  End(pCsr, pPtr, 
146f0 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
14700 0a 20 20 20 20 20 20 20 20 73 65 67 6d 65 6e 74  .        segment
14710 50 74 72 52 65 73 65 74 28 70 50 74 72 2c 20 4c  PtrReset(pPtr, L
14720 53 4d 5f 53 45 47 4d 45 4e 54 50 54 52 5f 46 52  SM_SEGMENTPTR_FR
14730 45 45 5f 54 48 52 45 53 48 4f 4c 44 29 3b 0a 20  EE_THRESHOLD);. 
14740 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
14750 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 4c 68 73  {.      int bLhs
14760 20 3d 20 28 70 50 74 72 2d 3e 70 53 65 67 3d 3d   = (pPtr->pSeg==
14770 26 70 4c 76 6c 2d 3e 6c 68 73 29 3b 0a 20 20 20  &pLvl->lhs);.   
14780 20 20 20 61 73 73 65 72 74 28 20 70 50 74 72 2d     assert( pPtr-
14790 3e 70 53 65 67 3d 3d 26 70 4c 76 6c 2d 3e 6c 68  >pSeg==&pLvl->lh
147a0 73 20 7c 7c 20 70 50 74 72 2d 3e 70 53 65 67 3d  s || pPtr->pSeg=
147b0 3d 26 70 4c 76 6c 2d 3e 61 52 68 73 5b 30 5d 20  =&pLvl->aRhs[0] 
147c0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 62 4c  );..      if( bL
147d0 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  hs ){.        rc
147e0 20 3d 20 73 65 67 6d 65 6e 74 50 74 72 45 6e 64   = segmentPtrEnd
147f0 28 70 43 73 72 2c 20 70 50 74 72 2c 20 30 29 3b  (pCsr, pPtr, 0);
14800 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 74  .        if( pPt
14810 72 2d 3e 70 4b 65 79 20 29 20 62 48 69 74 20 3d  r->pKey ) bHit =
14820 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
14830 20 20 66 6f 72 28 69 52 68 73 3d 30 3b 20 69 52    for(iRhs=0; iR
14840 68 73 3c 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 20  hs<pLvl->nRight 
14850 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 3b 20 69  && rc==LSM_OK; i
14860 52 68 73 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Rhs++){.        
14870 69 66 28 20 62 48 69 74 20 29 7b 0a 20 20 20 20  if( bHit ){.    
14880 20 20 20 20 20 20 73 65 67 6d 65 6e 74 50 74 72        segmentPtr
14890 52 65 73 65 74 28 26 70 50 74 72 5b 69 52 68 73  Reset(&pPtr[iRhs
148a0 2b 31 5d 2c 20 4c 53 4d 5f 53 45 47 4d 45 4e 54  +1], LSM_SEGMENT
148b0 50 54 52 5f 46 52 45 45 5f 54 48 52 45 53 48 4f  PTR_FREE_THRESHO
148c0 4c 44 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  LD);.        }el
148d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
148e0 20 3d 20 73 6f 72 74 65 64 52 68 73 46 69 72 73   = sortedRhsFirs
148f0 74 28 70 43 73 72 2c 20 70 4c 76 6c 2c 20 26 70  t(pCsr, pLvl, &p
14900 50 74 72 5b 69 52 68 73 2b 62 4c 68 73 5d 29 3b  Ptr[iRhs+bLhs]);
14910 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14920 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 2b   }.    }.    i +
14930 3d 20 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 3b 0a  = pLvl->nRight;.
14940 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 64 20 74 68    }..  /* And th
14950 65 20 62 2d 74 72 65 65 20 63 75 72 73 6f 72 2c  e b-tree cursor,
14960 20 69 66 20 61 70 70 6c 69 63 61 62 6c 65 20 2a   if applicable *
14970 2f 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f  /.  if( rc==LSM_
14980 4f 4b 20 26 26 20 70 43 73 72 2d 3e 70 42 74 43  OK && pCsr->pBtC
14990 73 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  sr ){.    assert
149a0 28 20 62 4c 61 73 74 3d 3d 30 20 29 3b 0a 20 20  ( bLast==0 );.  
149b0 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
149c0 6f 72 46 69 72 73 74 28 70 43 73 72 2d 3e 70 42  orFirst(pCsr->pB
149d0 74 43 73 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  tCsr);.  }..  if
149e0 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  ( rc==LSM_OK ){.
149f0 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75      rc = multiCu
14a00 72 73 6f 72 53 65 74 75 70 54 72 65 65 28 70 43  rsorSetupTree(pC
14a10 73 72 2c 20 62 4c 61 73 74 29 3b 0a 20 20 7d 0a  sr, bLast);.  }.
14a20 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
14a30 7d 0a 0a 0a 69 6e 74 20 6d 63 75 72 73 6f 72 53  }...int mcursorS
14a40 61 76 65 28 4d 75 6c 74 69 43 75 72 73 6f 72 20  ave(MultiCursor 
14a50 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCsr){.  int rc
14a60 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 66 28   = LSM_OK;.  if(
14a70 20 70 43 73 72 2d 3e 61 54 72 65 65 20 29 7b 0a   pCsr->aTree ){.
14a80 20 20 20 20 69 6e 74 20 69 54 72 65 65 20 3d 20      int iTree = 
14a90 70 43 73 72 2d 3e 61 54 72 65 65 5b 31 5d 3b 0a  pCsr->aTree[1];.
14aa0 20 20 20 20 69 66 28 20 69 54 72 65 65 3d 3d 43      if( iTree==C
14ab0 55 52 53 4f 52 5f 44 41 54 41 5f 54 52 45 45 30  URSOR_DATA_TREE0
14ac0 20 7c 7c 20 69 54 72 65 65 3d 3d 43 55 52 53 4f   || iTree==CURSO
14ad0 52 5f 44 41 54 41 5f 54 52 45 45 31 20 29 7b 0a  R_DATA_TREE1 ){.
14ae0 20 20 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f        multiCurso
14af0 72 43 61 63 68 65 4b 65 79 28 70 43 73 72 2c 20  rCacheKey(pCsr, 
14b00 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
14b10 20 20 6d 63 75 72 73 6f 72 46 72 65 65 43 6f 6d    mcursorFreeCom
14b20 70 6f 6e 65 6e 74 73 28 70 43 73 72 29 3b 0a 20  ponents(pCsr);. 
14b30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
14b40 6e 74 20 6d 63 75 72 73 6f 72 52 65 73 74 6f 72  nt mcursorRestor
14b50 65 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 4d  e(lsm_db *pDb, M
14b60 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72  ultiCursor *pCsr
14b70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  ){.  int rc;.  r
14b80 63 20 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72 49  c = multiCursorI
14b90 6e 69 74 28 70 43 73 72 2c 20 70 44 62 2d 3e 70  nit(pCsr, pDb->p
14ba0 43 6c 69 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Client);.  if( r
14bb0 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 43 73  c==LSM_OK && pCs
14bc0 72 2d 3e 6b 65 79 2e 70 44 61 74 61 20 29 7b 0a  r->key.pData ){.
14bd0 20 20 20 20 72 63 20 3d 20 6c 73 6d 4d 43 75 72      rc = lsmMCur
14be0 73 6f 72 53 65 65 6b 28 70 43 73 72 2c 20 0a 20  sorSeek(pCsr, . 
14bf0 20 20 20 20 20 20 20 20 72 74 54 6f 70 69 63 28          rtTopic(
14c00 70 43 73 72 2d 3e 65 54 79 70 65 29 2c 20 70 43  pCsr->eType), pC
14c10 73 72 2d 3e 6b 65 79 2e 70 44 61 74 61 2c 20 70  sr->key.pData, p
14c20 43 73 72 2d 3e 6b 65 79 2e 6e 44 61 74 61 2c 20  Csr->key.nData, 
14c30 2b 31 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20  +1.    );.  }.  
14c40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e  return rc;.}..in
14c50 74 20 6c 73 6d 53 61 76 65 43 75 72 73 6f 72 73  t lsmSaveCursors
14c60 28 6c 73 6d 5f 64 62 20 2a 70 44 62 29 7b 0a 20  (lsm_db *pDb){. 
14c70 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b   int rc = LSM_OK
14c80 3b 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20  ;.  MultiCursor 
14c90 2a 70 43 73 72 3b 0a 0a 20 20 66 6f 72 28 70 43  *pCsr;..  for(pC
14ca0 73 72 3d 70 44 62 2d 3e 70 43 73 72 3b 20 72 63  sr=pDb->pCsr; rc
14cb0 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 43 73 72  ==LSM_OK && pCsr
14cc0 3b 20 70 43 73 72 3d 70 43 73 72 2d 3e 70 4e 65  ; pCsr=pCsr->pNe
14cd0 78 74 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 63  xt){.    rc = mc
14ce0 75 72 73 6f 72 53 61 76 65 28 70 43 73 72 29 3b  ursorSave(pCsr);
14cf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14d00 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 52 65 73 74  ;.}..int lsmRest
14d10 6f 72 65 43 75 72 73 6f 72 73 28 6c 73 6d 5f 64  oreCursors(lsm_d
14d20 62 20 2a 70 44 62 29 7b 0a 20 20 69 6e 74 20 72  b *pDb){.  int r
14d30 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 4d 75  c = LSM_OK;.  Mu
14d40 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 3b  ltiCursor *pCsr;
14d50 0a 0a 20 20 66 6f 72 28 70 43 73 72 3d 70 44 62  ..  for(pCsr=pDb
14d60 2d 3e 70 43 73 72 3b 20 72 63 3d 3d 4c 53 4d 5f  ->pCsr; rc==LSM_
14d70 4f 4b 20 26 26 20 70 43 73 72 3b 20 70 43 73 72  OK && pCsr; pCsr
14d80 3d 70 43 73 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pCsr->pNext){. 
14d90 20 20 20 72 63 20 3d 20 6d 63 75 72 73 6f 72 52     rc = mcursorR
14da0 65 73 74 6f 72 65 28 70 44 62 2c 20 70 43 73 72  estore(pDb, pCsr
14db0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
14dc0 72 63 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 4d 43  rc;.}..int lsmMC
14dd0 75 72 73 6f 72 46 69 72 73 74 28 4d 75 6c 74 69  ursorFirst(Multi
14de0 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
14df0 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 43 75 72   return multiCur
14e00 73 6f 72 45 6e 64 28 70 43 73 72 2c 20 30 29 3b  sorEnd(pCsr, 0);
14e10 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 4d 43 75 72 73  .}..int lsmMCurs
14e20 6f 72 4c 61 73 74 28 4d 75 6c 74 69 43 75 72 73  orLast(MultiCurs
14e30 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 72 65 74  or *pCsr){.  ret
14e40 75 72 6e 20 6d 75 6c 74 69 43 75 72 73 6f 72 45  urn multiCursorE
14e50 6e 64 28 70 43 73 72 2c 20 31 29 3b 0a 7d 0a 0a  nd(pCsr, 1);.}..
14e60 6c 73 6d 5f 64 62 20 2a 6c 73 6d 4d 43 75 72 73  lsm_db *lsmMCurs
14e70 6f 72 44 62 28 4d 75 6c 74 69 43 75 72 73 6f 72  orDb(MultiCursor
14e80 20 2a 70 43 73 72 29 7b 0a 20 20 72 65 74 75 72   *pCsr){.  retur
14e90 6e 20 70 43 73 72 2d 3e 70 44 62 3b 0a 7d 0a 0a  n pCsr->pDb;.}..
14ea0 76 6f 69 64 20 6c 73 6d 4d 43 75 72 73 6f 72 52  void lsmMCursorR
14eb0 65 73 65 74 28 4d 75 6c 74 69 43 75 72 73 6f 72  eset(MultiCursor
14ec0 20 2a 70 43 73 72 29 7b 0a 20 20 69 6e 74 20 69   *pCsr){.  int i
14ed0 3b 0a 20 20 6c 73 6d 54 72 65 65 43 75 72 73 6f  ;.  lsmTreeCurso
14ee0 72 52 65 73 65 74 28 70 43 73 72 2d 3e 61 70 54  rReset(pCsr->apT
14ef0 72 65 65 43 73 72 5b 30 5d 29 3b 0a 20 20 6c 73  reeCsr[0]);.  ls
14f00 6d 54 72 65 65 43 75 72 73 6f 72 52 65 73 65 74  mTreeCursorReset
14f10 28 70 43 73 72 2d 3e 61 70 54 72 65 65 43 73 72  (pCsr->apTreeCsr
14f20 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [1]);.  for(i=0;
14f30 20 69 3c 70 43 73 72 2d 3e 6e 50 74 72 3b 20 69   i<pCsr->nPtr; i
14f40 2b 2b 29 7b 0a 20 20 20 20 73 65 67 6d 65 6e 74  ++){.    segment
14f50 50 74 72 52 65 73 65 74 28 26 70 43 73 72 2d 3e  PtrReset(&pCsr->
14f60 61 50 74 72 5b 69 5d 2c 20 4c 53 4d 5f 53 45 47  aPtr[i], LSM_SEG
14f70 4d 45 4e 54 50 54 52 5f 46 52 45 45 5f 54 48 52  MENTPTR_FREE_THR
14f80 45 53 48 4f 4c 44 29 3b 0a 20 20 7d 0a 20 20 70  ESHOLD);.  }.  p
14f90 43 73 72 2d 3e 6b 65 79 2e 6e 44 61 74 61 20 3d  Csr->key.nData =
14fa0 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e   0;.}..static in
14fb0 74 20 74 72 65 65 43 75 72 73 6f 72 53 65 65 6b  t treeCursorSeek
14fc0 28 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20  (.  MultiCursor 
14fd0 2a 70 43 73 72 2c 0a 20 20 54 72 65 65 43 75 72  *pCsr,.  TreeCur
14fe0 73 6f 72 20 2a 70 54 72 65 65 43 73 72 2c 20 0a  sor *pTreeCsr, .
14ff0 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e    void *pKey, in
15000 74 20 6e 4b 65 79 2c 20 0a 20 20 69 6e 74 20 65  t nKey, .  int e
15010 53 65 65 6b 2c 0a 20 20 69 6e 74 20 2a 70 62 53  Seek,.  int *pbS
15020 74 6f 70 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  top.){.  int rc 
15030 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 66 28 20  = LSM_OK;.  if( 
15040 70 54 72 65 65 43 73 72 20 29 7b 0a 20 20 20 20  pTreeCsr ){.    
15050 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 20  int res = 0;.   
15060 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 53 65   lsmTreeCursorSe
15070 65 6b 28 70 54 72 65 65 43 73 72 2c 20 70 4b 65  ek(pTreeCsr, pKe
15080 79 2c 20 6e 4b 65 79 2c 20 26 72 65 73 29 3b 0a  y, nKey, &res);.
15090 20 20 20 20 73 77 69 74 63 68 28 20 65 53 65 65      switch( eSee
150a0 6b 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  k ){.      case 
150b0 4c 53 4d 5f 53 45 45 4b 5f 45 51 3a 20 7b 0a 20  LSM_SEEK_EQ: {. 
150c0 20 20 20 20 20 20 20 69 6e 74 20 65 54 79 70 65         int eType
150d0 20 3d 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72   = lsmTreeCursor
150e0 46 6c 61 67 73 28 70 54 72 65 65 43 73 72 29 3b  Flags(pTreeCsr);
150f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65  .        if( (re
15100 73 3c 30 20 26 26 20 28 65 54 79 70 65 20 26 20  s<0 && (eType & 
15110 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45 54 45  LSM_START_DELETE
15120 29 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  )).         || (
15130 72 65 73 3e 30 20 26 26 20 28 65 54 79 70 65 20  res>0 && (eType 
15140 26 20 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45 54 45  & LSM_END_DELETE
15150 29 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  )).         || (
15160 72 65 73 3d 3d 30 20 26 26 20 28 65 54 79 70 65  res==0 && (eType
15170 20 26 20 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c   & LSM_POINT_DEL
15180 45 54 45 29 29 0a 20 20 20 20 20 20 20 20 29 7b  ETE)).        ){
15190 0a 20 20 20 20 20 20 20 20 20 20 2a 70 62 53 74  .          *pbSt
151a0 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  op = 1;.        
151b0 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30  }else if( res==0
151c0 20 26 26 20 28 65 54 79 70 65 20 26 20 4c 53 4d   && (eType & LSM
151d0 5f 49 4e 53 45 52 54 29 20 29 7b 0a 20 20 20 20  _INSERT) ){.    
151e0 20 20 20 20 20 20 6c 73 6d 5f 65 6e 76 20 2a 70        lsm_env *p
151f0 45 6e 76 20 3d 20 70 43 73 72 2d 3e 70 44 62 2d  Env = pCsr->pDb-
15200 3e 70 45 6e 76 3b 0a 20 20 20 20 20 20 20 20 20  >pEnv;.         
15210 20 76 6f 69 64 20 2a 70 3b 20 69 6e 74 20 6e 3b   void *p; int n;
15220 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 2f           /* Key/
15230 76 61 6c 75 65 20 66 72 6f 6d 20 74 72 65 65 2d  value from tree-
15240 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20 20 20 20  cursor */.      
15250 20 20 20 20 2a 70 62 53 74 6f 70 20 3d 20 31 3b      *pbStop = 1;
15260 0a 20 20 20 20 20 20 20 20 20 20 70 43 73 72 2d  .          pCsr-
15270 3e 66 6c 61 67 73 20 7c 3d 20 43 55 52 53 4f 52  >flags |= CURSOR
15280 5f 53 45 45 4b 5f 45 51 3b 0a 20 20 20 20 20 20  _SEEK_EQ;.      
15290 20 20 20 20 72 63 20 3d 20 6c 73 6d 54 72 65 65      rc = lsmTree
152a0 43 75 72 73 6f 72 4b 65 79 28 70 54 72 65 65 43  CursorKey(pTreeC
152b0 73 72 2c 20 26 70 43 73 72 2d 3e 65 54 79 70 65  sr, &pCsr->eType
152c0 2c 20 26 70 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &p, &n);.     
152d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d       if( rc==LSM
152e0 5f 4f 4b 20 29 20 72 63 20 3d 20 73 6f 72 74 65  _OK ) rc = sorte
152f0 64 42 6c 6f 62 53 65 74 28 70 45 6e 76 2c 20 26  dBlobSet(pEnv, &
15300 70 43 73 72 2d 3e 6b 65 79 2c 20 70 2c 20 6e 29  pCsr->key, p, n)
15310 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
15320 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 72 63 20  rc==LSM_OK ) rc 
15330 3d 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 56  = lsmTreeCursorV
15340 61 6c 75 65 28 70 54 72 65 65 43 73 72 2c 20 26  alue(pTreeCsr, &
15350 70 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  p, &n);.        
15360 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b    if( rc==LSM_OK
15370 20 29 20 72 63 20 3d 20 73 6f 72 74 65 64 42 6c   ) rc = sortedBl
15380 6f 62 53 65 74 28 70 45 6e 76 2c 20 26 70 43 73  obSet(pEnv, &pCs
15390 72 2d 3e 76 61 6c 2c 20 70 2c 20 6e 29 3b 0a 20  r->val, p, n);. 
153a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
153b0 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72 52 65   lsmTreeCursorRe
153c0 73 65 74 28 70 54 72 65 65 43 73 72 29 3b 0a 20  set(pTreeCsr);. 
153d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
153e0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
153f0 20 4c 53 4d 5f 53 45 45 4b 5f 47 45 3a 0a 20 20   LSM_SEEK_GE:.  
15400 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20        if( res<0 
15410 26 26 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72  && lsmTreeCursor
15420 56 61 6c 69 64 28 70 54 72 65 65 43 73 72 29 20  Valid(pTreeCsr) 
15430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 73 6d  ){.          lsm
15440 54 72 65 65 43 75 72 73 6f 72 4e 65 78 74 28 70  TreeCursorNext(p
15450 54 72 65 65 43 73 72 29 3b 0a 20 20 20 20 20 20  TreeCsr);.      
15460 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
15470 6b 3b 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  k;.      default
15480 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  :.        if( re
15490 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  s>0 ){.         
154a0 20 61 73 73 65 72 74 28 20 6c 73 6d 54 72 65 65   assert( lsmTree
154b0 43 75 72 73 6f 72 56 61 6c 69 64 28 70 54 72 65  CursorValid(pTre
154c0 65 43 73 72 29 20 29 3b 0a 20 20 20 20 20 20 20  eCsr) );.       
154d0 20 20 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72     lsmTreeCursor
154e0 50 72 65 76 28 70 54 72 65 65 43 73 72 29 3b 0a  Prev(pTreeCsr);.
154f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15500 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
15510 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15520 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  }.../*.** Seek t
15530 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 69 6e  he cursor..*/.in
15540 74 20 6c 73 6d 4d 43 75 72 73 6f 72 53 65 65 6b  t lsmMCursorSeek
15550 28 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20  (.  MultiCursor 
15560 2a 70 43 73 72 2c 20 0a 20 20 69 6e 74 20 69 54  *pCsr, .  int iT
15570 6f 70 69 63 2c 20 0a 20 20 76 6f 69 64 20 2a 70  opic, .  void *p
15580 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 2c 20 0a  Key, int nKey, .
15590 20 20 69 6e 74 20 65 53 65 65 6b 0a 29 7b 0a 20    int eSeek.){. 
155a0 20 69 6e 74 20 65 45 53 65 65 6b 20 3d 20 65 53   int eESeek = eS
155b0 65 65 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  eek;            
155c0 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 65 53   /* Effective eS
155d0 65 65 6b 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  eek parameter */
155e0 0a 20 20 69 6e 74 20 62 53 74 6f 70 20 3d 20 30  .  int bStop = 0
155f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15600 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
15610 65 20 74 6f 20 68 61 6c 74 20 73 65 61 72 63 68  e to halt search
15620 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
15630 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b  int rc = LSM_OK;
15640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15650 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
15660 2f 0a 20 20 69 6e 74 20 69 50 74 72 20 3d 20 30  /.  int iPtr = 0
15670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15680 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
15690 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 70  terate through p
156a0 43 73 72 2d 3e 61 50 74 72 5b 5d 20 2a 2f 0a 20  Csr->aPtr[] */. 
156b0 20 50 67 6e 6f 20 69 50 67 6e 6f 20 3d 20 30 3b   Pgno iPgno = 0;
156c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156d0 20 2f 2a 20 46 43 20 70 6f 69 6e 74 65 72 20 76   /* FC pointer v
156e0 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  alue */..  asser
156f0 74 28 20 70 43 73 72 2d 3e 61 70 54 72 65 65 43  t( pCsr->apTreeC
15700 73 72 5b 30 5d 3d 3d 30 20 7c 7c 20 69 54 6f 70  sr[0]==0 || iTop
15710 69 63 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ic==0 );.  asser
15720 74 28 20 70 43 73 72 2d 3e 61 70 54 72 65 65 43  t( pCsr->apTreeC
15730 73 72 5b 31 5d 3d 3d 30 20 7c 7c 20 69 54 6f 70  sr[1]==0 || iTop
15740 69 63 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  ic==0 );..  if( 
15750 65 45 53 65 65 6b 3d 3d 4c 53 4d 5f 53 45 45 4b  eESeek==LSM_SEEK
15760 5f 4c 45 46 41 53 54 20 29 20 65 45 53 65 65 6b  _LEFAST ) eESeek
15770 20 3d 20 4c 53 4d 5f 53 45 45 4b 5f 4c 45 3b 0a   = LSM_SEEK_LE;.
15780 0a 20 20 61 73 73 65 72 74 28 20 65 45 53 65 65  .  assert( eESee
15790 6b 3d 3d 4c 53 4d 5f 53 45 45 4b 5f 45 51 20 7c  k==LSM_SEEK_EQ |
157a0 7c 20 65 45 53 65 65 6b 3d 3d 4c 53 4d 5f 53 45  | eESeek==LSM_SE
157b0 45 4b 5f 4c 45 20 7c 7c 20 65 45 53 65 65 6b 3d  EK_LE || eESeek=
157c0 3d 4c 53 4d 5f 53 45 45 4b 5f 47 45 20 29 3b 0a  =LSM_SEEK_GE );.
157d0 20 20 61 73 73 65 72 74 28 20 28 70 43 73 72 2d    assert( (pCsr-
157e0 3e 66 6c 61 67 73 20 26 20 43 55 52 53 4f 52 5f  >flags & CURSOR_
157f0 46 4c 55 53 48 5f 46 52 45 45 4c 49 53 54 29 3d  FLUSH_FREELIST)=
15800 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
15810 70 43 73 72 2d 3e 6e 50 74 72 3d 3d 30 20 7c 7c  pCsr->nPtr==0 ||
15820 20 70 43 73 72 2d 3e 61 50 74 72 5b 30 5d 2e 70   pCsr->aPtr[0].p
15830 4c 65 76 65 6c 20 29 3b 0a 0a 20 20 70 43 73 72  Level );..  pCsr
15840 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 43 55 52  ->flags &= ~(CUR
15850 53 4f 52 5f 4e 45 58 54 5f 4f 4b 20 7c 20 43 55  SOR_NEXT_OK | CU
15860 52 53 4f 52 5f 50 52 45 56 5f 4f 4b 20 7c 20 43  RSOR_PREV_OK | C
15870 55 52 53 4f 52 5f 53 45 45 4b 5f 45 51 29 3b 0a  URSOR_SEEK_EQ);.
15880 20 20 72 63 20 3d 20 74 72 65 65 43 75 72 73 6f    rc = treeCurso
15890 72 53 65 65 6b 28 70 43 73 72 2c 20 70 43 73 72  rSeek(pCsr, pCsr
158a0 2d 3e 61 70 54 72 65 65 43 73 72 5b 30 5d 2c 20  ->apTreeCsr[0], 
158b0 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 65 45 53 65  pKey, nKey, eESe
158c0 65 6b 2c 20 26 62 53 74 6f 70 29 3b 0a 20 20 69  ek, &bStop);.  i
158d0 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  f( rc==LSM_OK &&
158e0 20 62 53 74 6f 70 3d 3d 30 20 29 7b 0a 20 20 20   bStop==0 ){.   
158f0 20 72 63 20 3d 20 74 72 65 65 43 75 72 73 6f 72   rc = treeCursor
15900 53 65 65 6b 28 70 43 73 72 2c 20 70 43 73 72 2d  Seek(pCsr, pCsr-
15910 3e 61 70 54 72 65 65 43 73 72 5b 31 5d 2c 20 70  >apTreeCsr[1], p
15920 4b 65 79 2c 20 6e 4b 65 79 2c 20 65 45 53 65 65  Key, nKey, eESee
15930 6b 2c 20 26 62 53 74 6f 70 29 3b 0a 20 20 7d 0a  k, &bStop);.  }.
15940 0a 20 20 2f 2a 20 53 65 65 6b 20 61 6c 6c 20 73  .  /* Seek all s
15950 65 67 6d 65 6e 74 20 70 6f 69 6e 74 65 72 73 2e  egment pointers.
15960 20 2a 2f 0a 20 20 66 6f 72 28 69 50 74 72 3d 30   */.  for(iPtr=0
15970 3b 20 69 50 74 72 3c 70 43 73 72 2d 3e 6e 50 74  ; iPtr<pCsr->nPt
15980 72 20 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20  r && rc==LSM_OK 
15990 26 26 20 62 53 74 6f 70 3d 3d 30 3b 20 69 50 74  && bStop==0; iPt
159a0 72 2b 2b 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e  r++){.    Segmen
159b0 74 50 74 72 20 2a 70 50 74 72 20 3d 20 26 70 43  tPtr *pPtr = &pC
159c0 73 72 2d 3e 61 50 74 72 5b 69 50 74 72 5d 3b 0a  sr->aPtr[iPtr];.
159d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 74 72      assert( pPtr
159e0 2d 3e 70 53 65 67 3d 3d 26 70 50 74 72 2d 3e 70  ->pSeg==&pPtr->p
159f0 4c 65 76 65 6c 2d 3e 6c 68 73 20 29 3b 0a 20 20  Level->lhs );.  
15a00 20 20 72 63 20 3d 20 73 65 65 6b 49 6e 4c 65 76    rc = seekInLev
15a10 65 6c 28 70 43 73 72 2c 20 70 50 74 72 2c 20 65  el(pCsr, pPtr, e
15a20 45 53 65 65 6b 2c 20 69 54 6f 70 69 63 2c 20 70  ESeek, iTopic, p
15a30 4b 65 79 2c 20 6e 4b 65 79 2c 20 26 69 50 67 6e  Key, nKey, &iPgn
15a40 6f 2c 20 26 62 53 74 6f 70 29 3b 0a 20 20 20 20  o, &bStop);.    
15a50 69 50 74 72 20 2b 3d 20 70 50 74 72 2d 3e 70 4c  iPtr += pPtr->pL
15a60 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3b 0a 20 20  evel->nRight;.  
15a70 7d 0a 0a 20 20 69 66 28 20 65 53 65 65 6b 21 3d  }..  if( eSeek!=
15a80 4c 53 4d 5f 53 45 45 4b 5f 45 51 20 29 7b 0a 20  LSM_SEEK_EQ ){. 
15a90 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
15aa0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
15ab0 6d 75 6c 74 69 43 75 72 73 6f 72 41 6c 6c 6f 63  multiCursorAlloc
15ac0 54 72 65 65 28 70 43 73 72 29 3b 0a 20 20 20 20  Tree(pCsr);.    
15ad0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53  }.    if( rc==LS
15ae0 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  M_OK ){.      in
15af0 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
15b00 3d 70 43 73 72 2d 3e 6e 54 72 65 65 2d 31 3b 20  =pCsr->nTree-1; 
15b10 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  i>0; i--){.     
15b20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f 72 44 6f     multiCursorDo
15b30 43 6f 6d 70 61 72 65 28 70 43 73 72 2c 20 69 2c  Compare(pCsr, i,
15b40 20 65 45 53 65 65 6b 3d 3d 4c 53 4d 5f 53 45 45   eESeek==LSM_SEE
15b50 4b 5f 4c 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20  K_LE);.      }. 
15b60 20 20 20 20 20 69 66 28 20 65 53 65 65 6b 3d 3d       if( eSeek==
15b70 4c 53 4d 5f 53 45 45 4b 5f 47 45 20 29 20 70 43  LSM_SEEK_GE ) pC
15b80 73 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 55 52  sr->flags |= CUR
15b90 53 4f 52 5f 4e 45 58 54 5f 4f 4b 3b 0a 20 20 20  SOR_NEXT_OK;.   
15ba0 20 20 20 69 66 28 20 65 53 65 65 6b 3d 3d 4c 53     if( eSeek==LS
15bb0 4d 5f 53 45 45 4b 5f 4c 45 20 29 20 70 43 73 72  M_SEEK_LE ) pCsr
15bc0 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 55 52 53 4f  ->flags |= CURSO
15bd0 52 5f 50 52 45 56 5f 4f 4b 3b 0a 20 20 20 20 7d  R_PREV_OK;.    }
15be0 0a 0a 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f  ..    multiCurso
15bf0 72 43 61 63 68 65 4b 65 79 28 70 43 73 72 2c 20  rCacheKey(pCsr, 
15c00 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
15c10 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 65 53 65 65  ==LSM_OK && eSee
15c20 6b 21 3d 4c 53 4d 5f 53 45 45 4b 5f 4c 45 46 41  k!=LSM_SEEK_LEFA
15c30 53 54 20 26 26 20 30 3d 3d 6d 63 75 72 73 6f 72  ST && 0==mcursor
15c40 4c 6f 63 61 74 69 6f 6e 4f 6b 28 70 43 73 72 2c  LocationOk(pCsr,
15c50 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 77 69   0) ){.      swi
15c60 74 63 68 28 20 65 45 53 65 65 6b 20 29 7b 0a 20  tch( eESeek ){. 
15c70 20 20 20 20 20 20 20 63 61 73 65 20 4c 53 4d 5f         case LSM_
15c80 53 45 45 4b 5f 45 51 3a 0a 20 20 20 20 20 20 20  SEEK_EQ:.       
15c90 20 20 20 6c 73 6d 4d 43 75 72 73 6f 72 52 65 73     lsmMCursorRes
15ca0 65 74 28 70 43 73 72 29 3b 0a 20 20 20 20 20 20  et(pCsr);.      
15cb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15cc0 20 20 20 63 61 73 65 20 4c 53 4d 5f 53 45 45 4b     case LSM_SEEK
15cd0 5f 47 45 3a 0a 20 20 20 20 20 20 20 20 20 20 72  _GE:.          r
15ce0 63 20 3d 20 6c 73 6d 4d 43 75 72 73 6f 72 4e 65  c = lsmMCursorNe
15cf0 78 74 28 70 43 73 72 29 3b 0a 20 20 20 20 20 20  xt(pCsr);.      
15d00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15d10 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
15d20 20 20 20 20 20 20 72 63 20 3d 20 6c 73 6d 4d 43        rc = lsmMC
15d30 75 72 73 6f 72 50 72 65 76 28 70 43 73 72 29 3b  ursorPrev(pCsr);
15d40 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
15d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15d60 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
15d70 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 4d 43 75 72  ;.}..int lsmMCur
15d80 73 6f 72 56 61 6c 69 64 28 4d 75 6c 74 69 43 75  sorValid(MultiCu
15d90 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20 20 69  rsor *pCsr){.  i
15da0 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 69 66  nt res = 0;.  if
15db0 28 20 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20  ( pCsr->flags & 
15dc0 43 55 52 53 4f 52 5f 53 45 45 4b 5f 45 51 20 29  CURSOR_SEEK_EQ )
15dd0 7b 0a 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20  {.    res = 1;. 
15de0 20 7d 65 6c 73 65 20 69 66 28 20 70 43 73 72 2d   }else if( pCsr-
15df0 3e 61 54 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  >aTree ){.    in
15e00 74 20 69 4b 65 79 20 3d 20 70 43 73 72 2d 3e 61  t iKey = pCsr->a
15e10 54 72 65 65 5b 31 5d 3b 0a 20 20 20 20 69 66 28  Tree[1];.    if(
15e20 20 69 4b 65 79 3d 3d 43 55 52 53 4f 52 5f 44 41   iKey==CURSOR_DA
15e30 54 41 5f 54 52 45 45 30 20 7c 7c 20 69 4b 65 79  TA_TREE0 || iKey
15e40 3d 3d 43 55 52 53 4f 52 5f 44 41 54 41 5f 54 52  ==CURSOR_DATA_TR
15e50 45 45 31 20 29 7b 0a 20 20 20 20 20 20 72 65 73  EE1 ){.      res
15e60 20 3d 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72   = lsmTreeCursor
15e70 56 61 6c 69 64 28 70 43 73 72 2d 3e 61 70 54 72  Valid(pCsr->apTr
15e80 65 65 43 73 72 5b 69 4b 65 79 2d 43 55 52 53 4f  eeCsr[iKey-CURSO
15e90 52 5f 44 41 54 41 5f 54 52 45 45 30 5d 29 3b 0a  R_DATA_TREE0]);.
15ea0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15eb0 20 76 6f 69 64 20 2a 70 4b 65 79 3b 20 0a 20 20   void *pKey; .  
15ec0 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f 72 47      multiCursorG
15ed0 65 74 4b 65 79 28 70 43 73 72 2c 20 69 4b 65 79  etKey(pCsr, iKey
15ee0 2c 20 30 2c 20 26 70 4b 65 79 2c 20 30 29 3b 0a  , 0, &pKey, 0);.
15ef0 20 20 20 20 20 20 72 65 73 20 3d 20 70 4b 65 79        res = pKey
15f00 21 3d 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  !=0;.    }.  }. 
15f10 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
15f20 73 74 61 74 69 63 20 69 6e 74 20 6d 63 75 72 73  static int mcurs
15f30 6f 72 41 64 76 61 6e 63 65 4f 6b 28 0a 20 20 4d  orAdvanceOk(.  M
15f40 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72  ultiCursor *pCsr
15f50 2c 20 0a 20 20 69 6e 74 20 62 52 65 76 65 72 73  , .  int bRevers
15f60 65 2c 0a 20 20 69 6e 74 20 2a 70 52 63 0a 29 7b  e,.  int *pRc.){
15f70 0a 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 20 20  .  void *pNew;  
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f90 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
15fa0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
15fb0 6e 67 20 6e 65 77 20 6b 65 79 20 2a 2f 0a 20 20  ng new key */.  
15fc0 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20  int nNew;       
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fe0 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
15ff0 72 20 70 4e 65 77 20 69 6e 20 62 79 74 65 73 20  r pNew in bytes 
16000 2a 2f 0a 20 20 69 6e 74 20 65 4e 65 77 54 79 70  */.  int eNewTyp
16010 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
16020 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
16030 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20  new record */.. 
16040 20 69 66 28 20 2a 70 52 63 20 29 20 72 65 74 75   if( *pRc ) retu
16050 72 6e 20 31 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  rn 1;..  /* Chec
16060 6b 20 74 68 65 20 63 75 72 72 65 6e 74 20 6b 65  k the current ke
16070 79 20 76 61 6c 75 65 2e 20 49 66 20 69 74 20 69  y value. If it i
16080 73 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  s not greater th
16090 61 6e 20 28 69 66 20 62 52 65 76 65 72 73 65 3d  an (if bReverse=
160a0 3d 30 29 0a 20 20 2a 2a 20 6f 72 20 6c 65 73 73  =0).  ** or less
160b0 20 74 68 61 6e 20 28 69 66 20 62 52 65 76 65 72   than (if bRever
160c0 73 65 21 3d 30 29 20 74 68 65 20 6b 65 79 20 63  se!=0) the key c
160d0 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20  urrently cached 
160e0 69 6e 20 70 43 73 72 2d 3e 6b 65 79 2c 20 0a 20  in pCsr->key, . 
160f0 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 75 72   ** then the cur
16100 73 6f 72 20 68 61 73 20 6e 6f 74 20 79 65 74 20  sor has not yet 
16110 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  been successfull
16120 79 20 61 64 76 61 6e 63 65 64 2e 20 20 0a 20 20  y advanced.  .  
16130 2a 2f 0a 20 20 6d 75 6c 74 69 43 75 72 73 6f 72  */.  multiCursor
16140 47 65 74 4b 65 79 28 70 43 73 72 2c 20 70 43 73  GetKey(pCsr, pCs
16150 72 2d 3e 61 54 72 65 65 5b 31 5d 2c 20 26 65 4e  r->aTree[1], &eN
16160 65 77 54 79 70 65 2c 20 26 70 4e 65 77 2c 20 26  ewType, &pNew, &
16170 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65  nNew);.  if( pNe
16180 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 79 70  w ){.    int typ
16190 65 6d 61 73 6b 20 3d 20 28 70 43 73 72 2d 3e 66  emask = (pCsr->f
161a0 6c 61 67 73 20 26 20 43 55 52 53 4f 52 5f 49 47  lags & CURSOR_IG
161b0 4e 4f 52 45 5f 44 45 4c 45 54 45 29 20 3f 20 7e  NORE_DELETE) ? ~
161c0 28 30 29 20 3a 20 4c 53 4d 5f 53 59 53 54 45 4d  (0) : LSM_SYSTEM
161d0 4b 45 59 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  KEY;.    int res
161e0 20 3d 20 73 6f 72 74 65 64 44 62 4b 65 79 43 6f   = sortedDbKeyCo
161f0 6d 70 61 72 65 28 70 43 73 72 2c 0a 20 20 20 20  mpare(pCsr,.    
16200 20 20 65 4e 65 77 54 79 70 65 20 26 20 74 79 70    eNewType & typ
16210 65 6d 61 73 6b 2c 20 70 4e 65 77 2c 20 6e 4e 65  emask, pNew, nNe
16220 77 2c 20 0a 20 20 20 20 20 20 70 43 73 72 2d 3e  w, .      pCsr->
16230 65 54 79 70 65 20 26 20 74 79 70 65 6d 61 73 6b  eType & typemask
16240 2c 20 70 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74  , pCsr->key.pDat
16250 61 2c 20 70 43 73 72 2d 3e 6b 65 79 2e 6e 44 61  a, pCsr->key.nDa
16260 74 61 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69  ta.    );..    i
16270 66 28 20 28 62 52 65 76 65 72 73 65 3d 3d 30 20  f( (bReverse==0 
16280 26 26 20 72 65 73 3c 3d 30 29 20 7c 7c 20 28 62  && res<=0) || (b
16290 52 65 76 65 72 73 65 21 3d 30 20 26 26 20 72 65  Reverse!=0 && re
162a0 73 3e 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72  s>=0) ){.      r
162b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
162c0 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f 72 43      multiCursorC
162d0 61 63 68 65 4b 65 79 28 70 43 73 72 2c 20 70 52  acheKey(pCsr, pR
162e0 63 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  c);.    assert( 
162f0 70 43 73 72 2d 3e 65 54 79 70 65 3d 3d 65 4e 65  pCsr->eType==eNe
16300 77 54 79 70 65 20 29 3b 0a 0a 20 20 20 20 2f 2a  wType );..    /*
16310 20 49 66 20 74 68 69 73 20 63 75 72 73 6f 72 20   If this cursor 
16320 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
16330 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20 6b 65   skip deleted ke
16340 79 73 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  ys, and the curr
16350 65 6e 74 0a 20 20 20 20 2a 2a 20 63 75 72 73 6f  ent.    ** curso
16360 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 53 4f  r points to a SO
16370 52 54 45 44 5f 44 45 4c 45 54 45 20 65 6e 74 72  RTED_DELETE entr
16380 79 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  y, then the curs
16390 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  or has not been 
163a0 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66  .    ** successf
163b0 75 6c 6c 79 20 61 64 76 61 6e 63 65 64 2e 20 20  ully advanced.  
163c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
163d0 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65  imilarly, if the
163e0 20 63 75 72 73 6f 72 20 69 73 20 63 6f 6e 66 69   cursor is confi
163f0 67 75 72 65 64 20 74 6f 20 73 6b 69 70 20 73 79  gured to skip sy
16400 73 74 65 6d 20 6b 65 79 73 20 61 6e 64 20 74 68  stem keys and th
16410 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
16420 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74   cursor points t
16430 6f 20 61 20 73 79 73 74 65 6d 20 6b 65 79 2c 20  o a system key, 
16440 69 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  it has not yet b
16450 65 65 6e 20 61 64 76 61 6e 63 65 64 2e 0a 20 20  een advanced..  
16460 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 2a 70 52    */.    if( *pR
16470 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 30 3d 3d  c==LSM_OK && 0==
16480 6d 63 75 72 73 6f 72 4c 6f 63 61 74 69 6f 6e 4f  mcursorLocationO
16490 6b 28 70 43 73 72 2c 20 30 29 20 29 20 72 65 74  k(pCsr, 0) ) ret
164a0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
164b0 75 72 6e 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 1;.}..static
164c0 20 76 6f 69 64 20 66 6c 43 73 72 41 64 76 61 6e   void flCsrAdvan
164d0 63 65 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  ce(MultiCursor *
164e0 70 43 73 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCsr){.  assert(
164f0 20 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 43   pCsr->flags & C
16500 55 52 53 4f 52 5f 46 4c 55 53 48 5f 46 52 45 45  URSOR_FLUSH_FREE
16510 4c 49 53 54 20 29 3b 0a 20 20 69 66 28 20 70 43  LIST );.  if( pC
16520 73 72 2d 3e 69 46 72 65 65 20 25 20 32 20 29 7b  sr->iFree % 2 ){
16530 0a 20 20 20 20 70 43 73 72 2d 3e 69 46 72 65 65  .    pCsr->iFree
16540 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
16550 20 69 6e 74 20 6e 45 6e 74 72 79 20 3d 20 70 43   int nEntry = pC
16560 73 72 2d 3e 70 44 62 2d 3e 70 57 6f 72 6b 65 72  sr->pDb->pWorker
16570 2d 3e 66 72 65 65 6c 69 73 74 2e 6e 45 6e 74 72  ->freelist.nEntr
16580 79 3b 0a 20 20 20 20 46 72 65 65 6c 69 73 74 45  y;.    FreelistE
16590 6e 74 72 79 20 2a 61 45 6e 74 72 79 20 3d 20 70  ntry *aEntry = p
165a0 43 73 72 2d 3e 70 44 62 2d 3e 70 57 6f 72 6b 65  Csr->pDb->pWorke
165b0 72 2d 3e 66 72 65 65 6c 69 73 74 2e 61 45 6e 74  r->freelist.aEnt
165c0 72 79 3b 0a 0a 20 20 20 20 69 6e 74 20 69 20 3d  ry;..    int i =
165d0 20 6e 45 6e 74 72 79 20 2d 20 31 20 2d 20 28 70   nEntry - 1 - (p
165e0 43 73 72 2d 3e 69 46 72 65 65 20 2f 20 32 29 3b  Csr->iFree / 2);
165f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
16600 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69 73  current entry is
16610 20 61 20 64 65 6c 65 74 65 20 61 6e 64 20 74 68   a delete and th
16620 65 20 22 65 6e 64 2d 64 65 6c 65 74 65 22 20 6b  e "end-delete" k
16630 65 79 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20  ey will not.    
16640 2a 2a 20 62 65 20 61 74 74 61 63 68 65 64 20 74  ** be attached t
16650 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
16660 2c 20 69 6e 63 72 65 6d 65 6e 74 20 69 46 72 65  , increment iFre
16670 65 20 62 79 20 31 20 6f 6e 6c 79 2e 20 2a 2f 0a  e by 1 only. */.
16680 20 20 20 20 69 66 28 20 61 45 6e 74 72 79 5b 69      if( aEntry[i
16690 5d 2e 69 49 64 3c 30 20 29 7b 0a 20 20 20 20 20  ].iId<0 ){.     
166a0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
166b0 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 7c 7c       if( i==0 ||
166c0 20 61 45 6e 74 72 79 5b 69 2d 31 5d 2e 69 42 6c   aEntry[i-1].iBl
166d0 6b 21 3d 61 45 6e 74 72 79 5b 69 5d 2e 69 42 6c  k!=aEntry[i].iBl
166e0 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
166f0 20 70 43 73 72 2d 3e 69 46 72 65 65 2d 2d 3b 0a   pCsr->iFree--;.
16700 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
16710 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16720 20 20 20 69 66 28 20 61 45 6e 74 72 79 5b 69 2d     if( aEntry[i-
16730 31 5d 2e 69 49 64 3e 3d 30 20 29 20 62 72 65 61  1].iId>=0 ) brea
16740 6b 3b 0a 20 20 20 20 20 20 20 20 70 43 73 72 2d  k;.        pCsr-
16750 3e 69 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 20  >iFree += 2;.   
16760 20 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20       i--;.      
16770 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 73 72  }.    }.    pCsr
16780 2d 3e 69 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->iFree += 2;.  
16790 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  }.}..static int 
167a0 6d 75 6c 74 69 43 75 72 73 6f 72 41 64 76 61 6e  multiCursorAdvan
167b0 63 65 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  ce(MultiCursor *
167c0 70 43 73 72 2c 20 69 6e 74 20 62 52 65 76 65 72  pCsr, int bRever
167d0 73 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  se){.  int rc = 
167e0 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  LSM_OK;         
167f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
16800 20 43 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 6c   Code */.  if( l
16810 73 6d 4d 43 75 72 73 6f 72 56 61 6c 69 64 28 70  smMCursorValid(p
16820 43 73 72 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b  Csr) ){.    do {
16830 0a 20 20 20 20 20 20 69 6e 74 20 69 4b 65 79 20  .      int iKey 
16840 3d 20 70 43 73 72 2d 3e 61 54 72 65 65 5b 31 5d  = pCsr->aTree[1]
16850 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 43  ;..      assertC
16860 75 72 73 6f 72 54 72 65 65 28 70 43 73 72 29 3b  ursorTree(pCsr);
16870 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
16880 69 73 20 6d 75 6c 74 69 2d 63 75 72 73 6f 72 20  is multi-cursor 
16890 69 73 20 61 64 76 61 6e 63 69 6e 67 20 66 6f 72  is advancing for
168a0 77 61 72 64 73 2c 20 61 6e 64 20 74 68 65 20 73  wards, and the s
168b0 75 62 2d 63 75 72 73 6f 72 0a 20 20 20 20 20 20  ub-cursor.      
168c0 2a 2a 20 62 65 69 6e 67 20 61 64 76 61 6e 63 65  ** being advance
168d0 64 20 69 73 20 74 68 65 20 6f 6e 65 20 74 68 61  d is the one tha
168e0 74 20 73 65 70 61 72 61 74 6f 72 20 6b 65 79 73  t separator keys
168f0 20 6d 61 79 20 62 65 20 62 65 69 6e 67 20 72 65   may be being re
16900 61 64 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ad.      ** from
16910 2c 20 72 65 63 6f 72 64 20 74 68 65 20 63 75 72  , record the cur
16920 72 65 6e 74 20 61 62 73 6f 6c 75 74 65 20 70 6f  rent absolute po
16930 69 6e 74 65 72 20 76 61 6c 75 65 2e 20 20 2a 2f  inter value.  */
16940 0a 20 20 20 20 20 20 69 66 28 20 70 43 73 72 2d  .      if( pCsr-
16950 3e 70 50 72 65 76 4d 65 72 67 65 50 74 72 20 29  >pPrevMergePtr )
16960 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4b  {.        if( iK
16970 65 79 3d 3d 28 43 55 52 53 4f 52 5f 44 41 54 41  ey==(CURSOR_DATA
16980 5f 53 45 47 4d 45 4e 54 2b 70 43 73 72 2d 3e 6e  _SEGMENT+pCsr->n
16990 50 74 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Ptr) ){.        
169a0 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
169b0 70 42 74 43 73 72 20 29 3b 0a 20 20 20 20 20 20  pBtCsr );.      
169c0 20 20 20 20 2a 70 43 73 72 2d 3e 70 50 72 65 76      *pCsr->pPrev
169d0 4d 65 72 67 65 50 74 72 20 3d 20 70 43 73 72 2d  MergePtr = pCsr-
169e0 3e 70 42 74 43 73 72 2d 3e 69 50 74 72 3b 0a 20  >pBtCsr->iPtr;. 
169f0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
16a00 20 70 43 73 72 2d 3e 70 42 74 43 73 72 3d 3d 30   pCsr->pBtCsr==0
16a10 20 26 26 20 70 43 73 72 2d 3e 6e 50 74 72 3e 30   && pCsr->nPtr>0
16a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16a30 26 26 20 69 4b 65 79 3d 3d 28 43 55 52 53 4f 52  && iKey==(CURSOR
16a40 5f 44 41 54 41 5f 53 45 47 4d 45 4e 54 2b 70 43  _DATA_SEGMENT+pC
16a50 73 72 2d 3e 6e 50 74 72 2d 31 29 20 0a 20 20 20  sr->nPtr-1) .   
16a60 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
16a70 20 20 53 65 67 6d 65 6e 74 50 74 72 20 2a 70 50    SegmentPtr *pP
16a80 74 72 20 3d 20 26 70 43 73 72 2d 3e 61 50 74 72  tr = &pCsr->aPtr
16a90 5b 69 4b 65 79 2d 43 55 52 53 4f 52 5f 44 41 54  [iKey-CURSOR_DAT
16aa0 41 5f 53 45 47 4d 45 4e 54 5d 3b 0a 20 20 20 20  A_SEGMENT];.    
16ab0 20 20 20 20 20 20 2a 70 43 73 72 2d 3e 70 50 72        *pCsr->pPr
16ac0 65 76 4d 65 72 67 65 50 74 72 20 3d 20 70 50 74  evMergePtr = pPt
16ad0 72 2d 3e 69 50 74 72 2b 70 50 74 72 2d 3e 69 50  r->iPtr+pPtr->iP
16ae0 67 50 74 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gPtr;.        }.
16af0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
16b00 66 28 20 69 4b 65 79 3d 3d 43 55 52 53 4f 52 5f  f( iKey==CURSOR_
16b10 44 41 54 41 5f 54 52 45 45 30 20 7c 7c 20 69 4b  DATA_TREE0 || iK
16b20 65 79 3d 3d 43 55 52 53 4f 52 5f 44 41 54 41 5f  ey==CURSOR_DATA_
16b30 54 52 45 45 31 20 29 7b 0a 20 20 20 20 20 20 20  TREE1 ){.       
16b40 20 54 72 65 65 43 75 72 73 6f 72 20 2a 70 54 72   TreeCursor *pTr
16b50 65 65 43 73 72 20 3d 20 70 43 73 72 2d 3e 61 70  eeCsr = pCsr->ap
16b60 54 72 65 65 43 73 72 5b 69 4b 65 79 2d 43 55 52  TreeCsr[iKey-CUR
16b70 53 4f 52 5f 44 41 54 41 5f 54 52 45 45 30 5d 3b  SOR_DATA_TREE0];
16b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 52 65  .        if( bRe
16b90 76 65 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20  verse ){.       
16ba0 20 20 20 72 63 20 3d 20 6c 73 6d 54 72 65 65 43     rc = lsmTreeC
16bb0 75 72 73 6f 72 50 72 65 76 28 70 54 72 65 65 43  ursorPrev(pTreeC
16bc0 73 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  sr);.        }el
16bd0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
16be0 20 3d 20 6c 73 6d 54 72 65 65 43 75 72 73 6f 72   = lsmTreeCursor
16bf0 4e 65 78 74 28 70 54 72 65 65 43 73 72 29 3b 0a  Next(pTreeCsr);.
16c00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16c10 7d 65 6c 73 65 20 69 66 28 20 69 4b 65 79 3d 3d  }else if( iKey==
16c20 43 55 52 53 4f 52 5f 44 41 54 41 5f 53 59 53 54  CURSOR_DATA_SYST
16c30 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  EM ){.        as
16c40 73 65 72 74 28 20 70 43 73 72 2d 3e 66 6c 61 67  sert( pCsr->flag
16c50 73 20 26 20 43 55 52 53 4f 52 5f 46 4c 55 53 48  s & CURSOR_FLUSH
16c60 5f 46 52 45 45 4c 49 53 54 20 29 3b 0a 20 20 20  _FREELIST );.   
16c70 20 20 20 20 20 61 73 73 65 72 74 28 20 62 52 65       assert( bRe
16c80 76 65 72 73 65 3d 3d 30 20 29 3b 0a 20 20 20 20  verse==0 );.    
16c90 20 20 20 20 66 6c 43 73 72 41 64 76 61 6e 63 65      flCsrAdvance
16ca0 28 70 43 73 72 29 3b 0a 20 20 20 20 20 20 7d 65  (pCsr);.      }e
16cb0 6c 73 65 20 69 66 28 20 69 4b 65 79 3d 3d 28 43  lse if( iKey==(C
16cc0 55 52 53 4f 52 5f 44 41 54 41 5f 53 45 47 4d 45  URSOR_DATA_SEGME
16cd0 4e 54 2b 70 43 73 72 2d 3e 6e 50 74 72 29 20 29  NT+pCsr->nPtr) )
16ce0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
16cf0 28 20 62 52 65 76 65 72 73 65 3d 3d 30 20 26 26  ( bReverse==0 &&
16d00 20 70 43 73 72 2d 3e 70 42 74 43 73 72 20 29 3b   pCsr->pBtCsr );
16d10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
16d20 72 65 65 43 75 72 73 6f 72 4e 65 78 74 28 70 43  reeCursorNext(pC
16d30 73 72 2d 3e 70 42 74 43 73 72 29 3b 0a 20 20 20  sr->pBtCsr);.   
16d40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16d50 20 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 43 75    rc = segmentCu
16d60 72 73 6f 72 41 64 76 61 6e 63 65 28 70 43 73 72  rsorAdvance(pCsr
16d70 2c 20 69 4b 65 79 2d 43 55 52 53 4f 52 5f 44 41  , iKey-CURSOR_DA
16d80 54 41 5f 53 45 47 4d 45 4e 54 2c 20 62 52 65 76  TA_SEGMENT, bRev
16d90 65 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  erse);.      }. 
16da0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d       if( rc==LSM
16db0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
16dc0 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
16dd0 72 28 69 3d 28 69 4b 65 79 2b 70 43 73 72 2d 3e  r(i=(iKey+pCsr->
16de0 6e 54 72 65 65 29 2f 32 3b 20 69 3e 30 3b 20 69  nTree)/2; i>0; i
16df0 3d 69 2f 32 29 7b 0a 20 20 20 20 20 20 20 20 20  =i/2){.         
16e00 20 6d 75 6c 74 69 43 75 72 73 6f 72 44 6f 43 6f   multiCursorDoCo
16e10 6d 70 61 72 65 28 70 43 73 72 2c 20 69 2c 20 62  mpare(pCsr, i, b
16e20 52 65 76 65 72 73 65 29 3b 0a 20 20 20 20 20 20  Reverse);.      
16e30 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
16e40 72 74 43 75 72 73 6f 72 54 72 65 65 28 70 43 73  rtCursorTree(pCs
16e50 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
16e60 7d 77 68 69 6c 65 28 20 6d 63 75 72 73 6f 72 41  }while( mcursorA
16e70 64 76 61 6e 63 65 4f 6b 28 70 43 73 72 2c 20 62  dvanceOk(pCsr, b
16e80 52 65 76 65 72 73 65 2c 20 26 72 63 29 3d 3d 30  Reverse, &rc)==0
16e90 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
16ea0 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 4d   rc;.}..int lsmM
16eb0 43 75 72 73 6f 72 4e 65 78 74 28 4d 75 6c 74 69  CursorNext(Multi
16ec0 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b 0a 20  Cursor *pCsr){. 
16ed0 20 69 66 28 20 28 70 43 73 72 2d 3e 66 6c 61 67   if( (pCsr->flag
16ee0 73 20 26 20 43 55 52 53 4f 52 5f 4e 45 58 54 5f  s & CURSOR_NEXT_
16ef0 4f 4b 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  OK)==0 ) return 
16f00 4c 53 4d 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  LSM_MISUSE_BKPT;
16f10 0a 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 43  .  return multiC
16f20 75 72 73 6f 72 41 64 76 61 6e 63 65 28 70 43 73  ursorAdvance(pCs
16f30 72 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 6c 73  r, 0);.}..int ls
16f40 6d 4d 43 75 72 73 6f 72 50 72 65 76 28 4d 75 6c  mMCursorPrev(Mul
16f50 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 29 7b  tiCursor *pCsr){
16f60 0a 20 20 69 66 28 20 28 70 43 73 72 2d 3e 66 6c  .  if( (pCsr->fl
16f70 61 67 73 20 26 20 43 55 52 53 4f 52 5f 50 52 45  ags & CURSOR_PRE
16f80 56 5f 4f 4b 29 3d 3d 30 20 29 20 72 65 74 75 72  V_OK)==0 ) retur
16f90 6e 20 4c 53 4d 5f 4d 49 53 55 53 45 5f 42 4b 50  n LSM_MISUSE_BKP
16fa0 54 3b 0a 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  T;.  return mult
16fb0 69 43 75 72 73 6f 72 41 64 76 61 6e 63 65 28 70  iCursorAdvance(p
16fc0 43 73 72 2c 20 31 29 3b 0a 7d 0a 0a 69 6e 74 20  Csr, 1);.}..int 
16fd0 6c 73 6d 4d 43 75 72 73 6f 72 4b 65 79 28 4d 75  lsmMCursorKey(Mu
16fe0 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  ltiCursor *pCsr,
16ff0 20 76 6f 69 64 20 2a 2a 70 70 4b 65 79 2c 20 69   void **ppKey, i
17000 6e 74 20 2a 70 6e 4b 65 79 29 7b 0a 20 20 69 66  nt *pnKey){.  if
17010 28 20 28 70 43 73 72 2d 3e 66 6c 61 67 73 20 26  ( (pCsr->flags &
17020 20 43 55 52 53 4f 52 5f 53 45 45 4b 5f 45 51 29   CURSOR_SEEK_EQ)
17030 20 7c 7c 20 70 43 73 72 2d 3e 61 54 72 65 65 3d   || pCsr->aTree=
17040 3d 30 20 29 7b 0a 20 20 20 20 2a 70 6e 4b 65 79  =0 ){.    *pnKey
17050 20 3d 20 70 43 73 72 2d 3e 6b 65 79 2e 6e 44 61   = pCsr->key.nDa
17060 74 61 3b 0a 20 20 20 20 2a 70 70 4b 65 79 20 3d  ta;.    *ppKey =
17070 20 70 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74 61   pCsr->key.pData
17080 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
17090 6e 74 20 69 4b 65 79 20 3d 20 70 43 73 72 2d 3e  nt iKey = pCsr->
170a0 61 54 72 65 65 5b 31 5d 3b 0a 0a 20 20 20 20 69  aTree[1];..    i
170b0 66 28 20 69 4b 65 79 3d 3d 43 55 52 53 4f 52 5f  f( iKey==CURSOR_
170c0 44 41 54 41 5f 54 52 45 45 30 20 7c 7c 20 69 4b  DATA_TREE0 || iK
170d0 65 79 3d 3d 43 55 52 53 4f 52 5f 44 41 54 41 5f  ey==CURSOR_DATA_
170e0 54 52 45 45 31 20 29 7b 0a 20 20 20 20 20 20 54  TREE1 ){.      T
170f0 72 65 65 43 75 72 73 6f 72 20 2a 70 54 72 65 65  reeCursor *pTree
17100 43 73 72 20 3d 20 70 43 73 72 2d 3e 61 70 54 72  Csr = pCsr->apTr
17110 65 65 43 73 72 5b 69 4b 65 79 2d 43 55 52 53 4f  eeCsr[iKey-CURSO
17120 52 5f 44 41 54 41 5f 54 52 45 45 30 5d 3b 0a 20  R_DATA_TREE0];. 
17130 20 20 20 20 20 6c 73 6d 54 72 65 65 43 75 72 73       lsmTreeCurs
17140 6f 72 4b 65 79 28 70 54 72 65 65 43 73 72 2c 20  orKey(pTreeCsr, 
17150 30 2c 20 70 70 4b 65 79 2c 20 70 6e 4b 65 79 29  0, ppKey, pnKey)
17160 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17170 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 0a 23 69     int nKey;..#i
17180 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
17190 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20     void *pKey;. 
171a0 20 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a       int eType;.
171b0 20 20 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f        multiCurso
171c0 72 47 65 74 4b 65 79 28 70 43 73 72 2c 20 69 4b  rGetKey(pCsr, iK
171d0 65 79 2c 20 26 65 54 79 70 65 2c 20 26 70 4b 65  ey, &eType, &pKe
171e0 79 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 20  y, &nKey);.     
171f0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
17200 70 43 73 72 2d 3e 65 54 79 70 65 20 29 3b 0a 20  pCsr->eType );. 
17210 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65       assert( nKe
17220 79 3d 3d 70 43 73 72 2d 3e 6b 65 79 2e 6e 44 61  y==pCsr->key.nDa
17230 74 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ta );.      asse
17240 72 74 28 20 6d 65 6d 63 6d 70 28 70 4b 65 79 2c  rt( memcmp(pKey,
17250 20 70 43 73 72 2d 3e 6b 65 79 2e 70 44 61 74 61   pCsr->key.pData
17260 2c 20 6e 4b 65 79 29 3d 3d 30 20 29 3b 0a 23 65  , nKey)==0 );.#e
17270 6e 64 69 66 0a 0a 20 20 20 20 20 20 6e 4b 65 79  ndif..      nKey
17280 20 3d 20 70 43 73 72 2d 3e 6b 65 79 2e 6e 44 61   = pCsr->key.nDa
17290 74 61 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4b  ta;.      if( nK
172a0 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
172b0 20 2a 70 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20   *ppKey = 0;.   
172c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
172d0 20 20 2a 70 70 4b 65 79 20 3d 20 70 43 73 72 2d    *ppKey = pCsr-
172e0 3e 6b 65 79 2e 70 44 61 74 61 3b 0a 20 20 20 20  >key.pData;.    
172f0 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 4b 65 79    }.      *pnKey
17300 20 3d 20 6e 4b 65 79 3b 20 0a 20 20 20 20 7d 0a   = nKey; .    }.
17310 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d    }.  return LSM
17320 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
17330 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e  mpare the curren
17340 74 20 6b 65 79 20 74 68 61 74 20 63 75 72 73 6f  t key that curso
17350 72 20 63 73 72 20 70 6f 69 6e 74 73 20 74 6f 20  r csr points to 
17360 77 69 74 68 20 70 4b 65 79 2f 6e 4b 65 79 2e 20  with pKey/nKey. 
17370 53 65 74 0a 2a 2a 20 2a 70 69 52 65 73 20 74 6f  Set.** *piRes to
17380 20 74 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20   the result and 
17390 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 2e 0a 2a  return LSM_OK..*
173a0 2f 0a 69 6e 74 20 6c 73 6d 5f 63 73 72 5f 63 6d  /.int lsm_csr_cm
173b0 70 28 6c 73 6d 5f 63 75 72 73 6f 72 20 2a 63 73  p(lsm_cursor *cs
173c0 72 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  r, const void *p
173d0 4b 65 79 2c 20 69 6e 74 20 6e 4b 65 79 2c 20 69  Key, int nKey, i
173e0 6e 74 20 2a 70 69 52 65 73 29 7b 0a 20 20 4d 75  nt *piRes){.  Mu
173f0 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 20  ltiCursor *pCsr 
17400 3d 20 28 4d 75 6c 74 69 43 75 72 73 6f 72 20 2a  = (MultiCursor *
17410 29 63 73 72 3b 0a 20 20 76 6f 69 64 20 2a 70 43  )csr;.  void *pC
17420 73 72 6b 65 79 3b 20 69 6e 74 20 6e 43 73 72 6b  srkey; int nCsrk
17430 65 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ey;.  int rc;.  
17440 72 63 20 3d 20 6c 73 6d 4d 43 75 72 73 6f 72 4b  rc = lsmMCursorK
17450 65 79 28 70 43 73 72 2c 20 26 70 43 73 72 6b 65  ey(pCsr, &pCsrke
17460 79 2c 20 26 6e 43 73 72 6b 65 79 29 3b 0a 20 20  y, &nCsrkey);.  
17470 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  if( rc==LSM_OK )
17480 7b 0a 20 20 20 20 69 6e 74 20 28 2a 78 43 6d 70  {.    int (*xCmp
17490 29 28 76 6f 69 64 20 2a 2c 20 69 6e 74 2c 20 76  )(void *, int, v
174a0 6f 69 64 20 2a 2c 20 69 6e 74 29 20 3d 20 70 43  oid *, int) = pC
174b0 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70 3b 0a 20  sr->pDb->xCmp;. 
174c0 20 20 20 2a 70 69 52 65 73 20 3d 20 73 6f 72 74     *piRes = sort
174d0 65 64 4b 65 79 43 6f 6d 70 61 72 65 28 78 43 6d  edKeyCompare(xCm
174e0 70 2c 20 30 2c 20 70 43 73 72 6b 65 79 2c 20 6e  p, 0, pCsrkey, n
174f0 43 73 72 6b 65 79 2c 20 30 2c 20 28 76 6f 69 64  Csrkey, 0, (void
17500 20 2a 29 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a   *)pKey, nKey);.
17510 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17520 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 4d 43 75 72 73  .}..int lsmMCurs
17530 6f 72 56 61 6c 75 65 28 4d 75 6c 74 69 43 75 72  orValue(MultiCur
17540 73 6f 72 20 2a 70 43 73 72 2c 20 76 6f 69 64 20  sor *pCsr, void 
17550 2a 2a 70 70 56 61 6c 2c 20 69 6e 74 20 2a 70 6e  **ppVal, int *pn
17560 56 61 6c 29 7b 0a 20 20 76 6f 69 64 20 2a 70 56  Val){.  void *pV
17570 61 6c 3b 0a 20 20 69 6e 74 20 6e 56 61 6c 3b 0a  al;.  int nVal;.
17580 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
17590 28 70 43 73 72 2d 3e 66 6c 61 67 73 20 26 20 43  (pCsr->flags & C
175a0 55 52 53 4f 52 5f 53 45 45 4b 5f 45 51 29 20 7c  URSOR_SEEK_EQ) |
175b0 7c 20 70 43 73 72 2d 3e 61 54 72 65 65 3d 3d 30  | pCsr->aTree==0
175c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 4c 53 4d   ){.    rc = LSM
175d0 5f 4f 4b 3b 0a 20 20 20 20 6e 56 61 6c 20 3d 20  _OK;.    nVal = 
175e0 70 43 73 72 2d 3e 76 61 6c 2e 6e 44 61 74 61 3b  pCsr->val.nData;
175f0 0a 20 20 20 20 70 56 61 6c 20 3d 20 70 43 73 72  .    pVal = pCsr
17600 2d 3e 76 61 6c 2e 70 44 61 74 61 3b 0a 20 20 7d  ->val.pData;.  }
17610 65 6c 73 65 7b 0a 0a 20 20 20 20 61 73 73 65 72  else{..    asser
17620 74 28 20 70 43 73 72 2d 3e 61 54 72 65 65 20 29  t( pCsr->aTree )
17630 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 63  ;.    assert( mc
17640 75 72 73 6f 72 4c 6f 63 61 74 69 6f 6e 4f 6b 28  ursorLocationOk(
17650 70 43 73 72 2c 20 28 70 43 73 72 2d 3e 66 6c 61  pCsr, (pCsr->fla
17660 67 73 20 26 20 43 55 52 53 4f 52 5f 49 47 4e 4f  gs & CURSOR_IGNO
17670 52 45 5f 44 45 4c 45 54 45 29 29 20 29 3b 0a 0a  RE_DELETE)) );..
17680 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75      rc = multiCu
17690 72 73 6f 72 47 65 74 56 61 6c 28 70 43 73 72 2c  rsorGetVal(pCsr,
176a0 20 70 43 73 72 2d 3e 61 54 72 65 65 5b 31 5d 2c   pCsr->aTree[1],
176b0 20 26 70 56 61 6c 2c 20 26 6e 56 61 6c 29 3b 0a   &pVal, &nVal);.
176c0 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26 20      if( pVal && 
176d0 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
176e0 20 20 20 20 72 63 20 3d 20 73 6f 72 74 65 64 42      rc = sortedB
176f0 6c 6f 62 53 65 74 28 70 43 73 72 2d 3e 70 44 62  lobSet(pCsr->pDb
17700 2d 3e 70 45 6e 76 2c 20 26 70 43 73 72 2d 3e 76  ->pEnv, &pCsr->v
17710 61 6c 2c 20 70 56 61 6c 2c 20 6e 56 61 6c 29 3b  al, pVal, nVal);
17720 0a 20 20 20 20 20 20 70 56 61 6c 20 3d 20 70 43  .      pVal = pC
17730 73 72 2d 3e 76 61 6c 2e 70 44 61 74 61 3b 0a 20  sr->val.pData;. 
17740 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
17750 21 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=LSM_OK ){.    
17760 20 20 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20    pVal = 0;.    
17770 20 20 6e 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20    nVal = 0;.    
17780 7d 0a 20 20 7d 0a 20 20 2a 70 70 56 61 6c 20 3d  }.  }.  *ppVal =
17790 20 70 56 61 6c 3b 0a 20 20 2a 70 6e 56 61 6c 20   pVal;.  *pnVal 
177a0 3d 20 6e 56 61 6c 3b 0a 20 20 72 65 74 75 72 6e  = nVal;.  return
177b0 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 4d   rc;.}..int lsmM
177c0 43 75 72 73 6f 72 54 79 70 65 28 4d 75 6c 74 69  CursorType(Multi
177d0 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 69 6e  Cursor *pCsr, in
177e0 74 20 2a 70 65 54 79 70 65 29 7b 0a 20 20 61 73  t *peType){.  as
177f0 73 65 72 74 28 20 70 43 73 72 2d 3e 61 54 72 65  sert( pCsr->aTre
17800 65 20 29 3b 0a 20 20 6d 75 6c 74 69 43 75 72 73  e );.  multiCurs
17810 6f 72 47 65 74 4b 65 79 28 70 43 73 72 2c 20 70  orGetKey(pCsr, p
17820 43 73 72 2d 3e 61 54 72 65 65 5b 31 5d 2c 20 70  Csr->aTree[1], p
17830 65 54 79 70 65 2c 20 30 2c 20 30 29 3b 0a 20 20  eType, 0, 0);.  
17840 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d  return LSM_OK;.}
17850 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61  ../*.** Buffer a
17860 44 61 74 61 5b 5d 2c 20 73 69 7a 65 20 6e 44 61  Data[], size nDa
17870 74 61 2c 20 69 73 20 61 73 73 75 6d 65 64 20 74  ta, is assumed t
17880 6f 20 63 6f 6e 74 61 69 6e 20 61 20 76 61 6c 69  o contain a vali
17890 64 20 62 2d 74 72 65 65 20 0a 2a 2a 20 68 69 65  d b-tree .** hie
178a0 72 61 72 63 68 79 20 70 61 67 65 20 69 6d 61 67  rarchy page imag
178b0 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  e. Return the of
178c0 66 73 65 74 20 69 6e 20 61 44 61 74 61 5b 5d 20  fset in aData[] 
178d0 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
178e0 0a 2a 2a 20 62 79 74 65 20 69 6e 20 74 68 65 20  .** byte in the 
178f0 64 61 74 61 20 61 72 65 61 20 28 77 68 65 72 65  data area (where
17900 20 61 20 6e 65 77 20 63 65 6c 6c 20 6d 61 79 20   a new cell may 
17910 62 65 20 77 72 69 74 74 65 6e 20 69 66 20 74 68  be written if th
17920 65 72 65 20 69 73 0a 2a 2a 20 73 70 61 63 65 29  ere is.** space)
17930 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17940 6d 65 72 67 65 57 6f 72 6b 65 72 50 61 67 65 4f  mergeWorkerPageO
17950 66 66 73 65 74 28 75 38 20 2a 61 44 61 74 61 2c  ffset(u8 *aData,
17960 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 69   int nData){.  i
17970 6e 74 20 6e 52 65 63 3b 0a 20 20 69 6e 74 20 69  nt nRec;.  int i
17980 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b  Off;.  int nKey;
17990 0a 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20  .  int eType;.. 
179a0 20 6e 52 65 63 20 3d 20 6c 73 6d 47 65 74 55 31   nRec = lsmGetU1
179b0 36 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54  6(&aData[SEGMENT
179c0 5f 4e 52 45 43 4f 52 44 5f 4f 46 46 53 45 54 28  _NRECORD_OFFSET(
179d0 6e 44 61 74 61 29 5d 29 3b 0a 20 20 69 4f 66 66  nData)]);.  iOff
179e0 20 3d 20 6c 73 6d 47 65 74 55 31 36 28 26 61 44   = lsmGetU16(&aD
179f0 61 74 61 5b 53 45 47 4d 45 4e 54 5f 43 45 4c 4c  ata[SEGMENT_CELL
17a00 50 54 52 5f 4f 46 46 53 45 54 28 6e 44 61 74 61  PTR_OFFSET(nData
17a10 2c 20 6e 52 65 63 2d 31 29 5d 29 3b 0a 20 20 65  , nRec-1)]);.  e
17a20 54 79 70 65 20 3d 20 61 44 61 74 61 5b 69 4f 66  Type = aData[iOf
17a30 66 2b 2b 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  f++];.  assert( 
17a40 65 54 79 70 65 3d 3d 30 20 0a 20 20 20 20 20 20  eType==0 .      
17a50 20 7c 7c 20 65 54 79 70 65 3d 3d 28 4c 53 4d 5f   || eType==(LSM_
17a60 53 59 53 54 45 4d 4b 45 59 7c 4c 53 4d 5f 53 45  SYSTEMKEY|LSM_SE
17a70 50 41 52 41 54 4f 52 29 20 0a 20 20 20 20 20 20  PARATOR) .      
17a80 20 7c 7c 20 65 54 79 70 65 3d 3d 28 4c 53 4d 5f   || eType==(LSM_
17a90 53 45 50 41 52 41 54 4f 52 29 0a 20 20 29 3b 0a  SEPARATOR).  );.
17aa0 0a 20 20 69 4f 66 66 20 2b 3d 20 6c 73 6d 56 61  .  iOff += lsmVa
17ab0 72 69 6e 74 47 65 74 33 32 28 26 61 44 61 74 61  rintGet32(&aData
17ac0 5b 69 4f 66 66 5d 2c 20 26 6e 4b 65 79 29 3b 0a  [iOff], &nKey);.
17ad0 20 20 69 4f 66 66 20 2b 3d 20 6c 73 6d 56 61 72    iOff += lsmVar
17ae0 69 6e 74 47 65 74 33 32 28 26 61 44 61 74 61 5b  intGet32(&aData[
17af0 69 4f 66 66 5d 2c 20 26 6e 4b 65 79 29 3b 0a 0a  iOff], &nKey);..
17b00 20 20 72 65 74 75 72 6e 20 69 4f 66 66 20 2b 20    return iOff + 
17b10 28 65 54 79 70 65 20 3f 20 6e 4b 65 79 20 3a 20  (eType ? nKey : 
17b20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 6c  0);.}../*.** Fol
17b30 6c 6f 77 69 6e 67 20 61 20 63 68 65 63 6b 70 6f  lowing a checkpo
17b40 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 64  int operation, d
17b50 61 74 61 62 61 73 65 20 70 61 67 65 73 20 74 68  atabase pages th
17b60 61 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 74  at are part of t
17b70 68 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  he.** checkpoint
17b80 65 64 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  ed state of the 
17b90 4c 53 4d 20 61 72 65 20 64 65 65 6d 65 64 20 72  LSM are deemed r
17ba0 65 61 64 2d 6f 6e 6c 79 2e 20 54 68 69 73 20 69  ead-only. This i
17bb0 6e 63 6c 75 64 65 73 20 74 68 65 0a 2a 2a 20 72  ncludes the.** r
17bc0 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 6f  ight-most page o
17bd0 66 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  f the b-tree hie
17be0 72 61 72 63 68 79 20 6f 66 20 61 6e 79 20 73 65  rarchy of any se
17bf0 70 61 72 61 74 6f 72 73 20 61 72 72 61 79 20 75  parators array u
17c00 6e 64 65 72 0a 2a 2a 20 63 6f 6e 73 74 72 75 63  nder.** construc
17c10 74 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 20 70 61  tion, and all pa
17c20 67 65 73 20 62 65 74 77 65 65 6e 20 69 74 20 61  ges between it a
17c30 6e 64 20 74 68 65 20 62 2d 74 72 65 65 20 72 6f  nd the b-tree ro
17c40 6f 74 2c 20 69 6e 63 6c 75 73 69 76 65 2e 0a 2a  ot, inclusive..*
17c50 2a 20 54 68 69 73 20 69 73 20 61 20 70 72 6f 62  * This is a prob
17c60 6c 65 6d 2c 20 61 73 20 77 68 65 6e 20 66 75 72  lem, as when fur
17c70 74 68 65 72 20 70 61 67 65 73 20 61 72 65 20 61  ther pages are a
17c80 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73  ppended to the s
17c90 65 70 61 72 61 74 6f 72 73 0a 2a 2a 20 61 72 72  eparators.** arr
17ca0 61 79 2c 20 65 6e 74 72 69 65 73 20 6d 75 73 74  ay, entries must
17cb0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
17cc0 20 69 6e 64 69 63 61 74 65 64 20 62 2d 74 72 65   indicated b-tre
17cd0 65 20 68 69 65 72 61 72 63 68 79 20 70 61 67 65  e hierarchy page
17ce0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  s..**.** This fu
17cf0 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 61 6c  nction copies al
17d00 6c 20 73 75 63 68 20 62 2d 74 72 65 65 20 70 61  l such b-tree pa
17d10 67 65 73 20 74 6f 20 6e 65 77 20 6c 6f 63 61 74  ges to new locat
17d20 69 6f 6e 73 2c 20 73 6f 20 74 68 61 74 0a 2a 2a  ions, so that.**
17d30 20 74 68 65 79 20 63 61 6e 20 62 65 20 6d 6f 64   they can be mod
17d40 69 66 69 65 64 20 61 73 20 72 65 71 75 69 72 65  ified as require
17d50 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6d  d..**.** The com
17d60 70 6c 69 63 61 74 69 6f 6e 20 69 73 20 74 68 61  plication is tha
17d70 74 20 6e 6f 74 20 61 6c 6c 20 64 61 74 61 62 61  t not all databa
17d80 73 65 20 70 61 67 65 73 20 61 72 65 20 74 68 65  se pages are the
17d90 20 73 61 6d 65 20 73 69 7a 65 20 2d 20 64 75 65   same size - due
17da0 0a 2a 2a 20 74 6f 20 74 68 65 20 77 61 79 20 74  .** to the way t
17db0 68 65 20 66 69 6c 65 2e 63 20 6d 6f 64 75 6c 65  he file.c module
17dc0 20 77 6f 72 6b 73 20 73 6f 6d 65 20 28 74 68 65   works some (the
17dd0 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20   first and last 
17de0 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 29 0a 2a  in each block).*
17df0 2a 20 61 72 65 20 34 20 62 79 74 65 73 20 73 6d  * are 4 bytes sm
17e00 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f  aller than the o
17e10 74 68 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thers..*/.static
17e20 20 69 6e 74 20 6d 65 72 67 65 57 6f 72 6b 65 72   int mergeWorker
17e30 4d 6f 76 65 48 69 65 72 61 72 63 68 79 28 0a 20  MoveHierarchy(. 
17e40 20 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d   MergeWorker *pM
17e50 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W,              
17e60 20 2f 2a 20 4d 65 72 67 65 20 77 6f 72 6b 65 72   /* Merge worker
17e70 20 2a 2f 0a 20 20 69 6e 74 20 62 53 65 70 20 20   */.  int bSep  
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
17ea0 72 20 73 65 70 61 72 61 74 6f 72 73 20 72 75 6e  r separators run
17eb0 20 2a 2f 0a 29 7b 0a 20 20 6c 73 6d 5f 64 62 20   */.){.  lsm_db 
17ec0 2a 70 44 62 20 3d 20 70 4d 57 2d 3e 70 44 62 3b  *pDb = pMW->pDb;
17ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
17ee0 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
17ef0 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b   int rc = LSM_OK
17f00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17f10 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
17f20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 50 61  */.  int i;.  Pa
17f30 67 65 20 2a 2a 61 70 48 69 65 72 20 3d 20 70 4d  ge **apHier = pM
17f40 57 2d 3e 68 69 65 72 2e 61 70 48 69 65 72 3b 0a  W->hier.apHier;.
17f50 20 20 69 6e 74 20 6e 48 69 65 72 20 3d 20 70 4d    int nHier = pM
17f60 57 2d 3e 68 69 65 72 2e 6e 48 69 65 72 3b 0a 0a  W->hier.nHier;..
17f70 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 4c    for(i=0; rc==L
17f80 53 4d 5f 4f 4b 20 26 26 20 69 3c 6e 48 69 65 72  SM_OK && i<nHier
17f90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65  ; i++){.    Page
17fa0 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
17fb0 72 63 20 3d 20 6c 73 6d 46 73 53 6f 72 74 65 64  rc = lsmFsSorted
17fc0 41 70 70 65 6e 64 28 70 44 62 2d 3e 70 46 53 2c  Append(pDb->pFS,
17fd0 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2c 20 70   pDb->pWorker, p
17fe0 4d 57 2d 3e 70 4c 65 76 65 6c 2c 20 31 2c 20 26  MW->pLevel, 1, &
17ff0 70 4e 65 77 29 3b 0a 20 20 20 20 61 73 73 65 72  pNew);.    asser
18000 74 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 3b  t( rc==LSM_OK );
18010 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53  ..    if( rc==LS
18020 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 38  M_OK ){.      u8
18030 20 2a 61 31 3b 20 69 6e 74 20 6e 31 3b 0a 20 20   *a1; int n1;.  
18040 20 20 20 20 75 38 20 2a 61 32 3b 20 69 6e 74 20      u8 *a2; int 
18050 6e 32 3b 0a 0a 20 20 20 20 20 20 61 31 20 3d 20  n2;..      a1 = 
18060 66 73 50 61 67 65 44 61 74 61 28 70 4e 65 77 2c  fsPageData(pNew,
18070 20 26 6e 31 29 3b 0a 20 20 20 20 20 20 61 32 20   &n1);.      a2 
18080 3d 20 66 73 50 61 67 65 44 61 74 61 28 61 70 48  = fsPageData(apH
18090 69 65 72 5b 69 5d 2c 20 26 6e 32 29 3b 0a 0a 20  ier[i], &n2);.. 
180a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 31 3d       assert( n1=
180b0 3d 6e 32 20 7c 7c 20 6e 31 2b 34 3d 3d 6e 32 20  =n2 || n1+4==n2 
180c0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 31  );..      if( n1
180d0 3d 3d 6e 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ==n2 ){.        
180e0 6d 65 6d 63 70 79 28 61 31 2c 20 61 32 2c 20 6e  memcpy(a1, a2, n
180f0 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
18100 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 45 6e  .        int nEn
18110 74 72 79 20 3d 20 70 61 67 65 47 65 74 4e 52 65  try = pageGetNRe
18120 63 28 61 32 2c 20 6e 32 29 3b 0a 20 20 20 20 20  c(a2, n2);.     
18130 20 20 20 69 6e 74 20 69 45 6f 66 31 20 3d 20 53     int iEof1 = S
18140 45 47 4d 45 4e 54 5f 45 4f 46 28 6e 31 2c 20 6e  EGMENT_EOF(n1, n
18150 45 6e 74 72 79 29 3b 0a 20 20 20 20 20 20 20 20  Entry);.        
18160 69 6e 74 20 69 45 6f 66 32 20 3d 20 53 45 47 4d  int iEof2 = SEGM
18170 45 4e 54 5f 45 4f 46 28 6e 32 2c 20 6e 45 6e 74  ENT_EOF(n2, nEnt
18180 72 79 29 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  ry);..        me
18190 6d 63 70 79 28 61 31 2c 20 61 32 2c 20 69 45 6f  mcpy(a1, a2, iEo
181a0 66 32 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 20  f2 - 4);.       
181b0 20 6d 65 6d 63 70 79 28 26 61 31 5b 69 45 6f 66   memcpy(&a1[iEof
181c0 31 5d 2c 20 26 61 32 5b 69 45 6f 66 32 5d 2c 20  1], &a2[iEof2], 
181d0 6e 32 20 2d 20 69 45 6f 66 32 29 3b 0a 20 20 20  n2 - iEof2);.   
181e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 6c 73 6d 46     }..      lsmF
181f0 73 50 61 67 65 52 65 6c 65 61 73 65 28 61 70 48  sPageRelease(apH
18200 69 65 72 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61  ier[i]);.      a
18210 70 48 69 65 72 5b 69 5d 20 3d 20 70 4e 65 77 3b  pHier[i] = pNew;
18220 0a 0a 23 69 66 20 30 0a 20 20 20 20 20 20 61 73  ..#if 0.      as
18230 73 65 72 74 28 20 6e 31 3d 3d 6e 32 20 7c 7c 20  sert( n1==n2 || 
18240 6e 31 2b 34 3d 3d 6e 32 20 7c 7c 20 6e 32 2b 34  n1+4==n2 || n2+4
18250 3d 3d 6e 31 20 29 3b 0a 20 20 20 20 20 20 69 66  ==n1 );.      if
18260 28 20 6e 31 3e 3d 6e 32 20 29 7b 0a 20 20 20 20  ( n1>=n2 ){.    
18270 20 20 20 20 2f 2a 20 49 66 20 6e 31 20 28 73 69      /* If n1 (si
18280 7a 65 20 6f 66 20 74 68 65 20 6e 65 77 20 70 61  ze of the new pa
18290 67 65 29 20 69 73 20 65 71 75 61 6c 20 74 6f 20  ge) is equal to 
182a0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
182b0 6e 32 20 28 74 68 65 0a 20 20 20 20 20 20 20 20  n2 (the.        
182c0 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  ** size of the o
182d0 6c 64 20 70 61 67 65 29 2c 20 74 68 65 6e 20 63  ld page), then c
182e0 6f 70 79 20 74 68 65 20 64 61 74 61 20 69 6e 74  opy the data int
182f0 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
18300 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 31  If.        ** n1
18310 3d 3d 6e 32 2c 20 74 68 69 73 20 63 6f 75 6c 64  ==n2, this could
18320 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 61 20   be done with a 
18330 73 69 6e 67 6c 65 20 6d 65 6d 63 70 79 28 29 2e  single memcpy().
18340 20 48 6f 77 65 76 65 72 2c 20 0a 20 20 20 20 20   However, .     
18350 20 20 20 2a 2a 20 73 69 6e 63 65 20 73 6f 6d 65     ** since some
18360 74 69 6d 65 73 20 6e 31 3e 6e 32 2c 20 74 68 65  times n1>n2, the
18370 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 6e   page content an
18380 64 20 66 6f 6f 74 65 72 20 6d 75 73 74 20 62 65  d footer must be
18390 20 63 6f 70 69 65 64 20 0a 20 20 20 20 20 20 20   copied .       
183a0 20 2a 2a 20 73 65 70 61 72 61 74 65 6c 79 2e 20   ** separately. 
183b0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  */.        int n
183c0 45 6e 74 72 79 20 3d 20 70 61 67 65 47 65 74 4e  Entry = pageGetN
183d0 52 65 63 28 61 32 2c 20 6e 32 29 3b 0a 20 20 20  Rec(a2, n2);.   
183e0 20 20 20 20 20 69 6e 74 20 69 45 6f 66 31 20 3d       int iEof1 =
183f0 20 53 45 47 4d 45 4e 54 5f 45 4f 46 28 6e 31 2c   SEGMENT_EOF(n1,
18400 20 6e 45 6e 74 72 79 29 3b 0a 20 20 20 20 20 20   nEntry);.      
18410 20 20 69 6e 74 20 69 45 6f 66 32 20 3d 20 53 45    int iEof2 = SE
18420 47 4d 45 4e 54 5f 45 4f 46 28 6e 32 2c 20 6e 45  GMENT_EOF(n2, nE
18430 6e 74 72 79 29 3b 0a 20 20 20 20 20 20 20 20 6d  ntry);.        m
18440 65 6d 63 70 79 28 61 31 2c 20 61 32 2c 20 69 45  emcpy(a1, a2, iE
18450 6f 66 32 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  of2);.        me
18460 6d 63 70 79 28 26 61 31 5b 69 45 6f 66 31 5d 2c  mcpy(&a1[iEof1],
18470 20 26 61 32 5b 69 45 6f 66 32 5d 2c 20 6e 32 20   &a2[iEof2], n2 
18480 2d 20 69 45 6f 66 32 29 3b 0a 20 20 20 20 20 20  - iEof2);.      
18490 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61    lsmFsPageRelea
184a0 73 65 28 61 70 48 69 65 72 5b 69 5d 29 3b 0a 20  se(apHier[i]);. 
184b0 20 20 20 20 20 20 20 61 70 48 69 65 72 5b 69 5d         apHier[i]
184c0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = pNew;.      }
184d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 73  else{.        ls
184e0 6d 50 75 74 55 31 36 28 26 61 31 5b 53 45 47 4d  mPutU16(&a1[SEGM
184f0 45 4e 54 5f 46 4c 41 47 53 5f 4f 46 46 53 45 54  ENT_FLAGS_OFFSET
18500 28 6e 31 29 5d 2c 20 53 45 47 4d 45 4e 54 5f 42  (n1)], SEGMENT_B
18510 54 52 45 45 5f 46 4c 41 47 29 3b 0a 20 20 20 20  TREE_FLAG);.    
18520 20 20 20 20 6c 73 6d 50 75 74 55 31 36 28 26 61      lsmPutU16(&a
18530 31 5b 53 45 47 4d 45 4e 54 5f 4e 52 45 43 4f 52  1[SEGMENT_NRECOR
18540 44 5f 4f 46 46 53 45 54 28 6e 31 29 5d 2c 20 30  D_OFFSET(n1)], 0
18550 29 3b 0a 20 20 20 20 20 20 20 20 6c 73 6d 50 75  );.        lsmPu
18560 74 55 36 34 28 26 61 31 5b 53 45 47 4d 45 4e 54  tU64(&a1[SEGMENT
18570 5f 50 4f 49 4e 54 45 52 5f 4f 46 46 53 45 54 28  _POINTER_OFFSET(
18580 6e 31 29 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  n1)], 0);.      
18590 20 20 69 20 3d 20 69 20 2d 20 31 3b 0a 20 20 20    i = i - 1;.   
185a0 20 20 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65       lsmFsPageRe
185b0 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
185c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
185d0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 4c 53  }.  }..#ifdef LS
185e0 4d 5f 44 45 42 55 47 0a 20 20 69 66 28 20 72 63  M_DEBUG.  if( rc
185f0 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
18600 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 48 69 65 72  for(i=0; i<nHier
18610 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 6c  ; i++) assert( l
18620 73 6d 46 73 50 61 67 65 57 72 69 74 61 62 6c 65  smFsPageWritable
18630 28 61 70 48 69 65 72 5b 69 5d 29 20 29 3b 0a 20  (apHier[i]) );. 
18640 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
18650 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18660 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f   Allocate and po
18670 70 75 6c 61 74 65 20 74 68 65 20 4d 65 72 67 65  pulate the Merge
18680 57 6f 72 6b 65 72 2e 61 70 48 69 65 72 5b 5d 20  Worker.apHier[] 
18690 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
186a0 20 69 6e 74 20 6d 65 72 67 65 57 6f 72 6b 65 72   int mergeWorker
186b0 4c 6f 61 64 48 69 65 72 61 72 63 68 79 28 4d 65  LoadHierarchy(Me
186c0 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57 29 7b  rgeWorker *pMW){
186d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f  .  int rc = LSM_
186e0 4f 4b 3b 0a 20 20 53 65 67 6d 65 6e 74 20 2a 70  OK;.  Segment *p
186f0 53 65 67 3b 0a 20 20 48 69 65 72 61 72 63 68 79  Seg;.  Hierarchy
18700 20 2a 70 3b 0a 20 0a 20 20 70 53 65 67 20 3d 20   *p;. .  pSeg = 
18710 26 70 4d 57 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68  &pMW->pLevel->lh
18720 73 3b 0a 20 20 70 20 3d 20 26 70 4d 57 2d 3e 68  s;.  p = &pMW->h
18730 69 65 72 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61  ier;..  if( p->a
18740 70 48 69 65 72 3d 3d 30 20 26 26 20 70 53 65 67  pHier==0 && pSeg
18750 2d 3e 69 52 6f 6f 74 21 3d 30 20 29 7b 0a 20 20  ->iRoot!=0 ){.  
18760 20 20 46 69 6c 65 53 79 73 74 65 6d 20 2a 70 46    FileSystem *pF
18770 53 20 3d 20 70 4d 57 2d 3e 70 44 62 2d 3e 70 46  S = pMW->pDb->pF
18780 53 3b 0a 20 20 20 20 6c 73 6d 5f 65 6e 76 20 2a  S;.    lsm_env *
18790 70 45 6e 76 20 3d 20 70 4d 57 2d 3e 70 44 62 2d  pEnv = pMW->pDb-
187a0 3e 70 45 6e 76 3b 0a 20 20 20 20 50 61 67 65 20  >pEnv;.    Page 
187b0 2a 2a 61 70 48 69 65 72 20 3d 20 30 3b 0a 20 20  **apHier = 0;.  
187c0 20 20 69 6e 74 20 6e 48 69 65 72 20 3d 20 30 3b    int nHier = 0;
187d0 0a 20 20 20 20 69 6e 74 20 69 50 67 20 3d 20 28  .    int iPg = (
187e0 69 6e 74 29 70 53 65 67 2d 3e 69 52 6f 6f 74 3b  int)pSeg->iRoot;
187f0 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ..    do {.     
18800 20 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a   Page *pPg = 0;.
18810 20 20 20 20 20 20 75 38 20 2a 61 44 61 74 61 3b        u8 *aData;
18820 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 61 74 61  .      int nData
18830 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
18840 73 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 6c  s;..      rc = l
18850 73 6d 46 73 44 62 50 61 67 65 47 65 74 28 70 46  smFsDbPageGet(pF
18860 53 2c 20 70 53 65 67 2c 20 69 50 67 2c 20 26 70  S, pSeg, iPg, &p
18870 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
18880 63 21 3d 4c 53 4d 5f 4f 4b 20 29 20 62 72 65 61  c!=LSM_OK ) brea
18890 6b 3b 0a 0a 20 20 20 20 20 20 61 44 61 74 61 20  k;..      aData 
188a0 3d 20 66 73 50 61 67 65 44 61 74 61 28 70 50 67  = fsPageData(pPg
188b0 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20  , &nData);.     
188c0 20 66 6c 61 67 73 20 3d 20 70 61 67 65 47 65 74   flags = pageGet
188d0 46 6c 61 67 73 28 61 44 61 74 61 2c 20 6e 44 61  Flags(aData, nDa
188e0 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  ta);.      if( f
188f0 6c 61 67 73 26 53 45 47 4d 45 4e 54 5f 42 54 52  lags&SEGMENT_BTR
18900 45 45 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 20  EE_FLAG ){.     
18910 20 20 20 50 61 67 65 20 2a 2a 61 70 4e 65 77 20     Page **apNew 
18920 3d 20 28 50 61 67 65 20 2a 2a 29 6c 73 6d 52 65  = (Page **)lsmRe
18930 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20  alloc(.         
18940 20 20 20 70 45 6e 76 2c 20 61 70 48 69 65 72 2c     pEnv, apHier,
18950 20 73 69 7a 65 6f 66 28 50 61 67 65 20 2a 29 2a   sizeof(Page *)*
18960 28 6e 48 69 65 72 2b 31 29 0a 20 20 20 20 20 20  (nHier+1).      
18970 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
18980 20 61 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20   apNew==0 ){.   
18990 20 20 20 20 20 20 20 72 63 20 3d 20 4c 53 4d 5f         rc = LSM_
189a0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
189b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
189c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
189d0 70 48 69 65 72 20 3d 20 61 70 4e 65 77 3b 0a 20  pHier = apNew;. 
189e0 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
189f0 61 70 48 69 65 72 5b 31 5d 2c 20 26 61 70 48 69  apHier[1], &apHi
18a00 65 72 5b 30 5d 2c 20 73 69 7a 65 6f 66 28 50 61  er[0], sizeof(Pa
18a10 67 65 20 2a 29 20 2a 20 6e 48 69 65 72 29 3b 0a  ge *) * nHier);.
18a20 20 20 20 20 20 20 20 20 6e 48 69 65 72 2b 2b 3b          nHier++;
18a30 0a 0a 20 20 20 20 20 20 20 20 61 70 48 69 65 72  ..        apHier
18a40 5b 30 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  [0] = pPg;.     
18a50 20 20 20 69 50 67 20 3d 20 28 69 6e 74 29 70 61     iPg = (int)pa
18a60 67 65 47 65 74 50 74 72 28 61 44 61 74 61 2c 20  geGetPtr(aData, 
18a70 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 65  nData);.      }e
18a80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 73 6d  lse{.        lsm
18a90 46 73 50 61 67 65 52 65 6c 65 61 73 65 28 70 50  FsPageRelease(pP
18aa0 67 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  g);.        brea
18ab0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
18ac0 77 68 69 6c 65 28 20 31 20 29 3b 0a 0a 20 20 20  while( 1 );..   
18ad0 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
18ae0 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 44 61  ){.      u8 *aDa
18af0 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 44  ta;.      int nD
18b00 61 74 61 3b 0a 20 20 20 20 20 20 61 44 61 74 61  ata;.      aData
18b10 20 3d 20 66 73 50 61 67 65 44 61 74 61 28 61 70   = fsPageData(ap
18b20 48 69 65 72 5b 30 5d 2c 20 26 6e 44 61 74 61 29  Hier[0], &nData)
18b30 3b 0a 20 20 20 20 20 20 70 4d 57 2d 3e 61 53 61  ;.      pMW->aSa
18b40 76 65 5b 30 5d 2e 69 50 67 6e 6f 20 3d 20 70 61  ve[0].iPgno = pa
18b50 67 65 47 65 74 50 74 72 28 61 44 61 74 61 2c 20  geGetPtr(aData, 
18b60 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 70 2d  nData);.      p-
18b70 3e 6e 48 69 65 72 20 3d 20 6e 48 69 65 72 3b 0a  >nHier = nHier;.
18b80 20 20 20 20 20 20 70 2d 3e 61 70 48 69 65 72 20        p->apHier 
18b90 3d 20 61 70 48 69 65 72 3b 0a 20 20 20 20 20 20  = apHier;.      
18ba0 72 63 20 3d 20 6d 65 72 67 65 57 6f 72 6b 65 72  rc = mergeWorker
18bb0 4d 6f 76 65 48 69 65 72 61 72 63 68 79 28 70 4d  MoveHierarchy(pM
18bc0 57 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  W, 0);.    }else
18bd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
18be0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
18bf0 6e 48 69 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nHier; i++){.   
18c00 20 20 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65       lsmFsPageRe
18c10 6c 65 61 73 65 28 61 70 48 69 65 72 5b 69 5d 29  lease(apHier[i])
18c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18c30 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c 20 61 70  lsmFree(pEnv, ap
18c40 48 69 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Hier);.    }.  }
18c50 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
18c60 0a 0a 2f 2a 0a 2a 2a 20 42 2d 74 72 65 65 20 70  ../*.** B-tree p
18c70 61 67 65 73 20 75 73 65 20 61 6c 6d 6f 73 74 20  ages use almost 
18c80 74 68 65 20 73 61 6d 65 20 66 6f 72 6d 61 74 20  the same format 
18c90 61 73 20 72 65 67 75 6c 61 72 20 70 61 67 65 73  as regular pages
18ca0 2e 20 54 68 65 20 0a 2a 2a 20 64 69 66 66 65 72  . The .** differ
18cb0 65 6e 63 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  ences are:.**.**
18cc0 20 20 20 31 2e 20 54 68 65 20 72 65 63 6f 72 64     1. The record
18cd0 20 66 6f 72 6d 61 74 20 69 73 20 28 75 73 75 61   format is (usua
18ce0 6c 6c 79 2c 20 73 65 65 20 62 65 6c 6f 77 29 20  lly, see below) 
18cf0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
18d00 2a 20 20 20 20 20 20 20 20 20 2b 20 54 79 70 65  *         + Type
18d10 20 62 79 74 65 20 28 61 6c 77 61 79 73 20 53 4f   byte (always SO
18d20 52 54 45 44 5f 53 45 50 41 52 41 54 4f 52 20 6f  RTED_SEPARATOR o
18d30 72 20 53 4f 52 54 45 44 5f 53 59 53 54 45 4d 5f  r SORTED_SYSTEM_
18d40 53 45 50 41 52 41 54 4f 52 29 2c 0a 2a 2a 20 20  SEPARATOR),.**  
18d50 20 20 20 20 20 20 20 2b 20 41 62 73 6f 6c 75 74         + Absolut
18d60 65 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 20  e pointer value 
18d70 28 76 61 72 69 6e 74 29 2c 0a 2a 2a 20 20 20 20  (varint),.**    
18d80 20 20 20 20 20 2b 20 4e 75 6d 62 65 72 20 6f 66       + Number of
18d90 20 62 79 74 65 73 20 69 6e 20 6b 65 79 20 28 76   bytes in key (v
18da0 61 72 69 6e 74 29 2c 0a 2a 2a 20 20 20 20 20 20  arint),.**      
18db0 20 20 20 2b 20 42 6c 6f 62 20 63 6f 6e 74 61 69     + Blob contai
18dc0 6e 69 6e 67 20 6b 65 79 20 64 61 74 61 2e 0a 2a  ning key data..*
18dd0 2a 0a 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 70 6f  *.**   2. All po
18de0 69 6e 74 65 72 20 76 61 6c 75 65 73 20 61 72 65  inter values are
18df0 20 73 74 6f 72 65 64 20 61 73 20 61 62 73 6f 6c   stored as absol
18e00 75 74 65 20 76 61 6c 75 65 73 20 28 6e 6f 74 20  ute values (not 
18e10 6f 66 66 73 65 74 73 20 0a 2a 2a 20 20 20 20 20  offsets .**     
18e20 20 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65   relative to the
18e30 20 66 6f 6f 74 65 72 20 70 6f 69 6e 74 65 72 20   footer pointer 
18e40 76 61 6c 75 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  value)..**.**   
18e50 33 2e 20 45 61 63 68 20 70 6f 69 6e 74 65 72 20  3. Each pointer 
18e60 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
18e70 61 20 72 65 63 6f 72 64 20 70 6f 69 6e 74 73 20  a record points 
18e80 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 0a  to a page that .
18e90 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 73  **      contains
18ea0 20 6b 65 79 73 20 73 6d 61 6c 6c 65 72 20 74 68   keys smaller th
18eb0 61 6e 20 74 68 65 20 72 65 63 6f 72 64 73 20 6b  an the records k
18ec0 65 79 20 28 6e 6f 74 65 3a 20 6e 6f 74 20 22 65  ey (note: not "e
18ed0 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 20 20  qual to or.**   
18ee0 20 20 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20     smaller than 
18ef0 2d 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 22 29  - smaller than")
18f00 2e 0a 2a 2a 0a 2a 2a 20 20 20 34 2e 20 54 68 65  ..**.**   4. The
18f10 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
18f20 70 61 67 65 20 66 6f 6f 74 65 72 20 6f 66 20 61  page footer of a
18f30 20 62 2d 74 72 65 65 20 70 61 67 65 20 70 6f 69   b-tree page poi
18f40 6e 74 73 20 74 6f 20 61 20 70 61 67 65 0a 2a 2a  nts to a page.**
18f50 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61        that conta
18f60 69 6e 73 20 6b 65 79 73 20 65 71 75 61 6c 20 74  ins keys equal t
18f70 6f 20 6f 72 20 6c 61 72 67 65 72 20 74 68 61 6e  o or larger than
18f80 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
18f90 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
18fa0 62 2d 74 72 65 65 20 70 61 67 65 2e 0a 2a 2a 0a  b-tree page..**.
18fb0 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 66 6f  ** The reason fo
18fc0 72 20 68 61 76 69 6e 67 20 74 68 65 20 70 61 67  r having the pag
18fd0 65 20 66 6f 6f 74 65 72 20 70 6f 69 6e 74 65 72  e footer pointer
18fe0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 69   point to the ri
18ff0 67 68 74 2d 63 68 69 6c 64 0a 2a 2a 20 28 69 6e  ght-child.** (in
19000 73 74 65 61 64 20 6f 66 20 74 68 65 20 6c 65 66  stead of the lef
19010 74 29 20 69 73 20 74 68 61 74 20 64 6f 69 6e 67  t) is that doing
19020 20 74 68 69 6e 67 73 20 74 68 69 73 20 77 61 79   things this way
19030 20 6d 61 6b 65 73 20 74 68 65 20 0a 2a 2a 20 6d   makes the .** m
19040 65 72 67 65 57 6f 72 6b 65 72 4d 6f 76 65 48 69  ergeWorkerMoveHi
19050 65 72 61 72 63 68 79 28 29 20 6f 70 65 72 61 74  erarchy() operat
19060 69 6f 6e 20 6c 65 73 73 20 63 6f 6d 70 6c 69 63  ion less complic
19070 61 74 65 64 20 28 73 69 6e 63 65 20 74 68 65 20  ated (since the 
19080 70 6f 69 6e 74 65 72 73 20 0a 2a 2a 20 74 68 61  pointers .** tha
19090 74 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64  t need to be upd
190a0 61 74 65 64 20 61 72 65 20 61 6c 6c 20 73 74 6f  ated are all sto
190b0 72 65 64 20 61 73 20 66 69 78 65 64 2d 73 69 7a  red as fixed-siz
190c0 65 20 69 6e 74 65 67 65 72 73 20 77 69 74 68 69  e integers withi
190d0 6e 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 66  n the .** page f
190e0 6f 6f 74 65 72 2c 20 6e 6f 74 20 76 61 72 69 6e  ooter, not varin
190f0 74 73 20 69 6e 20 70 61 67 65 20 72 65 63 6f 72  ts in page recor
19100 64 73 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 63 6f 72  ds)..**.** Recor
19110 64 73 20 6d 61 79 20 6e 6f 74 20 73 70 61 6e 20  ds may not span 
19120 62 2d 74 72 65 65 20 70 61 67 65 73 2e 20 49 66  b-tree pages. If
19130 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
19140 73 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  s called to add 
19150 61 0a 2a 2a 20 72 65 63 6f 72 64 20 6c 61 72 67  a.** record larg
19160 65 72 20 74 68 61 6e 20 28 70 61 67 65 2d 73 69  er than (page-si
19170 7a 65 20 2f 20 34 29 20 62 79 74 65 73 2c 20 74  ze / 4) bytes, t
19180 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
19190 20 74 68 65 20 69 6e 64 65 78 65 64 0a 2a 2a 20   the indexed.** 
191a0 61 72 72 61 79 20 70 61 67 65 20 74 68 61 74 20  array page that 
191b0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6d 61 69  contains the mai
191c0 6e 20 72 65 63 6f 72 64 20 69 73 20 61 64 64 65  n record is adde
191d0 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
191e0 69 6e 73 74 65 61 64 2e 0a 2a 2a 20 49 6e 20 74  instead..** In t
191f0 68 69 73 20 63 61 73 65 20 74 68 65 20 72 65 63  his case the rec
19200 6f 72 64 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  ord format is:.*
19210 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 30  *.**         + 0
19220 78 30 30 20 62 79 74 65 20 28 31 20 62 79 74 65  x00 byte (1 byte
19230 29 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20  ) .**         + 
19240 41 62 73 6f 6c 75 74 65 20 70 6f 69 6e 74 65 72  Absolute pointer
19250 20 76 61 6c 75 65 20 28 76 61 72 69 6e 74 29 2c   value (varint),
19260 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 41 62  .**         + Ab
19270 73 6f 6c 75 74 65 20 70 61 67 65 20 6e 75 6d 62  solute page numb
19280 65 72 20 6f 66 20 70 61 67 65 20 63 6f 6e 74 61  er of page conta
19290 69 6e 69 6e 67 20 6b 65 79 20 28 76 61 72 69 6e  ining key (varin
192a0 74 29 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 66 75  t)..**.** See fu
192b0 6e 63 74 69 6f 6e 20 73 65 65 6b 49 6e 42 74 72  nction seekInBtr
192c0 65 65 28 29 20 66 6f 72 20 74 68 65 20 63 6f 64  ee() for the cod
192d0 65 20 74 68 61 74 20 74 72 61 76 65 72 73 65 73  e that traverses
192e0 20 62 2d 74 72 65 65 20 70 61 67 65 73 2e 0a 2a   b-tree pages..*
192f0 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  /..static int me
19300 72 67 65 57 6f 72 6b 65 72 42 74 72 65 65 57 72  rgeWorkerBtreeWr
19310 69 74 65 28 0a 20 20 4d 65 72 67 65 57 6f 72 6b  ite(.  MergeWork
19320 65 72 20 2a 70 4d 57 2c 0a 20 20 75 38 20 65 54  er *pMW,.  u8 eT
19330 79 70 65 2c 0a 20 20 50 67 6e 6f 20 69 50 74 72  ype,.  Pgno iPtr
19340 2c 0a 20 20 50 67 6e 6f 20 69 4b 65 79 50 67 2c  ,.  Pgno iKeyPg,
19350 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 0a 20  .  void *pKey,. 
19360 20 69 6e 74 20 6e 4b 65 79 0a 29 7b 0a 20 20 48   int nKey.){.  H
19370 69 65 72 61 72 63 68 79 20 2a 70 20 3d 20 26 70  ierarchy *p = &p
19380 4d 57 2d 3e 68 69 65 72 3b 0a 20 20 6c 73 6d 5f  MW->hier;.  lsm_
19390 64 62 20 2a 70 44 62 20 3d 20 70 4d 57 2d 3e 70  db *pDb = pMW->p
193a0 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  Db;         /* D
193b0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
193c0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d  /.  int rc = LSM
193d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
193e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
193f0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  de */.  int iLev
19400 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
19410 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
19420 20 6f 66 20 62 2d 74 72 65 65 20 68 69 65 72 61   of b-tree hiera
19430 63 68 79 20 74 6f 20 77 72 69 74 65 20 74 6f 20  chy to write to 
19440 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 20  */.  int nData; 
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
19470 61 44 61 74 61 5b 5d 20 69 6e 20 62 79 74 65 73  aData[] in bytes
19480 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 3b   */.  u8 *aData;
19490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194a0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 64 61        /* Page da
194b0 74 61 20 66 6f 72 20 6c 65 76 65 6c 20 69 4c 65  ta for level iLe
194c0 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66  vel */.  int iOf
194d0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
194e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
194f0 65 74 20 6f 6e 20 62 2d 74 72 65 65 20 70 61 67  et on b-tree pag
19500 65 20 74 6f 20 77 72 69 74 65 20 72 65 63 6f 72  e to write recor
19510 64 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  d to */.  int nR
19520 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
19530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
19540 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72  tial number of r
19550 65 63 6f 72 64 73 20 6f 6e 20 62 2d 74 72 65 65  ecords on b-tree
19560 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 69   page */..  /* i
19570 4b 65 79 50 67 20 73 68 6f 75 6c 64 20 62 65 20  KeyPg should be 
19580 7a 65 72 6f 20 66 6f 72 20 61 6e 20 6f 72 64 69  zero for an ordi
19590 6e 61 72 79 20 62 2d 74 72 65 65 20 6b 65 79 2c  nary b-tree key,
195a0 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72   or non-zero for
195b0 20 61 6e 0a 20 20 2a 2a 20 69 6e 64 69 72 65 63   an.  ** indirec
195c0 74 20 6b 65 79 2e 20 54 68 65 20 66 6c 61 67 73  t key. The flags
195d0 20 62 79 74 65 20 66 6f 72 20 61 6e 20 69 6e 64   byte for an ind
195e0 69 72 65 63 74 20 6b 65 79 20 69 73 20 30 78 30  irect key is 0x0
195f0 30 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  0.  */.  assert(
19600 20 28 65 54 79 70 65 3d 3d 30 29 3d 3d 28 69 4b   (eType==0)==(iK
19610 65 79 50 67 21 3d 30 29 20 29 3b 0a 0a 20 20 2f  eyPg!=0) );..  /
19620 2a 20 54 68 65 20 4d 65 72 67 65 57 6f 72 6b 65  * The MergeWorke
19630 72 2e 61 70 48 69 65 72 5b 5d 20 61 72 72 61 79  r.apHier[] array
19640 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 69   contains the ri
19650 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 6f 66  ght-most leaf of
19660 20 74 68 65 20 62 2d 74 72 65 65 0a 20 20 2a 2a   the b-tree.  **
19670 20 68 69 65 72 61 72 63 68 79 2c 20 74 68 65 20   hierarchy, the 
19680 72 6f 6f 74 20 6e 6f 64 65 2c 20 61 6e 64 20 61  root node, and a
19690 6c 6c 20 6e 6f 64 65 73 20 74 68 61 74 20 6c 69  ll nodes that li
196a0 65 20 6f 6e 20 74 68 65 20 70 61 74 68 20 62 65  e on the path be
196b0 74 77 65 65 6e 2e 0a 20 20 2a 2a 20 61 70 48 69  tween..  ** apHi
196c0 65 72 5b 30 5d 20 69 73 20 74 68 65 20 72 69 67  er[0] is the rig
196d0 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 61 6e 64  ht-most leaf and
196e0 20 61 70 48 69 65 72 5b 70 4d 57 2d 3e 6e 48 69   apHier[pMW->nHi
196f0 65 72 2d 31 5d 20 69 73 20 74 68 65 20 63 75 72  er-1] is the cur
19700 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6f 74 20 70  rent.  ** root p
19710 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  age..  **.  ** T
19720 68 69 73 20 6c 6f 6f 70 20 73 65 61 72 63 68 65  his loop searche
19730 73 20 66 6f 72 20 61 20 6e 6f 64 65 20 77 69 74  s for a node wit
19740 68 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  h enough space t
19750 6f 20 73 74 6f 72 65 20 74 68 65 20 6b 65 79 20  o store the key 
19760 6f 6e 2c 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e  on,.  ** startin
19770 67 20 77 69 74 68 20 74 68 65 20 6c 65 61 66 20  g with the leaf 
19780 61 6e 64 20 69 74 65 72 61 74 69 6e 67 20 75 70  and iterating up
19790 20 74 6f 77 61 72 64 73 20 74 68 65 20 72 6f 6f   towards the roo
197a0 74 2e 20 57 68 65 6e 20 74 68 65 20 6c 6f 6f 70  t. When the loop
197b0 0a 20 20 2a 2a 20 65 78 69 74 73 2c 20 74 68 65  .  ** exits, the
197c0 20 6b 65 79 20 6d 61 79 20 62 65 20 77 72 69 74   key may be writ
197d0 74 65 6e 20 74 6f 20 61 70 48 69 65 72 5b 69 4c  ten to apHier[iL
197e0 65 76 65 6c 5d 2e 20 20 2a 2f 0a 20 20 66 6f 72  evel].  */.  for
197f0 28 69 4c 65 76 65 6c 3d 30 3b 20 69 4c 65 76 65  (iLevel=0; iLeve
19800 6c 3c 3d 70 2d 3e 6e 48 69 65 72 3b 20 69 4c 65  l<=p->nHier; iLe
19810 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  vel++){.    int 
19820 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
19830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19840 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
19850 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 0a 20  s required */.. 
19860 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3d 3d 70     if( iLevel==p
19870 2d 3e 6e 48 69 65 72 20 29 7b 0a 20 20 20 20 20  ->nHier ){.     
19880 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20 61   /* Extend the a
19890 72 72 61 79 20 61 6e 64 20 61 6c 6c 6f 63 61 74  rray and allocat
198a0 65 20 61 20 6e 65 77 20 72 6f 6f 74 20 70 61 67  e a new root pag
198b0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 50 61 67 65  e. */.      Page
198c0 20 2a 2a 61 4e 65 77 3b 0a 20 20 20 20 20 20 61   **aNew;.      a
198d0 4e 65 77 20 3d 20 28 50 61 67 65 20 2a 2a 29 6c  New = (Page **)l
198e0 73 6d 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  smRealloc(.     
198f0 20 20 20 20 20 70 4d 57 2d 3e 70 44 62 2d 3e 70       pMW->pDb->p
19900 45 6e 76 2c 20 70 2d 3e 61 70 48 69 65 72 2c 20  Env, p->apHier, 
19910 73 69 7a 65 6f 66 28 50 61 67 65 20 2a 29 2a 28  sizeof(Page *)*(
19920 70 2d 3e 6e 48 69 65 72 2b 31 29 0a 20 20 20 20  p->nHier+1).    
19930 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21    );.      if( !
19940 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  aNew ){.        
19950 72 65 74 75 72 6e 20 4c 53 4d 5f 4e 4f 4d 45 4d  return LSM_NOMEM
19960 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
19970 20 20 20 20 20 70 2d 3e 61 70 48 69 65 72 20 3d       p->apHier =
19980 20 61 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65   aNew;.    }else
19990 7b 0a 20 20 20 20 20 20 50 61 67 65 20 2a 70 4f  {.      Page *pO
199a0 6c 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46  ld;.      int nF
199b0 72 65 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ree;..      /* I
199c0 66 20 74 68 65 20 6b 65 79 20 77 69 6c 6c 20 66  f the key will f
199d0 69 74 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  it on this page,
199e0 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
199f0 65 20 6c 6f 6f 70 20 68 65 72 65 2e 0a 20 20 20  e loop here..   
19a00 20 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e     ** The new en
19a10 74 72 79 20 77 69 6c 6c 20 62 65 20 77 72 69 74  try will be writ
19a20 74 65 6e 20 74 6f 20 70 61 67 65 20 61 70 48 69  ten to page apHi
19a30 65 72 5b 69 4c 65 76 65 6c 5d 2e 20 2a 2f 0a 20  er[iLevel]. */. 
19a40 20 20 20 20 20 70 4f 6c 64 20 3d 20 70 2d 3e 61       pOld = p->a
19a50 70 48 69 65 72 5b 69 4c 65 76 65 6c 5d 3b 0a 20  pHier[iLevel];. 
19a60 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 73 6d       assert( lsm
19a70 46 73 50 61 67 65 57 72 69 74 61 62 6c 65 28 70  FsPageWritable(p
19a80 4f 6c 64 29 20 29 3b 0a 20 20 20 20 20 20 61 44  Old) );.      aD
19a90 61 74 61 20 3d 20 66 73 50 61 67 65 44 61 74 61  ata = fsPageData
19aa0 28 70 4f 6c 64 2c 20 26 6e 44 61 74 61 29 3b 0a  (pOld, &nData);.
19ab0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
19ac0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 42  =0 ){.        nB
19ad0 79 74 65 20 3d 20 32 20 2b 20 31 20 2b 20 6c 73  yte = 2 + 1 + ls
19ae0 6d 56 61 72 69 6e 74 4c 65 6e 33 32 28 28 69 6e  mVarintLen32((in
19af0 74 29 69 50 74 72 29 20 2b 20 6c 73 6d 56 61 72  t)iPtr) + lsmVar
19b00 69 6e 74 4c 65 6e 33 32 28 28 69 6e 74 29 69 4b  intLen32((int)iK
19b10 65 79 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  eyPg);.      }el
19b20 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 42 79 74  se{.        nByt
19b30 65 20 3d 20 32 20 2b 20 31 20 2b 20 6c 73 6d 56  e = 2 + 1 + lsmV
19b40 61 72 69 6e 74 4c 65 6e 33 32 28 28 69 6e 74 29  arintLen32((int)
19b50 69 50 74 72 29 20 2b 20 6c 73 6d 56 61 72 69 6e  iPtr) + lsmVarin
19b60 74 4c 65 6e 33 32 28 6e 4b 65 79 29 20 2b 20 6e  tLen32(nKey) + n
19b70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Key;.      }.   
19b80 20 20 20 6e 52 65 63 20 3d 20 70 61 67 65 47 65     nRec = pageGe
19b90 74 4e 52 65 63 28 61 44 61 74 61 2c 20 6e 44 61  tNRec(aData, nDa
19ba0 74 61 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65  ta);.      nFree
19bb0 20 3d 20 53 45 47 4d 45 4e 54 5f 45 4f 46 28 6e   = SEGMENT_EOF(n
19bc0 44 61 74 61 2c 20 6e 52 65 63 29 20 2d 20 6d 65  Data, nRec) - me
19bd0 72 67 65 57 6f 72 6b 65 72 50 61 67 65 4f 66 66  rgeWorkerPageOff
19be0 73 65 74 28 61 44 61 74 61 2c 20 6e 44 61 74 61  set(aData, nData
19bf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 42 79  );.      if( nBy
19c00 74 65 3c 3d 6e 46 72 65 65 20 29 20 62 72 65 61  te<=nFree ) brea
19c10 6b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 74 68  k;..      /* Oth
19c20 65 72 77 69 73 65 2c 20 74 68 69 73 20 70 61 67  erwise, this pag
19c30 65 20 69 73 20 66 75 6c 6c 2e 20 53 65 74 20 74  e is full. Set t
19c40 68 65 20 72 69 67 68 74 2d 68 61 6e 64 2d 63 68  he right-hand-ch
19c50 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  ild pointer.    
19c60 20 20 2a 2a 20 74 6f 20 69 50 74 72 20 61 6e 64    ** to iPtr and
19c70 20 72 65 6c 65 61 73 65 20 69 74 2e 20 20 2a 2f   release it.  */
19c80 0a 20 20 20 20 20 20 6c 73 6d 50 75 74 55 36 34  .      lsmPutU64
19c90 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54 5f  (&aData[SEGMENT_
19ca0 50 4f 49 4e 54 45 52 5f 4f 46 46 53 45 54 28 6e  POINTER_OFFSET(n
19cb0 44 61 74 61 29 5d 2c 20 69 50 74 72 29 3b 0a 20  Data)], iPtr);. 
19cc0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 73 6d       assert( lsm
19cd0 46 73 50 61 67 65 4e 75 6d 62 65 72 28 70 4f 6c  FsPageNumber(pOl
19ce0 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  d)==0 );.      r
19cf0 63 20 3d 20 6c 73 6d 46 73 50 61 67 65 50 65 72  c = lsmFsPagePer
19d00 73 69 73 74 28 70 4f 6c 64 29 3b 0a 20 20 20 20  sist(pOld);.    
19d10 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b    if( rc==LSM_OK
19d20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 50 74 72   ){.        iPtr
19d30 20 3d 20 6c 73 6d 46 73 50 61 67 65 4e 75 6d 62   = lsmFsPageNumb
19d40 65 72 28 70 4f 6c 64 29 3b 0a 20 20 20 20 20 20  er(pOld);.      
19d50 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61    lsmFsPageRelea
19d60 73 65 28 70 4f 6c 64 29 3b 0a 20 20 20 20 20 20  se(pOld);.      
19d70 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
19d80 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
19d90 61 67 65 20 66 6f 72 20 61 70 48 69 65 72 5b 69  age for apHier[i
19da0 4c 65 76 65 6c 5d 2e 20 2a 2f 0a 20 20 20 20 70  Level]. */.    p
19db0 2d 3e 61 70 48 69 65 72 5b 69 4c 65 76 65 6c 5d  ->apHier[iLevel]
19dc0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
19dd0 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
19de0 20 20 72 63 20 3d 20 6c 73 6d 46 73 53 6f 72 74    rc = lsmFsSort
19df0 65 64 41 70 70 65 6e 64 28 0a 20 20 20 20 20 20  edAppend(.      
19e00 20 20 20 20 70 44 62 2d 3e 70 46 53 2c 20 70 44      pDb->pFS, pD
19e10 62 2d 3e 70 57 6f 72 6b 65 72 2c 20 70 4d 57 2d  b->pWorker, pMW-
19e20 3e 70 4c 65 76 65 6c 2c 20 31 2c 20 26 70 2d 3e  >pLevel, 1, &p->
19e30 61 70 48 69 65 72 5b 69 4c 65 76 65 6c 5d 0a 20  apHier[iLevel]. 
19e40 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
19e50 20 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b    if( rc!=LSM_OK
19e60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
19e70 20 20 20 61 44 61 74 61 20 3d 20 66 73 50 61 67     aData = fsPag
19e80 65 44 61 74 61 28 70 2d 3e 61 70 48 69 65 72 5b  eData(p->apHier[
19e90 69 4c 65 76 65 6c 5d 2c 20 26 6e 44 61 74 61 29  iLevel], &nData)
19ea0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 61 44 61  ;.    memset(aDa
19eb0 74 61 2c 20 30 2c 20 6e 44 61 74 61 29 3b 0a 20  ta, 0, nData);. 
19ec0 20 20 20 6c 73 6d 50 75 74 55 31 36 28 26 61 44     lsmPutU16(&aD
19ed0 61 74 61 5b 53 45 47 4d 45 4e 54 5f 46 4c 41 47  ata[SEGMENT_FLAG
19ee0 53 5f 4f 46 46 53 45 54 28 6e 44 61 74 61 29 5d  S_OFFSET(nData)]
19ef0 2c 20 53 45 47 4d 45 4e 54 5f 42 54 52 45 45 5f  , SEGMENT_BTREE_
19f00 46 4c 41 47 29 3b 0a 20 20 20 20 6c 73 6d 50 75  FLAG);.    lsmPu
19f10 74 55 31 36 28 26 61 44 61 74 61 5b 53 45 47 4d  tU16(&aData[SEGM
19f20 45 4e 54 5f 4e 52 45 43 4f 52 44 5f 4f 46 46 53  ENT_NRECORD_OFFS
19f30 45 54 28 6e 44 61 74 61 29 5d 2c 20 30 29 3b 0a  ET(nData)], 0);.
19f40 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3d  .    if( iLevel=
19f50 3d 70 2d 3e 6e 48 69 65 72 20 29 7b 0a 20 20 20  =p->nHier ){.   
19f60 20 20 20 70 2d 3e 6e 48 69 65 72 2b 2b 3b 0a 20     p->nHier++;. 
19f70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19f80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  }.  }..  /* Writ
19f90 65 20 74 68 65 20 6b 65 79 20 69 6e 74 6f 20 70  e the key into p
19fa0 61 67 65 20 61 70 48 69 65 72 5b 69 4c 65 76 65  age apHier[iLeve
19fb0 6c 5d 2e 20 2a 2f 0a 20 20 61 44 61 74 61 20 3d  l]. */.  aData =
19fc0 20 66 73 50 61 67 65 44 61 74 61 28 70 2d 3e 61   fsPageData(p->a
19fd0 70 48 69 65 72 5b 69 4c 65 76 65 6c 5d 2c 20 26  pHier[iLevel], &
19fe0 6e 44 61 74 61 29 3b 0a 20 20 69 4f 66 66 20 3d  nData);.  iOff =
19ff0 20 6d 65 72 67 65 57 6f 72 6b 65 72 50 61 67 65   mergeWorkerPage
1a000 4f 66 66 73 65 74 28 61 44 61 74 61 2c 20 6e 44  Offset(aData, nD
1a010 61 74 61 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70  ata);.  nRec = p
1a020 61 67 65 47 65 74 4e 52 65 63 28 61 44 61 74 61  ageGetNRec(aData
1a030 2c 20 6e 44 61 74 61 29 3b 0a 20 20 6c 73 6d 50  , nData);.  lsmP
1a040 75 74 55 31 36 28 26 61 44 61 74 61 5b 53 45 47  utU16(&aData[SEG
1a050 4d 45 4e 54 5f 43 45 4c 4c 50 54 52 5f 4f 46 46  MENT_CELLPTR_OFF
1a060 53 45 54 28 6e 44 61 74 61 2c 20 6e 52 65 63 29  SET(nData, nRec)
1a070 5d 2c 20 28 75 31 36 29 69 4f 66 66 29 3b 0a 20  ], (u16)iOff);. 
1a080 20 6c 73 6d 50 75 74 55 31 36 28 26 61 44 61 74   lsmPutU16(&aDat
1a090 61 5b 53 45 47 4d 45 4e 54 5f 4e 52 45 43 4f 52  a[SEGMENT_NRECOR
1a0a0 44 5f 4f 46 46 53 45 54 28 6e 44 61 74 61 29 5d  D_OFFSET(nData)]
1a0b0 2c 20 28 75 31 36 29 28 6e 52 65 63 2b 31 29 29  , (u16)(nRec+1))
1a0c0 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30  ;.  if( eType==0
1a0d0 20 29 7b 0a 20 20 20 20 61 44 61 74 61 5b 69 4f   ){.    aData[iO
1a0e0 66 66 2b 2b 5d 20 3d 20 30 78 30 30 3b 0a 20 20  ff++] = 0x00;.  
1a0f0 20 20 69 4f 66 66 20 2b 3d 20 6c 73 6d 56 61 72    iOff += lsmVar
1a100 69 6e 74 50 75 74 33 32 28 26 61 44 61 74 61 5b  intPut32(&aData[
1a110 69 4f 66 66 5d 2c 20 28 69 6e 74 29 69 50 74 72  iOff], (int)iPtr
1a120 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 6c  );.    iOff += l
1a130 73 6d 56 61 72 69 6e 74 50 75 74 33 32 28 26 61  smVarintPut32(&a
1a140 44 61 74 61 5b 69 4f 66 66 5d 2c 20 28 69 6e 74  Data[iOff], (int
1a150 29 69 4b 65 79 50 67 29 3b 0a 20 20 7d 65 6c 73  )iKeyPg);.  }els
1a160 65 7b 0a 20 20 20 20 61 44 61 74 61 5b 69 4f 66  e{.    aData[iOf
1a170 66 2b 2b 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  f++] = eType;.  
1a180 20 20 69 4f 66 66 20 2b 3d 20 6c 73 6d 56 61 72    iOff += lsmVar
1a190 69 6e 74 50 75 74 33 32 28 26 61 44 61 74 61 5b  intPut32(&aData[
1a1a0 69 4f 66 66 5d 2c 20 28 69 6e 74 29 69 50 74 72  iOff], (int)iPtr
1a1b0 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 6c  );.    iOff += l
1a1c0 73 6d 56 61 72 69 6e 74 50 75 74 33 32 28 26 61  smVarintPut32(&a
1a1d0 44 61 74 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 79  Data[iOff], nKey
1a1e0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  );.    memcpy(&a
1a1f0 44 61 74 61 5b 69 4f 66 66 5d 2c 20 70 4b 65 79  Data[iOff], pKey
1a200 2c 20 6e 4b 65 79 29 3b 0a 20 20 7d 0a 0a 20 20  , nKey);.  }..  
1a210 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
1a220 61 74 69 63 20 69 6e 74 20 6d 65 72 67 65 57 6f  atic int mergeWo
1a230 72 6b 65 72 42 74 72 65 65 49 6e 64 69 72 65 63  rkerBtreeIndirec
1a240 74 28 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70  t(MergeWorker *p
1a250 4d 57 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  MW){.  int rc = 
1a260 4c 53 4d 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 4d  LSM_OK;.  if( pM
1a270 57 2d 3e 69 49 6e 64 69 72 65 63 74 20 29 7b 0a  W->iIndirect ){.
1a280 20 20 20 20 50 67 6e 6f 20 69 4b 65 79 50 67 20      Pgno iKeyPg 
1a290 3d 20 70 4d 57 2d 3e 61 53 61 76 65 5b 31 5d 2e  = pMW->aSave[1].
1a2a0 69 50 67 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  iPgno;.    rc = 
1a2b0 6d 65 72 67 65 57 6f 72 6b 65 72 42 74 72 65 65  mergeWorkerBtree
1a2c0 57 72 69 74 65 28 70 4d 57 2c 20 30 2c 20 70 4d  Write(pMW, 0, pM
1a2d0 57 2d 3e 69 49 6e 64 69 72 65 63 74 2c 20 69 4b  W->iIndirect, iK
1a2e0 65 79 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eyPg, 0, 0);.   
1a2f0 20 70 4d 57 2d 3e 69 49 6e 64 69 72 65 63 74 20   pMW->iIndirect 
1a300 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1a310 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1a320 70 70 65 6e 64 20 74 68 65 20 64 61 74 61 62 61  ppend the databa
1a330 73 65 20 6b 65 79 20 28 69 54 6f 70 69 63 2f 70  se key (iTopic/p
1a340 4b 65 79 2f 6e 4b 65 79 29 20 74 6f 20 74 68 65  Key/nKey) to the
1a350 20 62 2d 74 72 65 65 20 75 6e 64 65 72 20 0a 2a   b-tree under .*
1a360 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  * construction. 
1a370 54 68 69 73 20 6b 65 79 20 68 61 73 20 6e 6f 74  This key has not
1a380 20 79 65 74 20 62 65 65 6e 20 77 72 69 74 74 65   yet been writte
1a390 6e 20 74 6f 20 61 20 73 65 67 6d 65 6e 74 20 70  n to a segment p
1a3a0 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  age..** The poin
1a3b0 74 65 72 20 74 68 61 74 20 77 69 6c 6c 20 61 63  ter that will ac
1a3c0 63 6f 6d 70 61 6e 79 20 74 68 65 20 6e 65 77 20  company the new 
1a3d0 6b 65 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  key in the b-tre
1a3e0 65 20 2d 20 74 68 61 74 0a 2a 2a 20 70 6f 69 6e  e - that.** poin
1a3f0 74 73 20 74 6f 20 74 68 65 20 63 6f 6d 70 6c 65  ts to the comple
1a400 74 65 64 20 73 65 67 6d 65 6e 74 20 70 61 67 65  ted segment page
1a410 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6b   that contains k
1a420 65 79 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  eys smaller than
1a430 0a 2a 2a 20 28 70 4b 65 79 2f 6e 4b 65 79 29 20  .** (pKey/nKey) 
1a440 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  is currently sto
1a450 72 65 64 20 69 6e 20 70 4d 57 2d 3e 61 53 61 76  red in pMW->aSav
1a460 65 5b 30 5d 2e 69 50 67 6e 6f 2e 0a 2a 2f 0a 73  e[0].iPgno..*/.s
1a470 74 61 74 69 63 20 69 6e 74 20 6d 65 72 67 65 57  tatic int mergeW
1a480 6f 72 6b 65 72 50 75 73 68 48 69 65 72 61 72 63  orkerPushHierarc
1a490 68 79 28 0a 20 20 4d 65 72 67 65 57 6f 72 6b 65  hy(.  MergeWorke
1a4a0 72 20 2a 70 4d 57 2c 20 20 20 20 20 20 20 20 20  r *pMW,         
1a4b0 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 77        /* Merge w
1a4c0 6f 72 6b 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  orker object */.
1a4d0 20 20 69 6e 74 20 69 54 6f 70 69 63 2c 20 20 20    int iTopic,   
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4f0 20 20 2f 2a 20 54 6f 70 69 63 20 76 61 6c 75 65    /* Topic value
1a500 20 66 6f 72 20 74 68 69 73 20 6b 65 79 20 2a 2f   for this key */
1a510 0a 20 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  .  void *pKey,  
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a530 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1a540 20 6b 65 79 20 62 75 66 66 65 72 20 2a 2f 0a 20   key buffer */. 
1a550 20 69 6e 74 20 6e 4b 65 79 20 20 20 20 20 20 20   int nKey       
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a570 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65 79   /* Size of pKey
1a580 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
1a590 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1a5a0 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20  = LSM_OK;       
1a5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1a5c0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn Code */.  Pgn
1a5d0 6f 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  o iPtr;         
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a5f0 50 6f 69 6e 74 65 72 20 76 61 6c 75 65 20 74 6f  Pointer value to
1a600 20 61 63 63 6f 6d 70 61 6e 79 20 70 4b 65 79 2f   accompany pKey/
1a610 6e 4b 65 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nKey */..  asser
1a620 74 28 20 70 4d 57 2d 3e 61 53 61 76 65 5b 30 5d  t( pMW->aSave[0]
1a630 2e 62 53 74 6f 72 65 3d 3d 30 20 29 3b 0a 20 20  .bStore==0 );.  
1a640 61 73 73 65 72 74 28 20 70 4d 57 2d 3e 61 53 61  assert( pMW->aSa
1a650 76 65 5b 31 5d 2e 62 53 74 6f 72 65 3d 3d 30 20  ve[1].bStore==0 
1a660 29 3b 0a 20 20 72 63 20 3d 20 6d 65 72 67 65 57  );.  rc = mergeW
1a670 6f 72 6b 65 72 42 74 72 65 65 49 6e 64 69 72 65  orkerBtreeIndire
1a680 63 74 28 70 4d 57 29 3b 0a 0a 20 20 2f 2a 20 4f  ct(pMW);..  /* O
1a690 62 74 61 69 6e 20 74 68 65 20 61 62 73 6f 6c 75  btain the absolu
1a6a0 74 65 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65  te pointer value
1a6b0 20 74 6f 20 73 74 6f 72 65 20 61 6c 6f 6e 67 20   to store along 
1a6c0 77 69 74 68 20 74 68 65 20 6b 65 79 20 69 6e 20  with the key in 
1a6d0 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 62 6f  the.  ** page bo
1a6e0 64 79 2e 20 54 68 69 73 20 70 6f 69 6e 74 65 72  dy. This pointer
1a6f0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 70 61 67   points to a pag
1a700 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1a710 6b 65 79 73 20 74 68 61 74 20 61 72 65 0a 20 20  keys that are.  
1a720 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ** smaller than 
1a730 70 4b 65 79 2f 6e 4b 65 79 2e 20 20 2a 2f 0a 20  pKey/nKey.  */. 
1a740 20 69 50 74 72 20 3d 20 70 4d 57 2d 3e 61 53 61   iPtr = pMW->aSa
1a750 76 65 5b 30 5d 2e 69 50 67 6e 6f 3b 0a 20 20 61  ve[0].iPgno;.  a
1a760 73 73 65 72 74 28 20 69 50 74 72 21 3d 30 20 29  ssert( iPtr!=0 )
1a770 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  ;..  /* Determin
1a780 65 20 69 66 20 74 68 65 20 69 6e 64 69 72 65 63  e if the indirec
1a790 74 20 66 6f 72 6d 61 74 20 73 68 6f 75 6c 64 20  t format should 
1a7a0 62 65 20 75 73 65 64 2e 20 2a 2f 0a 20 20 69 66  be used. */.  if
1a7b0 28 20 28 6e 4b 65 79 2a 34 20 3e 20 6c 73 6d 46  ( (nKey*4 > lsmF
1a7c0 73 50 61 67 65 53 69 7a 65 28 70 4d 57 2d 3e 70  sPageSize(pMW->p
1a7d0 44 62 2d 3e 70 46 53 29 29 20 29 7b 0a 20 20 20  Db->pFS)) ){.   
1a7e0 20 70 4d 57 2d 3e 69 49 6e 64 69 72 65 63 74 20   pMW->iIndirect 
1a7f0 3d 20 69 50 74 72 3b 0a 20 20 20 20 70 4d 57 2d  = iPtr;.    pMW-
1a800 3e 61 53 61 76 65 5b 31 5d 2e 62 53 74 6f 72 65  >aSave[1].bStore
1a810 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
1a820 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57 6f 72     rc = mergeWor
1a830 6b 65 72 42 74 72 65 65 57 72 69 74 65 28 0a 20  kerBtreeWrite(. 
1a840 20 20 20 20 20 20 20 70 4d 57 2c 20 28 75 38 29         pMW, (u8)
1a850 28 69 54 6f 70 69 63 20 7c 20 4c 53 4d 5f 53 45  (iTopic | LSM_SE
1a860 50 41 52 41 54 4f 52 29 2c 20 69 50 74 72 2c 20  PARATOR), iPtr, 
1a870 30 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 0a 20 20  0, pKey, nKey.  
1a880 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45    );.  }..  /* E
1a890 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53  nsure that the S
1a8a0 6f 72 74 65 64 52 75 6e 2e 69 52 6f 6f 74 20 66  ortedRun.iRoot f
1a8b0 69 65 6c 64 20 69 73 20 63 6f 72 72 65 63 74 2e  ield is correct.
1a8c0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
1a8d0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .}..static int m
1a8e0 65 72 67 65 57 6f 72 6b 65 72 46 69 6e 69 73 68  ergeWorkerFinish
1a8f0 48 69 65 72 61 72 63 68 79 28 0a 20 20 4d 65 72  Hierarchy(.  Mer
1a900 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57 20 20 20  geWorker *pMW   
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a920 4d 65 72 67 65 20 77 6f 72 6b 65 72 20 6f 62 6a  Merge worker obj
1a930 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ect */.){.  int 
1a940 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1a950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1a960 73 65 64 20 74 6f 20 6c 6f 6f 70 20 74 68 72 6f  sed to loop thro
1a970 75 67 68 20 61 70 48 69 65 72 5b 5d 20 2a 2f 0a  ugh apHier[] */.
1a980 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f    int rc = LSM_O
1a990 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
1a9a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1a9b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 3b   */.  Pgno iPtr;
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9d0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 72 69 67        /* New rig
1a9e0 68 74 2d 68 61 6e 64 2d 63 68 69 6c 64 20 70 6f  ht-hand-child po
1a9f0 69 6e 74 65 72 20 76 61 6c 75 65 20 2a 2f 0a 0a  inter value */..
1aa00 20 20 69 50 74 72 20 3d 20 70 4d 57 2d 3e 61 53    iPtr = pMW->aS
1aa10 61 76 65 5b 30 5d 2e 69 50 67 6e 6f 3b 0a 20 20  ave[0].iPgno;.  
1aa20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 57 2d 3e  for(i=0; i<pMW->
1aa30 68 69 65 72 2e 6e 48 69 65 72 20 26 26 20 72 63  hier.nHier && rc
1aa40 3d 3d 4c 53 4d 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  ==LSM_OK; i++){.
1aa50 20 20 20 20 50 61 67 65 20 2a 70 50 67 20 3d 20      Page *pPg = 
1aa60 70 4d 57 2d 3e 68 69 65 72 2e 61 70 48 69 65 72  pMW->hier.apHier
1aa70 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 44 61  [i];.    int nDa
1aa80 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
1aa90 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1aaa0 66 20 61 44 61 74 61 5b 5d 20 69 6e 20 62 79 74  f aData[] in byt
1aab0 65 73 20 2a 2f 0a 20 20 20 20 75 38 20 2a 61 44  es */.    u8 *aD
1aac0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
1aad0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
1aae0 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a  data for pPg */.
1aaf0 0a 20 20 20 20 61 44 61 74 61 20 3d 20 66 73 50  .    aData = fsP
1ab00 61 67 65 44 61 74 61 28 70 50 67 2c 20 26 6e 44  ageData(pPg, &nD
1ab10 61 74 61 29 3b 0a 20 20 20 20 6c 73 6d 50 75 74  ata);.    lsmPut
1ab20 55 36 34 28 26 61 44 61 74 61 5b 53 45 47 4d 45  U64(&aData[SEGME
1ab30 4e 54 5f 50 4f 49 4e 54 45 52 5f 4f 46 46 53 45  NT_POINTER_OFFSE
1ab40 54 28 6e 44 61 74 61 29 5d 2c 20 69 50 74 72 29  T(nData)], iPtr)
1ab50 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 46  ;..    rc = lsmF
1ab60 73 50 61 67 65 50 65 72 73 69 73 74 28 70 50 67  sPagePersist(pPg
1ab70 29 3b 0a 20 20 20 20 69 50 74 72 20 3d 20 6c 73  );.    iPtr = ls
1ab80 6d 46 73 50 61 67 65 4e 75 6d 62 65 72 28 70 50  mFsPageNumber(pP
1ab90 67 29 3b 0a 20 20 20 20 6c 73 6d 46 73 50 61 67  g);.    lsmFsPag
1aba0 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
1abb0 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 2d 3e 68   }..  if( pMW->h
1abc0 69 65 72 2e 6e 48 69 65 72 20 29 7b 0a 20 20 20  ier.nHier ){.   
1abd0 20 70 4d 57 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68   pMW->pLevel->lh
1abe0 73 2e 69 52 6f 6f 74 20 3d 20 69 50 74 72 3b 0a  s.iRoot = iPtr;.
1abf0 20 20 20 20 6c 73 6d 46 72 65 65 28 70 4d 57 2d      lsmFree(pMW-
1ac00 3e 70 44 62 2d 3e 70 45 6e 76 2c 20 70 4d 57 2d  >pDb->pEnv, pMW-
1ac10 3e 68 69 65 72 2e 61 70 48 69 65 72 29 3b 0a 20  >hier.apHier);. 
1ac20 20 20 20 70 4d 57 2d 3e 68 69 65 72 2e 61 70 48     pMW->hier.apH
1ac30 69 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 4d 57  ier = 0;.    pMW
1ac40 2d 3e 68 69 65 72 2e 6e 48 69 65 72 20 3d 20 30  ->hier.nHier = 0
1ac50 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1ac60 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
1ac70 74 20 6d 65 72 67 65 57 6f 72 6b 65 72 41 64 64  t mergeWorkerAdd
1ac80 50 61 64 64 69 6e 67 28 0a 20 20 4d 65 72 67 65  Padding(.  Merge
1ac90 57 6f 72 6b 65 72 20 2a 70 4d 57 20 20 20 20 20  Worker *pMW     
1aca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
1acb0 72 67 65 20 77 6f 72 6b 65 72 20 6f 62 6a 65 63  rge worker objec
1acc0 74 20 2a 2f 0a 29 7b 0a 20 20 46 69 6c 65 53 79  t */.){.  FileSy
1acd0 73 74 65 6d 20 2a 70 46 53 20 3d 20 70 4d 57 2d  stem *pFS = pMW-
1ace0 3e 70 44 62 2d 3e 70 46 53 3b 0a 20 20 72 65 74  >pDb->pFS;.  ret
1acf0 75 72 6e 20 6c 73 6d 46 73 53 6f 72 74 65 64 50  urn lsmFsSortedP
1ad00 61 64 64 69 6e 67 28 70 46 53 2c 20 70 4d 57 2d  adding(pFS, pMW-
1ad10 3e 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2c 20 26  >pDb->pWorker, &
1ad20 70 4d 57 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68 73  pMW->pLevel->lhs
1ad30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
1ad40 61 73 65 20 61 6c 6c 20 70 61 67 65 20 72 65 66  ase all page ref
1ad50 65 72 65 6e 63 65 73 20 63 75 72 72 65 6e 74 6c  erences currentl
1ad60 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 6d 65  y held by the me
1ad70 72 67 65 2d 77 6f 72 6b 65 72 20 70 61 73 73 65  rge-worker passe
1ad80 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79  d.** as the only
1ad90 20 61 72 67 75 6d 65 6e 74 2e 20 55 6e 6c 65 73   argument. Unles
1ada0 73 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  s an error has o
1adb0 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 70 61 67  ccurred, all pag
1adc0 65 73 20 68 61 76 65 0a 2a 2a 20 61 6c 72 65 61  es have.** alrea
1add0 64 79 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  dy been released
1ade0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1adf0 20 6d 65 72 67 65 57 6f 72 6b 65 72 52 65 6c 65   mergeWorkerRele
1ae00 61 73 65 41 6c 6c 28 4d 65 72 67 65 57 6f 72 6b  aseAll(MergeWork
1ae10 65 72 20 2a 70 4d 57 29 7b 0a 20 20 69 6e 74 20  er *pMW){.  int 
1ae20 69 3b 0a 20 20 6c 73 6d 46 73 50 61 67 65 52 65  i;.  lsmFsPageRe
1ae30 6c 65 61 73 65 28 70 4d 57 2d 3e 70 50 61 67 65  lease(pMW->pPage
1ae40 29 3b 0a 20 20 70 4d 57 2d 3e 70 50 61 67 65 20  );.  pMW->pPage 
1ae50 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
1ae60 20 69 3c 70 4d 57 2d 3e 68 69 65 72 2e 6e 48 69   i<pMW->hier.nHi
1ae70 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 73  er; i++){.    ls
1ae80 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65 28 70  mFsPageRelease(p
1ae90 4d 57 2d 3e 68 69 65 72 2e 61 70 48 69 65 72 5b  MW->hier.apHier[
1aea0 69 5d 29 3b 0a 20 20 20 20 70 4d 57 2d 3e 68 69  i]);.    pMW->hi
1aeb0 65 72 2e 61 70 48 69 65 72 5b 69 5d 20 3d 20 30  er.apHier[i] = 0
1aec0 3b 0a 20 20 7d 0a 20 20 6c 73 6d 46 72 65 65 28  ;.  }.  lsmFree(
1aed0 70 4d 57 2d 3e 70 44 62 2d 3e 70 45 6e 76 2c 20  pMW->pDb->pEnv, 
1aee0 70 4d 57 2d 3e 68 69 65 72 2e 61 70 48 69 65 72  pMW->hier.apHier
1aef0 29 3b 0a 20 20 70 4d 57 2d 3e 68 69 65 72 2e 61  );.  pMW->hier.a
1af00 70 48 69 65 72 20 3d 20 30 3b 0a 20 20 70 4d 57  pHier = 0;.  pMW
1af10 2d 3e 68 69 65 72 2e 6e 48 69 65 72 20 3d 20 30  ->hier.nHier = 0
1af20 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1af30 6b 65 79 73 7a 54 6f 53 6b 69 70 28 46 69 6c 65  keyszToSkip(File
1af40 53 79 73 74 65 6d 20 2a 70 46 53 2c 20 69 6e 74  System *pFS, int
1af50 20 6e 4b 65 79 29 7b 0a 20 20 69 6e 74 20 6e 50   nKey){.  int nP
1af60 67 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20  gsz;            
1af70 20 20 20 20 2f 2a 20 4e 6f 6d 69 6e 61 6c 20 64      /* Nominal d
1af80 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
1af90 65 20 2a 2f 0a 20 20 6e 50 67 73 7a 20 3d 20 6c  e */.  nPgsz = l
1afa0 73 6d 46 73 50 61 67 65 53 69 7a 65 28 70 46 53  smFsPageSize(pFS
1afb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 4c 53 4d 5f  );.  return LSM_
1afc0 4d 49 4e 28 28 28 6e 4b 65 79 20 2a 20 34 29 20  MIN(((nKey * 4) 
1afd0 2f 20 6e 50 67 73 7a 29 2c 20 33 29 3b 0a 7d 0a  / nPgsz), 3);.}.
1afe0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 74  ./*.** Release t
1aff0 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
1b000 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70  the current outp
1b010 75 74 20 70 61 67 65 20 6f 66 20 6d 65 72 67 65  ut page of merge
1b020 2d 77 6f 72 6b 65 72 20 2a 70 4d 57 0a 2a 2a 20  -worker *pMW.** 
1b030 28 72 65 66 65 72 65 6e 63 65 20 70 4d 57 2d 3e  (reference pMW->
1b040 70 50 61 67 65 29 2e 20 53 65 74 20 74 68 65 20  pPage). Set the 
1b050 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75  page number valu
1b060 65 73 20 69 6e 20 61 53 61 76 65 5b 5d 20 61 73  es in aSave[] as
1b070 20 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 28 73   .** required (s
1b080 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
1b090 65 20 73 74 72 75 63 74 20 4d 65 72 67 65 57 6f  e struct MergeWo
1b0a0 72 6b 65 72 20 66 6f 72 20 64 65 74 61 69 6c 73  rker for details
1b0b0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1b0c0 20 6d 65 72 67 65 57 6f 72 6b 65 72 50 65 72 73   mergeWorkerPers
1b0d0 69 73 74 41 6e 64 52 65 6c 65 61 73 65 28 4d 65  istAndRelease(Me
1b0e0 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57 29 7b  rgeWorker *pMW){
1b0f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1b100 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
1b110 4d 57 2d 3e 70 50 61 67 65 20 7c 7c 20 28 70 4d  MW->pPage || (pM
1b120 57 2d 3e 61 53 61 76 65 5b 30 5d 2e 62 53 74 6f  W->aSave[0].bSto
1b130 72 65 3d 3d 30 20 26 26 20 70 4d 57 2d 3e 61 53  re==0 && pMW->aS
1b140 61 76 65 5b 31 5d 2e 62 53 74 6f 72 65 3d 3d 30  ave[1].bStore==0
1b150 29 20 29 3b 0a 0a 20 20 2f 2a 20 50 65 72 73 69  ) );..  /* Persi
1b160 73 74 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  st the page */. 
1b170 20 72 63 20 3d 20 6c 73 6d 46 73 50 61 67 65 50   rc = lsmFsPageP
1b180 65 72 73 69 73 74 28 70 4d 57 2d 3e 70 50 61 67  ersist(pMW->pPag
1b190 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 72 65 71  e);..  /* If req
1b1a0 75 69 72 65 64 2c 20 73 61 76 65 20 74 68 65 20  uired, save the 
1b1b0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a  page number. */.
1b1c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
1b1d0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d  i++){.    if( pM
1b1e0 57 2d 3e 61 53 61 76 65 5b 69 5d 2e 62 53 74 6f  W->aSave[i].bSto
1b1f0 72 65 20 29 7b 0a 20 20 20 20 20 20 70 4d 57 2d  re ){.      pMW-
1b200 3e 61 53 61 76 65 5b 69 5d 2e 69 50 67 6e 6f 20  >aSave[i].iPgno 
1b210 3d 20 6c 73 6d 46 73 50 61 67 65 4e 75 6d 62 65  = lsmFsPageNumbe
1b220 72 28 70 4d 57 2d 3e 70 50 61 67 65 29 3b 0a 20  r(pMW->pPage);. 
1b230 20 20 20 20 20 70 4d 57 2d 3e 61 53 61 76 65 5b       pMW->aSave[
1b240 69 5d 2e 62 53 74 6f 72 65 20 3d 20 30 3b 0a 20  i].bStore = 0;. 
1b250 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
1b260 65 6c 65 61 73 65 20 74 68 65 20 63 6f 6d 70 6c  elease the compl
1b270 65 74 65 64 20 6f 75 74 70 75 74 20 70 61 67 65  eted output page
1b280 2e 20 2a 2f 0a 20 20 6c 73 6d 46 73 50 61 67 65  . */.  lsmFsPage
1b290 52 65 6c 65 61 73 65 28 70 4d 57 2d 3e 70 50 61  Release(pMW->pPa
1b2a0 67 65 29 3b 0a 20 20 70 4d 57 2d 3e 70 50 61 67  ge);.  pMW->pPag
1b2b0 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
1b2c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  rc;.}../*.** Adv
1b2d0 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
1b2e0 20 70 61 67 65 20 6f 66 20 61 6e 20 6f 75 74 70   page of an outp
1b2f0 75 74 20 72 75 6e 20 62 65 69 6e 67 20 70 6f 70  ut run being pop
1b300 75 6c 61 74 65 64 20 62 79 20 6d 65 72 67 65 2d  ulated by merge-
1b310 77 6f 72 6b 65 72 0a 2a 2a 20 70 4d 57 2e 20 54  worker.** pMW. T
1b320 68 65 20 66 6f 6f 74 65 72 20 6f 66 20 74 68 65  he footer of the
1b330 20 6e 65 77 20 70 61 67 65 20 69 73 20 69 6e 69   new page is ini
1b340 74 69 61 6c 69 7a 65 64 20 74 6f 20 69 6e 64 69  tialized to indi
1b350 63 61 74 65 20 74 68 61 74 20 69 74 20 63 6f 6e  cate that it con
1b360 74 61 69 6e 73 0a 2a 2a 20 7a 65 72 6f 20 72 65  tains.** zero re
1b370 63 6f 72 64 73 2e 20 54 68 65 20 66 6c 61 67 73  cords. The flags
1b380 20 66 69 65 6c 64 20 69 73 20 63 6c 65 61 72 65   field is cleare
1b390 64 2e 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74  d. The page foot
1b3a0 65 72 20 70 6f 69 6e 74 65 72 20 66 69 65 6c 64  er pointer field
1b3b0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 69 46  .** is set to iF
1b3c0 50 74 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  Ptr..**.** If su
1b3d0 63 63 65 73 73 66 75 6c 2c 20 4c 53 4d 5f 4f 4b  ccessful, LSM_OK
1b3e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1b3f0 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
1b400 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
1b410 63 20 69 6e 74 20 6d 65 72 67 65 57 6f 72 6b 65  c int mergeWorke
1b420 72 4e 65 78 74 50 61 67 65 28 0a 20 20 4d 65 72  rNextPage(.  Mer
1b430 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57 2c 20 20  geWorker *pMW,  
1b440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b450 4d 65 72 67 65 20 77 6f 72 6b 65 72 20 6f 62 6a  Merge worker obj
1b460 65 63 74 20 74 6f 20 61 70 70 65 6e 64 20 70 61  ect to append pa
1b470 67 65 20 74 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20  ge to */.  Pgno 
1b480 69 46 50 74 72 20 20 20 20 20 20 20 20 20 20 20  iFPtr           
1b490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1b4a0 69 6e 74 65 72 20 76 61 6c 75 65 20 66 6f 72 20  inter value for 
1b4b0 66 6f 6f 74 65 72 20 6f 66 20 6e 65 77 20 70 61  footer of new pa
1b4c0 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ge */.){.  int r
1b4d0 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20  c = LSM_OK;     
1b4e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b4f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50  turn code */.  P
1b500 61 67 65 20 2a 70 4e 65 78 74 20 3d 20 30 3b 20  age *pNext = 0; 
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b520 2a 20 4e 65 77 20 70 61 67 65 20 61 70 70 65 6e  * New page appen
1b530 64 65 64 20 74 6f 20 72 75 6e 20 2a 2f 0a 20 20  ded to run */.  
1b540 6c 73 6d 5f 64 62 20 2a 70 44 62 20 3d 20 70 4d  lsm_db *pDb = pM
1b550 57 2d 3e 70 44 62 3b 20 20 20 20 20 20 20 20 20  W->pDb;         
1b560 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
1b570 6c 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 6c 73  le */..  rc = ls
1b580 6d 46 73 53 6f 72 74 65 64 41 70 70 65 6e 64 28  mFsSortedAppend(
1b590 70 44 62 2d 3e 70 46 53 2c 20 70 44 62 2d 3e 70  pDb->pFS, pDb->p
1b5a0 57 6f 72 6b 65 72 2c 20 70 4d 57 2d 3e 70 4c 65  Worker, pMW->pLe
1b5b0 76 65 6c 2c 20 30 2c 20 26 70 4e 65 78 74 29 3b  vel, 0, &pNext);
1b5c0 0a 20 20 61 73 73 65 72 74 28 20 72 63 20 7c 7c  .  assert( rc ||
1b5d0 20 70 4d 57 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68   pMW->pLevel->lh
1b5e0 73 2e 69 46 69 72 73 74 3e 30 20 7c 7c 20 70 4d  s.iFirst>0 || pM
1b5f0 57 2d 3e 70 44 62 2d 3e 63 6f 6d 70 72 65 73 73  W->pDb->compress
1b600 2e 78 43 6f 6d 70 72 65 73 73 20 29 3b 0a 0a 20  .xCompress );.. 
1b610 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
1b620 29 7b 0a 20 20 20 20 75 38 20 2a 61 44 61 74 61  ){.    u8 *aData
1b630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b640 20 20 20 20 20 2f 2a 20 44 61 74 61 20 62 75 66       /* Data buf
1b650 66 65 72 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  fer belonging to
1b660 20 70 61 67 65 20 70 4e 65 78 74 20 2a 2f 0a 20   page pNext */. 
1b670 20 20 20 69 6e 74 20 6e 44 61 74 61 3b 20 20 20     int nData;   
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 44 61 74   /* Size of aDat
1b6a0 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  a[] in bytes */.
1b6b0 0a 20 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57  .    rc = mergeW
1b6c0 6f 72 6b 65 72 50 65 72 73 69 73 74 41 6e 64 52  orkerPersistAndR
1b6d0 65 6c 65 61 73 65 28 70 4d 57 29 3b 0a 0a 20 20  elease(pMW);..  
1b6e0 20 20 70 4d 57 2d 3e 70 50 61 67 65 20 3d 20 70    pMW->pPage = p
1b6f0 4e 65 78 74 3b 0a 20 20 20 20 70 4d 57 2d 3e 70  Next;.    pMW->p
1b700 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65 2d 3e 69  Level->pMerge->i
1b710 4f 75 74 70 75 74 4f 66 66 20 3d 20 30 3b 0a 20  OutputOff = 0;. 
1b720 20 20 20 61 44 61 74 61 20 3d 20 66 73 50 61 67     aData = fsPag
1b730 65 44 61 74 61 28 70 4e 65 78 74 2c 20 26 6e 44  eData(pNext, &nD
1b740 61 74 61 29 3b 0a 20 20 20 20 6c 73 6d 50 75 74  ata);.    lsmPut
1b750 55 31 36 28 26 61 44 61 74 61 5b 53 45 47 4d 45  U16(&aData[SEGME
1b760 4e 54 5f 4e 52 45 43 4f 52 44 5f 4f 46 46 53 45  NT_NRECORD_OFFSE
1b770 54 28 6e 44 61 74 61 29 5d 2c 20 30 29 3b 0a 20  T(nData)], 0);. 
1b780 20 20 20 6c 73 6d 50 75 74 55 31 36 28 26 61 44     lsmPutU16(&aD
1b790 61 74 61 5b 53 45 47 4d 45 4e 54 5f 46 4c 41 47  ata[SEGMENT_FLAG
1b7a0 53 5f 4f 46 46 53 45 54 28 6e 44 61 74 61 29 5d  S_OFFSET(nData)]
1b7b0 2c 20 30 29 3b 0a 20 20 20 20 6c 73 6d 50 75 74  , 0);.    lsmPut
1b7c0 55 36 34 28 26 61 44 61 74 61 5b 53 45 47 4d 45  U64(&aData[SEGME
1b7d0 4e 54 5f 50 4f 49 4e 54 45 52 5f 4f 46 46 53 45  NT_POINTER_OFFSE
1b7e0 54 28 6e 44 61 74 61 29 5d 2c 20 69 46 50 74 72  T(nData)], iFPtr
1b7f0 29 3b 0a 20 20 20 20 70 4d 57 2d 3e 6e 57 6f 72  );.    pMW->nWor
1b800 6b 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  k++;.  }..  retu
1b810 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b820 57 72 69 74 65 20 61 20 62 6c 6f 62 20 6f 66 20  Write a blob of 
1b830 64 61 74 61 20 69 6e 74 6f 20 61 6e 20 6f 75 74  data into an out
1b840 70 75 74 20 73 65 67 6d 65 6e 74 20 62 65 69 6e  put segment bein
1b850 67 20 70 6f 70 75 6c 61 74 65 64 20 62 79 20 61  g populated by a
1b860 20 0a 2a 2a 20 6d 65 72 67 65 2d 77 6f 72 6b 65   .** merge-worke
1b870 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 72 67  r object. If arg
1b880 75 6d 65 6e 74 20 62 53 65 70 20 69 73 20 74 72  ument bSep is tr
1b890 75 65 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 74  ue, write into t
1b8a0 68 65 20 73 65 70 61 72 61 74 6f 72 73 0a 2a 2a  he separators.**
1b8b0 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
1b8c0 65 2c 20 74 68 65 20 6d 61 69 6e 20 61 72 72 61  e, the main arra
1b8d0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  y..**.** This fu
1b8e0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
1b8f0 6f 20 77 72 69 74 65 20 74 68 65 20 62 6c 6f 62  o write the blob
1b900 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 6b 65  s of data for ke
1b910 79 73 20 61 6e 64 20 76 61 6c 75 65 73 2e 0a 2a  ys and values..*
1b920 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 72  /.static int mer
1b930 67 65 57 6f 72 6b 65 72 44 61 74 61 28 0a 20 20  geWorkerData(.  
1b940 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57  MergeWorker *pMW
1b950 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b960 2f 2a 20 4d 65 72 67 65 20 77 6f 72 6b 65 72 20  /* Merge worker 
1b970 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
1b980 62 53 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  bSep,           
1b990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b9a0 72 75 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20  rue to write to 
1b9b0 73 65 70 61 72 61 74 6f 72 73 20 72 75 6e 20 2a  separators run *
1b9c0 2f 0a 20 20 69 6e 74 20 69 46 50 74 72 2c 20 20  /.  int iFPtr,  
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9e0 20 20 20 20 2f 2a 20 46 6f 6f 74 65 72 20 70 74      /* Footer pt
1b9f0 72 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 20  r for new pages 
1ba00 2a 2f 0a 20 20 75 38 20 2a 61 57 72 69 74 65 2c  */.  u8 *aWrite,
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 64 61       /* Write da
1ba30 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66  ta from this buf
1ba40 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 72  fer */.  int nWr
1ba50 69 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ite             
1ba60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1ba70 20 6f 66 20 61 57 72 69 74 65 5b 5d 20 69 6e 20   of aWrite[] in 
1ba80 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bytes */.){.  in
1ba90 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20  t rc = LSM_OK;  
1baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bab0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1bac0 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 57 72    int nRem = nWr
1bad0 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
1bae0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1baf0 79 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 77 72  ytes still to wr
1bb00 69 74 65 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28  ite */..  while(
1bb10 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 6e   rc==LSM_OK && n
1bb20 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 4d 65 72  Rem>0 ){.    Mer
1bb30 67 65 20 2a 70 4d 65 72 67 65 20 3d 20 70 4d 57  ge *pMerge = pMW
1bb40 2d 3e 70 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65  ->pLevel->pMerge
1bb50 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b  ;.    int nCopy;
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1bb80 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
1bb90 2f 0a 20 20 20 20 75 38 20 2a 61 44 61 74 61 3b  /.    u8 *aData;
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1bbc0 6f 20 62 75 66 66 65 72 20 6f 66 20 63 75 72 72  o buffer of curr
1bbd0 65 6e 74 20 6f 75 74 70 75 74 20 70 61 67 65 20  ent output page 
1bbe0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 61 74 61  */.    int nData
1bbf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bc00 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1bc10 61 44 61 74 61 5b 5d 20 69 6e 20 62 79 74 65 73  aData[] in bytes
1bc20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 63   */.    int nRec
1bc30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bc40 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1bc50 6f 66 20 72 65 63 6f 72 64 73 20 6f 6e 20 63 75  of records on cu
1bc60 72 72 65 6e 74 20 6f 75 74 70 75 74 20 70 61 67  rrent output pag
1bc70 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66  e */.    int iOf
1bc80 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1bc90 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1bca0 20 69 6e 20 61 44 61 74 61 5b 5d 20 74 6f 20 77   in aData[] to w
1bcb0 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20  rite to */..    
1bcc0 61 73 73 65 72 74 28 20 6c 73 6d 46 73 50 61 67  assert( lsmFsPag
1bcd0 65 57 72 69 74 61 62 6c 65 28 70 4d 57 2d 3e 70  eWritable(pMW->p
1bce0 50 61 67 65 29 20 29 3b 0a 20 20 20 0a 20 20 20  Page) );.   .   
1bcf0 20 61 44 61 74 61 20 3d 20 66 73 50 61 67 65 44   aData = fsPageD
1bd00 61 74 61 28 70 4d 57 2d 3e 70 50 61 67 65 2c 20  ata(pMW->pPage, 
1bd10 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 6e 52 65  &nData);.    nRe
1bd20 63 20 3d 20 70 61 67 65 47 65 74 4e 52 65 63 28  c = pageGetNRec(
1bd30 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  aData, nData);. 
1bd40 20 20 20 69 4f 66 66 20 3d 20 70 4d 65 72 67 65     iOff = pMerge
1bd50 2d 3e 69 4f 75 74 70 75 74 4f 66 66 3b 0a 20 20  ->iOutputOff;.  
1bd60 20 20 6e 43 6f 70 79 20 3d 20 4c 53 4d 5f 4d 49    nCopy = LSM_MI
1bd70 4e 28 6e 52 65 6d 2c 20 53 45 47 4d 45 4e 54 5f  N(nRem, SEGMENT_
1bd80 45 4f 46 28 6e 44 61 74 61 2c 20 6e 52 65 63 29  EOF(nData, nRec)
1bd90 20 2d 20 69 4f 66 66 29 3b 0a 0a 20 20 20 20 6d   - iOff);..    m
1bda0 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 4f 66  emcpy(&aData[iOf
1bdb0 66 5d 2c 20 26 61 57 72 69 74 65 5b 6e 57 72 69  f], &aWrite[nWri
1bdc0 74 65 2d 6e 52 65 6d 5d 2c 20 6e 43 6f 70 79 29  te-nRem], nCopy)
1bdd0 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43  ;.    nRem -= nC
1bde0 6f 70 79 3b 0a 0a 20 20 20 20 69 66 28 20 6e 52  opy;..    if( nR
1bdf0 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  em>0 ){.      rc
1be00 20 3d 20 6d 65 72 67 65 57 6f 72 6b 65 72 4e 65   = mergeWorkerNe
1be10 78 74 50 61 67 65 28 70 4d 57 2c 20 69 46 50 74  xtPage(pMW, iFPt
1be20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
1be30 20 20 20 20 20 70 4d 65 72 67 65 2d 3e 69 4f 75       pMerge->iOu
1be40 74 70 75 74 4f 66 66 20 3d 20 69 4f 66 66 20 2b  tputOff = iOff +
1be50 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
1be60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1be70 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 65  }.../*.** The Me
1be80 72 67 65 57 6f 72 6b 65 72 20 70 61 73 73 65 64  rgeWorker passed
1be90 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
1bea0 75 6d 65 6e 74 20 69 73 20 77 6f 72 6b 69 6e 67  ument is working
1beb0 20 74 6f 20 6d 65 72 67 65 20 74 77 6f 20 6f 72   to merge two or
1bec0 0a 2a 2a 20 6d 6f 72 65 20 65 78 69 73 74 69 6e  .** more existin
1bed0 67 20 73 65 67 6d 65 6e 74 73 20 74 6f 67 65 74  g segments toget
1bee0 68 65 72 20 28 6e 6f 74 20 74 6f 20 66 6c 75 73  her (not to flus
1bef0 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 74  h an in-memory t
1bf00 72 65 65 29 2e 20 49 74 0a 2a 2a 20 68 61 73 20  ree). It.** has 
1bf10 6e 6f 74 20 79 65 74 20 77 72 69 74 74 65 6e 20  not yet written 
1bf20 74 68 65 20 66 69 72 73 74 20 6b 65 79 20 74 6f  the first key to
1bf30 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1bf40 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 2a  of the output..*
1bf50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 72  /.static int mer
1bf60 67 65 57 6f 72 6b 65 72 46 69 72 73 74 50 61 67  geWorkerFirstPag
1bf70 65 28 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70  e(MergeWorker *p
1bf80 4d 57 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  MW){.  int rc = 
1bf90 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  LSM_OK;         
1bfa0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1bfb0 20 63 6f 64 65 20 2a 2f 0a 20 20 50 61 67 65 20   code */.  Page 
1bfc0 2a 70 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  *pPg = 0;       
1bfd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1bfe0 72 73 74 20 70 61 67 65 20 6f 66 20 72 75 6e 20  rst page of run 
1bff0 70 53 65 67 20 2a 2f 0a 20 20 69 6e 74 20 69 46  pSeg */.  int iF
1c000 50 74 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Ptr = 0;        
1c010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1c020 6e 74 65 72 20 76 61 6c 75 65 20 72 65 61 64 20  nter value read 
1c030 66 72 6f 6d 20 66 6f 6f 74 65 72 20 6f 66 20 70  from footer of p
1c040 50 67 20 2a 2f 0a 20 20 4d 75 6c 74 69 43 75 72  Pg */.  MultiCur
1c050 73 6f 72 20 2a 70 43 73 72 20 3d 20 70 4d 57 2d  sor *pCsr = pMW-
1c060 3e 70 43 73 72 3b 0a 0a 20 20 61 73 73 65 72 74  >pCsr;..  assert
1c070 28 20 70 4d 57 2d 3e 70 50 61 67 65 3d 3d 30 20  ( pMW->pPage==0 
1c080 29 3b 0a 0a 20 20 69 66 28 20 70 43 73 72 2d 3e  );..  if( pCsr->
1c090 70 42 74 43 73 72 20 29 7b 0a 20 20 20 20 72 63  pBtCsr ){.    rc
1c0a0 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20 20 20 20 69   = LSM_OK;.    i
1c0b0 46 50 74 72 20 3d 20 28 69 6e 74 29 70 4d 57 2d  FPtr = (int)pMW-
1c0c0 3e 70 4c 65 76 65 6c 2d 3e 70 4e 65 78 74 2d 3e  >pLevel->pNext->
1c0d0 6c 68 73 2e 69 46 69 72 73 74 3b 0a 20 20 7d 65  lhs.iFirst;.  }e
1c0e0 6c 73 65 20 69 66 28 20 70 43 73 72 2d 3e 6e 50  lse if( pCsr->nP
1c0f0 74 72 3e 30 20 29 7b 0a 20 20 20 20 53 65 67 6d  tr>0 ){.    Segm
1c100 65 6e 74 20 2a 70 53 65 67 3b 0a 20 20 20 20 70  ent *pSeg;.    p
1c110 53 65 67 20 3d 20 70 43 73 72 2d 3e 61 50 74 72  Seg = pCsr->aPtr
1c120 5b 70 43 73 72 2d 3e 6e 50 74 72 2d 31 5d 2e 70  [pCsr->nPtr-1].p
1c130 53 65 67 3b 0a 20 20 20 20 72 63 20 3d 20 6c 73  Seg;.    rc = ls
1c140 6d 46 73 44 62 50 61 67 65 47 65 74 28 70 4d 57  mFsDbPageGet(pMW
1c150 2d 3e 70 44 62 2d 3e 70 46 53 2c 20 70 53 65 67  ->pDb->pFS, pSeg
1c160 2c 20 70 53 65 67 2d 3e 69 46 69 72 73 74 2c 20  , pSeg->iFirst, 
1c170 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  &pPg);.    if( r
1c180 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20  c==LSM_OK ){.   
1c190 20 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20     u8 *aData;   
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1b0 20 2f 2a 20 42 75 66 66 65 72 20 66 6f 72 20 70   /* Buffer for p
1c1c0 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 20 20 20  age pPg */.     
1c1d0 20 69 6e 74 20 6e 44 61 74 61 3b 20 20 20 20 20   int nData;     
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c1f0 2a 20 53 69 7a 65 20 6f 66 20 61 44 61 74 61 5b  * Size of aData[
1c200 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
1c210 20 20 20 20 61 44 61 74 61 20 3d 20 66 73 50 61      aData = fsPa
1c220 67 65 44 61 74 61 28 70 50 67 2c 20 26 6e 44 61  geData(pPg, &nDa
1c230 74 61 29 3b 0a 20 20 20 20 20 20 69 46 50 74 72  ta);.      iFPtr
1c240 20 3d 20 28 69 6e 74 29 70 61 67 65 47 65 74 50   = (int)pageGetP
1c250 74 72 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29  tr(aData, nData)
1c260 3b 0a 20 20 20 20 20 20 6c 73 6d 46 73 50 61 67  ;.      lsmFsPag
1c270 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
1c280 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1c290 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
1c2a0 20 20 72 63 20 3d 20 6d 65 72 67 65 57 6f 72 6b    rc = mergeWork
1c2b0 65 72 4e 65 78 74 50 61 67 65 28 70 4d 57 2c 20  erNextPage(pMW, 
1c2c0 69 46 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20  iFPtr);.    if( 
1c2d0 70 43 73 72 2d 3e 70 50 72 65 76 4d 65 72 67 65  pCsr->pPrevMerge
1c2e0 50 74 72 20 29 20 2a 70 43 73 72 2d 3e 70 50 72  Ptr ) *pCsr->pPr
1c2f0 65 76 4d 65 72 67 65 50 74 72 20 3d 20 69 46 50  evMergePtr = iFP
1c300 74 72 3b 0a 20 20 20 20 70 4d 57 2d 3e 61 53 61  tr;.    pMW->aSa
1c310 76 65 5b 30 5d 2e 62 53 74 6f 72 65 20 3d 20 31  ve[0].bStore = 1
1c320 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1c330 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
1c340 74 20 6d 65 72 67 65 57 6f 72 6b 65 72 57 72 69  t mergeWorkerWri
1c350 74 65 28 0a 20 20 4d 65 72 67 65 57 6f 72 6b 65  te(.  MergeWorke
1c360 72 20 2a 70 4d 57 2c 20 20 20 20 20 20 20 20 20  r *pMW,         
1c370 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 77        /* Merge w
1c380 6f 72 6b 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  orker object to 
1c390 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20  write into */.  
1c3a0 69 6e 74 20 65 54 79 70 65 2c 20 20 20 20 20 20  int eType,      
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3c0 2f 2a 20 4f 6e 65 20 6f 66 20 53 4f 52 54 45 44  /* One of SORTED
1c3d0 5f 53 45 50 41 52 41 54 4f 52 2c 20 57 52 49 54  _SEPARATOR, WRIT
1c3e0 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20  E or DELETE */. 
1c3f0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 6e 74   void *pKey, int
1c400 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
1c410 20 2f 2a 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f   /* Key value */
1c420 0a 20 20 76 6f 69 64 20 2a 70 56 61 6c 2c 20 69  .  void *pVal, i
1c430 6e 74 20 6e 56 61 6c 2c 20 20 20 20 20 20 20 20  nt nVal,        
1c440 20 20 20 2f 2a 20 56 61 6c 75 65 20 76 61 6c 75     /* Value valu
1c450 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 20  e */.  int iPtr 
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c470 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75         /* Absolu
1c480 74 65 20 76 61 6c 75 65 20 6f 66 20 70 61 67 65  te value of page
1c490 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 30 20 2a   pointer, or 0 *
1c4a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
1c4b0 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  LSM_OK;         
1c4c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1c4d0 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 72 67 65   code */.  Merge
1c4e0 20 2a 70 4d 65 72 67 65 3b 20 20 20 20 20 20 20   *pMerge;       
1c4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65             /* Pe
1c500 72 73 69 73 74 65 6e 74 20 70 61 72 74 20 6f 66  rsistent part of
1c510 20 6c 65 76 65 6c 20 6d 65 72 67 65 20 73 74 61   level merge sta
1c520 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 64 72  te */.  int nHdr
1c530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c540 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
1c550 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68   required for th
1c560 69 73 20 72 65 63 6f 72 64 20 68 65 61 64 65 72  is record header
1c570 20 2a 2f 0a 20 20 50 61 67 65 20 2a 70 50 67 3b   */.  Page *pPg;
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c590 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
1c5a0 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 75   write to */.  u
1c5b0 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  8 *aData;       
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c5d0 2a 20 44 61 74 61 20 62 75 66 66 65 72 20 66 6f  * Data buffer fo
1c5e0 72 20 70 61 67 65 20 70 57 72 69 74 65 72 2d 3e  r page pWriter->
1c5f0 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  pPage */.  int n
1c600 44 61 74 61 20 3d 20 30 3b 20 20 20 20 20 20 20  Data = 0;       
1c610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1c620 7a 65 20 6f 66 20 62 75 66 66 65 72 20 61 44 61  ze of buffer aDa
1c630 74 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f  ta[] in bytes */
1c640 0a 20 20 69 6e 74 20 6e 52 65 63 20 3d 20 30 3b  .  int nRec = 0;
1c650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c660 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c670 72 65 63 6f 72 64 73 20 6f 6e 20 70 61 67 65 20  records on page 
1c680 70 50 67 20 2a 2f 0a 20 20 69 6e 74 20 69 46 50  pPg */.  int iFP
1c690 74 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  tr = 0;         
1c6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1c6b0 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 69 6e 20  e of pointer in 
1c6c0 66 6f 6f 74 65 72 20 6f 66 20 70 50 67 20 2a 2f  footer of pPg */
1c6d0 0a 20 20 69 6e 74 20 69 52 50 74 72 20 3d 20 30  .  int iRPtr = 0
1c6e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c6f0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
1c700 6f 69 6e 74 65 72 20 77 72 69 74 74 65 6e 20 69  ointer written i
1c710 6e 74 6f 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  nto record */.  
1c720 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20 20 20  int iOff = 0;   
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c740 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
1c750 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 70   offset within p
1c760 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 53 65 67  age pPg */.  Seg
1c770 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c790 53 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72  Segment being wr
1c7a0 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 66  itten */.  int f
1c7b0 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
1c7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1c7d0 20 21 3d 20 30 2c 20 66 6c 61 67 73 20 76 61 6c   != 0, flags val
1c7e0 75 65 20 66 6f 72 20 70 61 67 65 20 66 6f 6f 74  ue for page foot
1c7f0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 46 69 72  er */.  int bFir
1c800 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
1c810 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1c820 66 6f 72 20 66 69 72 73 74 20 6b 65 79 20 6f 66  for first key of
1c830 20 6f 75 74 70 75 74 20 72 75 6e 20 2a 2f 0a 0a   output run */..
1c840 20 20 70 4d 65 72 67 65 20 3d 20 70 4d 57 2d 3e    pMerge = pMW->
1c850 70 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65 3b 20  pLevel->pMerge; 
1c860 20 20 20 0a 20 20 70 53 65 67 20 3d 20 26 70 4d     .  pSeg = &pM
1c870 57 2d 3e 70 4c 65 76 65 6c 2d 3e 6c 68 73 3b 0a  W->pLevel->lhs;.
1c880 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 69 46 69  .  if( pSeg->iFi
1c890 72 73 74 3d 3d 30 20 26 26 20 70 4d 57 2d 3e 70  rst==0 && pMW->p
1c8a0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Page==0 ){.    r
1c8b0 63 20 3d 20 6d 65 72 67 65 57 6f 72 6b 65 72 46  c = mergeWorkerF
1c8c0 69 72 73 74 50 61 67 65 28 70 4d 57 29 3b 0a 20  irstPage(pMW);. 
1c8d0 20 20 20 62 46 69 72 73 74 20 3d 20 31 3b 0a 20     bFirst = 1;. 
1c8e0 20 7d 0a 20 20 70 50 67 20 3d 20 70 4d 57 2d 3e   }.  pPg = pMW->
1c8f0 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70 50 67  pPage;.  if( pPg
1c900 20 29 7b 0a 20 20 20 20 61 44 61 74 61 20 3d 20   ){.    aData = 
1c910 66 73 50 61 67 65 44 61 74 61 28 70 50 67 2c 20  fsPageData(pPg, 
1c920 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 6e 52 65  &nData);.    nRe
1c930 63 20 3d 20 70 61 67 65 47 65 74 4e 52 65 63 28  c = pageGetNRec(
1c940 61 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  aData, nData);. 
1c950 20 20 20 69 46 50 74 72 20 3d 20 28 69 6e 74 29     iFPtr = (int)
1c960 70 61 67 65 47 65 74 50 74 72 28 61 44 61 74 61  pageGetPtr(aData
1c970 2c 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 52  , nData);.    iR
1c980 50 74 72 20 3d 20 69 50 74 72 20 2d 20 69 46 50  Ptr = iPtr - iFP
1c990 74 72 3b 0a 20 20 7d 0a 20 20 20 20 20 0a 20 20  tr;.  }.     .  
1c9a0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1c9b0 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
1c9c0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
1c9d0 6e 65 77 20 72 65 63 6f 72 64 2e 20 54 68 65 20  new record. The 
1c9e0 73 70 61 63 65 0a 20 20 2a 2a 20 72 65 71 75 69  space.  ** requi
1c9f0 72 65 64 20 69 73 20 64 69 76 69 64 65 64 20 69  red is divided i
1ca00 6e 74 6f 20 74 77 6f 20 73 65 63 74 69 6f 6e 73  nto two sections
1ca10 3a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  : the header and
1ca20 20 74 68 65 20 62 6f 64 79 2e 20 54 68 65 0a 20   the body. The. 
1ca30 20 2a 2a 20 68 65 61 64 65 72 20 63 6f 6e 73 69   ** header consi
1ca40 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 69 61  sts of the intia
1ca50 6c 20 76 61 72 69 6e 74 20 66 69 65 6c 64 73 2e  l varint fields.
1ca60 20 54 68 65 20 62 6f 64 79 20 61 72 65 20 74 68   The body are th
1ca70 65 20 62 6c 6f 62 73 20 0a 20 20 2a 2a 20 6f 66  e blobs .  ** of
1ca80 20 64 61 74 61 20 74 68 61 74 20 63 6f 72 72 65   data that corre
1ca90 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 6b 65 79  spond to the key
1caa0 20 61 6e 64 20 76 61 6c 75 65 20 64 61 74 61 2e   and value data.
1cab0 20 54 68 65 20 65 6e 74 69 72 65 20 68 65 61 64   The entire head
1cac0 65 72 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65  er .  ** must be
1cad0 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 70   stored on the p
1cae0 61 67 65 2e 20 54 68 65 20 62 6f 64 79 20 6d 61  age. The body ma
1caf0 79 20 6f 76 65 72 66 6c 6f 77 20 6f 6e 74 6f 20  y overflow onto 
1cb00 74 68 65 20 6e 65 78 74 20 61 6e 64 0a 20 20 2a  the next and.  *
1cb10 2a 20 73 75 62 73 65 71 75 65 6e 74 20 70 61 67  * subsequent pag
1cb20 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
1cb30 65 20 68 65 61 64 65 72 20 73 70 61 63 65 20 69  e header space i
1cb40 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
1cb50 20 31 29 20 72 65 63 6f 72 64 20 74 79 70 65 20   1) record type 
1cb60 2d 20 31 20 62 79 74 65 2e 0a 20 20 2a 2a 20 20  - 1 byte..  **  
1cb70 20 20 20 32 29 20 50 61 67 65 2d 70 6f 69 6e 74     2) Page-point
1cb80 65 72 2d 6f 66 66 73 65 74 20 2d 20 31 20 76 61  er-offset - 1 va
1cb90 72 69 6e 74 0a 20 20 2a 2a 20 20 20 20 20 33 29  rint.  **     3)
1cba0 20 4b 65 79 20 73 69 7a 65 20 2d 20 31 20 76 61   Key size - 1 va
1cbb0 72 69 6e 74 0a 20 20 2a 2a 20 20 20 20 20 34 29  rint.  **     4)
1cbc0 20 56 61 6c 75 65 20 73 69 7a 65 20 2d 20 31 20   Value size - 1 
1cbd0 76 61 72 69 6e 74 20 28 6f 6e 6c 79 20 69 66 20  varint (only if 
1cbe0 4c 53 4d 5f 49 4e 53 45 52 54 20 66 6c 61 67 20  LSM_INSERT flag 
1cbf0 69 73 20 73 65 74 29 0a 20 20 2a 2f 0a 20 20 69  is set).  */.  i
1cc00 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc==LSM_OK ){
1cc10 0a 20 20 20 20 6e 48 64 72 20 3d 20 31 20 2b 20  .    nHdr = 1 + 
1cc20 6c 73 6d 56 61 72 69 6e 74 4c 65 6e 33 32 28 69  lsmVarintLen32(i
1cc30 52 50 74 72 29 20 2b 20 6c 73 6d 56 61 72 69 6e  RPtr) + lsmVarin
1cc40 74 4c 65 6e 33 32 28 6e 4b 65 79 29 3b 0a 20 20  tLen32(nKey);.  
1cc50 20 20 69 66 28 20 72 74 49 73 57 72 69 74 65 28    if( rtIsWrite(
1cc60 65 54 79 70 65 29 20 29 20 6e 48 64 72 20 2b 3d  eType) ) nHdr +=
1cc70 20 6c 73 6d 56 61 72 69 6e 74 4c 65 6e 33 32 28   lsmVarintLen32(
1cc80 6e 56 61 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  nVal);..    /* I
1cc90 66 20 74 68 65 20 65 6e 74 69 72 65 20 68 65 61  f the entire hea
1cca0 64 65 72 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  der will not fit
1ccb0 20 6f 6e 20 70 61 67 65 20 70 50 67 2c 20 6f 72   on page pPg, or
1ccc0 20 69 66 20 70 61 67 65 20 70 50 67 20 69 73 20   if page pPg is 
1ccd0 0a 20 20 20 20 2a 2a 20 6d 61 72 6b 65 64 20 72  .    ** marked r
1cce0 65 61 64 2d 6f 6e 6c 79 2c 20 61 64 76 61 6e 63  ead-only, advanc
1ccf0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 70 61  e to the next pa
1cd00 67 65 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ge of the output
1cd10 20 72 75 6e 2e 20 2a 2f 0a 20 20 20 20 69 4f 66   run. */.    iOf
1cd20 66 20 3d 20 70 4d 65 72 67 65 2d 3e 69 4f 75 74  f = pMerge->iOut
1cd30 70 75 74 4f 66 66 3b 0a 20 20 20 20 69 66 28 20  putOff;.    if( 
1cd40 69 4f 66 66 3c 30 20 7c 7c 20 70 50 67 3d 3d 30  iOff<0 || pPg==0
1cd50 20 7c 7c 20 69 4f 66 66 2b 6e 48 64 72 20 3e 20   || iOff+nHdr > 
1cd60 53 45 47 4d 45 4e 54 5f 45 4f 46 28 6e 44 61 74  SEGMENT_EOF(nDat
1cd70 61 2c 20 6e 52 65 63 2b 31 29 20 29 7b 0a 20 20  a, nRec+1) ){.  
1cd80 20 20 20 20 69 46 50 74 72 20 3d 20 28 69 6e 74      iFPtr = (int
1cd90 29 2a 70 4d 57 2d 3e 70 43 73 72 2d 3e 70 50 72  )*pMW->pCsr->pPr
1cda0 65 76 4d 65 72 67 65 50 74 72 3b 0a 20 20 20 20  evMergePtr;.    
1cdb0 20 20 69 52 50 74 72 20 3d 20 69 50 74 72 20 2d    iRPtr = iPtr -
1cdc0 20 69 46 50 74 72 3b 0a 20 20 20 20 20 20 69 4f   iFPtr;.      iO
1cdd0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 52  ff = 0;.      nR
1cde0 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ec = 0;.      rc
1cdf0 20 3d 20 6d 65 72 67 65 57 6f 72 6b 65 72 4e 65   = mergeWorkerNe
1ce00 78 74 50 61 67 65 28 70 4d 57 2c 20 69 46 50 74  xtPage(pMW, iFPt
1ce10 72 29 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20  r);.      pPg = 
1ce20 70 4d 57 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  pMW->pPage;.    
1ce30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1ce40 68 69 73 20 72 65 63 6f 72 64 20 68 65 61 64 65  his record heade
1ce50 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69  r will be the fi
1ce60 72 73 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  rst on the page,
1ce70 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
1ce80 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 76   .  ** not the v
1ce90 65 72 79 20 66 69 72 73 74 20 69 6e 20 74 68 65  ery first in the
1cea0 20 65 6e 74 69 72 65 20 72 75 6e 2c 20 61 64 64   entire run, add
1ceb0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6b   a copy of the k
1cec0 65 79 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62  ey to the.  ** b
1ced0 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 2e  -tree hierarchy.
1cee0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
1cef0 4c 53 4d 5f 4f 4b 20 26 26 20 6e 52 65 63 3d 3d  LSM_OK && nRec==
1cf00 30 20 26 26 20 62 46 69 72 73 74 3d 3d 30 20 29  0 && bFirst==0 )
1cf10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
1cf20 65 72 67 65 2d 3e 6e 53 6b 69 70 3e 3d 30 20 29  erge->nSkip>=0 )
1cf30 3b 0a 0a 20 20 20 20 69 66 28 20 70 4d 65 72 67  ;..    if( pMerg
1cf40 65 2d 3e 6e 53 6b 69 70 3d 3d 30 20 29 7b 0a 20  e->nSkip==0 ){. 
1cf50 20 20 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57       rc = mergeW
1cf60 6f 72 6b 65 72 50 75 73 68 48 69 65 72 61 72 63  orkerPushHierarc
1cf70 68 79 28 70 4d 57 2c 20 72 74 54 6f 70 69 63 28  hy(pMW, rtTopic(
1cf80 65 54 79 70 65 29 2c 20 70 4b 65 79 2c 20 6e 4b  eType), pKey, nK
1cf90 65 79 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ey);.      asser
1cfa0 74 28 20 70 4d 57 2d 3e 61 53 61 76 65 5b 30 5d  t( pMW->aSave[0]
1cfb0 2e 62 53 74 6f 72 65 3d 3d 30 20 29 3b 0a 20 20  .bStore==0 );.  
1cfc0 20 20 20 20 70 4d 57 2d 3e 61 53 61 76 65 5b 30      pMW->aSave[0
1cfd0 5d 2e 62 53 74 6f 72 65 20 3d 20 31 3b 0a 20 20  ].bStore = 1;.  
1cfe0 20 20 20 20 70 4d 65 72 67 65 2d 3e 6e 53 6b 69      pMerge->nSki
1cff0 70 20 3d 20 6b 65 79 73 7a 54 6f 53 6b 69 70 28  p = keyszToSkip(
1d000 70 4d 57 2d 3e 70 44 62 2d 3e 70 46 53 2c 20 6e  pMW->pDb->pFS, n
1d010 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Key);.    }else{
1d020 0a 20 20 20 20 20 20 70 4d 65 72 67 65 2d 3e 6e  .      pMerge->n
1d030 53 6b 69 70 2d 2d 3b 0a 20 20 20 20 20 20 66 6c  Skip--;.      fl
1d040 61 67 73 20 3d 20 50 47 46 54 52 5f 53 4b 49 50  ags = PGFTR_SKIP
1d050 5f 54 48 49 53 5f 46 4c 41 47 3b 0a 20 20 20 20  _THIS_FLAG;.    
1d060 7d 0a 0a 20 20 20 20 69 66 28 20 70 4d 65 72 67  }..    if( pMerg
1d070 65 2d 3e 6e 53 6b 69 70 20 29 20 66 6c 61 67 73  e->nSkip ) flags
1d080 20 7c 3d 20 50 47 46 54 52 5f 53 4b 49 50 5f 4e   |= PGFTR_SKIP_N
1d090 45 58 54 5f 46 4c 41 47 3b 0a 20 20 7d 0a 0a 20  EXT_FLAG;.  }.. 
1d0a0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 6f   /* Update the o
1d0b0 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f  utput segment */
1d0c0 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f  .  if( rc==LSM_O
1d0d0 4b 20 29 7b 0a 20 20 20 20 61 44 61 74 61 20 3d  K ){.    aData =
1d0e0 20 66 73 50 61 67 65 44 61 74 61 28 70 50 67 2c   fsPageData(pPg,
1d0f0 20 26 6e 44 61 74 61 29 3b 0a 0a 20 20 20 20 2f   &nData);..    /
1d100 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67  * Update the pag
1d110 65 20 66 6f 6f 74 65 72 2e 20 2a 2f 0a 20 20 20  e footer. */.   
1d120 20 6c 73 6d 50 75 74 55 31 36 28 26 61 44 61 74   lsmPutU16(&aDat
1d130 61 5b 53 45 47 4d 45 4e 54 5f 4e 52 45 43 4f 52  a[SEGMENT_NRECOR
1d140 44 5f 4f 46 46 53 45 54 28 6e 44 61 74 61 29 5d  D_OFFSET(nData)]
1d150 2c 20 28 75 31 36 29 28 6e 52 65 63 2b 31 29 29  , (u16)(nRec+1))
1d160 3b 0a 20 20 20 20 6c 73 6d 50 75 74 55 31 36 28  ;.    lsmPutU16(
1d170 26 61 44 61 74 61 5b 53 45 47 4d 45 4e 54 5f 43  &aData[SEGMENT_C
1d180 45 4c 4c 50 54 52 5f 4f 46 46 53 45 54 28 6e 44  ELLPTR_OFFSET(nD
1d190 61 74 61 2c 20 6e 52 65 63 29 5d 2c 20 28 75 31  ata, nRec)], (u1
1d1a0 36 29 69 4f 66 66 29 3b 0a 20 20 20 20 69 66 28  6)iOff);.    if(
1d1b0 20 66 6c 61 67 73 20 29 20 6c 73 6d 50 75 74 55   flags ) lsmPutU
1d1c0 31 36 28 26 61 44 61 74 61 5b 53 45 47 4d 45 4e  16(&aData[SEGMEN
1d1d0 54 5f 46 4c 41 47 53 5f 4f 46 46 53 45 54 28 6e  T_FLAGS_OFFSET(n
1d1e0 44 61 74 61 29 5d 2c 20 28 75 31 36 29 66 6c 61  Data)], (u16)fla
1d1f0 67 73 29 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69  gs);..    /* Wri
1d200 74 65 20 74 68 65 20 65 6e 74 72 79 20 68 65 61  te the entry hea
1d210 64 65 72 20 69 6e 74 6f 20 74 68 65 20 63 75 72  der into the cur
1d220 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
1d230 20 20 61 44 61 74 61 5b 69 4f 66 66 2b 2b 5d 20    aData[iOff++] 
1d240 3d 20 28 75 38 29 65 54 79 70 65 3b 20 20 20 20  = (u8)eType;    
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 20 20 20 20 20 20 20                  
1d270 20 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20         /* 1 */. 
1d280 20 20 20 69 4f 66 66 20 2b 3d 20 6c 73 6d 56 61     iOff += lsmVa
1d290 72 69 6e 74 50 75 74 33 32 28 26 61 44 61 74 61  rintPut32(&aData
1d2a0 5b 69 4f 66 66 5d 2c 20 69 52 50 74 72 29 3b 20  [iOff], iRPtr); 
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2c0 20 20 20 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a          /* 2 */.
1d2d0 20 20 20 20 69 4f 66 66 20 2b 3d 20 6c 73 6d 56      iOff += lsmV
1d2e0 61 72 69 6e 74 50 75 74 33 32 28 26 61 44 61 74  arintPut32(&aDat
1d2f0 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 79 29 3b 20  a[iOff], nKey); 
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d310 20 20 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f           /* 3 */
1d320 0a 20 20 20 20 69 66 28 20 72 74 49 73 57 72 69  .    if( rtIsWri
1d330 74 65 28 65 54 79 70 65 29 20 29 20 69 4f 66 66  te(eType) ) iOff
1d340 20 2b 3d 20 6c 73 6d 56 61 72 69 6e 74 50 75 74   += lsmVarintPut
1d350 33 32 28 26 61 44 61 74 61 5b 69 4f 66 66 5d 2c  32(&aData[iOff],
1d360 20 6e 56 61 6c 29 3b 20 20 20 2f 2a 20 34 20 2a   nVal);   /* 4 *
1d370 2f 0a 20 20 20 20 70 4d 65 72 67 65 2d 3e 69 4f  /.    pMerge->iO
1d380 75 74 70 75 74 4f 66 66 20 3d 20 69 4f 66 66 3b  utputOff = iOff;
1d390 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  ..    /* Write t
1d3a0 68 65 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  he key and data 
1d3b0 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74  into the segment
1d3c0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1d3d0 20 69 46 50 74 72 3d 3d 70 61 67 65 47 65 74 50   iFPtr==pageGetP
1d3e0 74 72 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29  tr(aData, nData)
1d3f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 65 72   );.    rc = mer
1d400 67 65 57 6f 72 6b 65 72 44 61 74 61 28 70 4d 57  geWorkerData(pMW
1d410 2c 20 30 2c 20 69 46 50 74 72 2b 69 52 50 74 72  , 0, iFPtr+iRPtr
1d420 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , pKey, nKey);. 
1d430 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
1d440 4b 20 26 26 20 72 74 49 73 57 72 69 74 65 28 65  K && rtIsWrite(e
1d450 54 79 70 65 29 20 29 7b 0a 20 20 20 20 20 20 69  Type) ){.      i
1d460 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc==LSM_OK ){
1d470 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65  .        rc = me
1d480 72 67 65 57 6f 72 6b 65 72 44 61 74 61 28 70 4d  rgeWorkerData(pM
1d490 57 2c 20 30 2c 20 69 46 50 74 72 2b 69 52 50 74  W, 0, iFPtr+iRPt
1d4a0 72 2c 20 70 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a  r, pVal, nVal);.
1d4b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d4c0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1d4d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  }.../*.** Free a
1d4e0 6c 6c 20 72 65 73 6f 75 72 63 65 73 20 61 6c 6c  ll resources all
1d4f0 6f 63 61 74 65 64 20 62 79 20 6d 65 72 67 65 57  ocated by mergeW
1d500 6f 72 6b 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a  orkerInit()..*/.
1d510 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 72 67  static void merg
1d520 65 57 6f 72 6b 65 72 53 68 75 74 64 6f 77 6e 28  eWorkerShutdown(
1d530 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57  MergeWorker *pMW
1d540 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69  , int *pRc){.  i
1d550 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d570 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
1d580 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ble */.  int rc 
1d590 3d 20 2a 70 52 63 3b 0a 20 20 4d 75 6c 74 69 43  = *pRc;.  MultiC
1d5a0 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 70 4d  ursor *pCsr = pM
1d5b0 57 2d 3e 70 43 73 72 3b 0a 0a 20 20 2f 2a 20 55  W->pCsr;..  /* U
1d5c0 6e 6c 65 73 73 20 74 68 65 20 6d 65 72 67 65 20  nless the merge 
1d5d0 68 61 73 20 66 69 6e 69 73 68 65 64 2c 20 73 61  has finished, sa
1d5e0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ve the cursor po
1d5f0 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  sition in the.  
1d600 2a 2a 20 4d 65 72 67 65 2e 61 49 6e 70 75 74 5b  ** Merge.aInput[
1d610 5d 20 61 72 72 61 79 2e 20 53 65 65 20 66 75 6e  ] array. See fun
1d620 63 74 69 6f 6e 20 6d 65 72 67 65 57 6f 72 6b 65  ction mergeWorke
1d630 72 49 6e 69 74 28 29 20 66 6f 72 20 74 68 65 20  rInit() for the 
1d640 0a 20 20 2a 2a 20 63 6f 64 65 20 74 6f 20 72 65  .  ** code to re
1d650 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72 20 70  store a cursor p
1d660 6f 73 69 74 69 6f 6e 20 62 61 73 65 64 20 6f 6e  osition based on
1d670 20 61 49 6e 70 75 74 5b 5d 2e 20 20 2a 2f 0a 20   aInput[].  */. 
1d680 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
1d690 26 26 20 70 43 73 72 20 26 26 20 6c 73 6d 4d 43  && pCsr && lsmMC
1d6a0 75 72 73 6f 72 56 61 6c 69 64 28 70 43 73 72 29  ursorValid(pCsr)
1d6b0 20 29 7b 0a 20 20 20 20 4d 65 72 67 65 20 2a 70   ){.    Merge *p
1d6c0 4d 65 72 67 65 20 3d 20 70 4d 57 2d 3e 70 4c 65  Merge = pMW->pLe
1d6d0 76 65 6c 2d 3e 70 4d 65 72 67 65 3b 0a 20 20 20  vel->pMerge;.   
1d6e0 20 69 6e 74 20 62 42 74 72 65 65 20 3d 20 28 70   int bBtree = (p
1d6f0 43 73 72 2d 3e 70 42 74 43 73 72 21 3d 30 29 3b  Csr->pBtCsr!=0);
1d700 0a 20 20 20 20 69 6e 74 20 69 50 74 72 3b 0a 0a  .    int iPtr;..
1d710 20 20 20 20 2f 2a 20 70 4d 65 72 67 65 2d 3e 6e      /* pMerge->n
1d720 49 6e 70 75 74 3d 3d 30 20 69 6e 64 69 63 61 74  Input==0 indicat
1d730 65 73 20 74 68 61 74 20 74 68 69 73 20 69 73 20  es that this is 
1d740 61 20 46 6c 75 73 68 54 72 65 65 28 29 20 6f 70  a FlushTree() op
1d750 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  eration. */.    
1d760 61 73 73 65 72 74 28 20 70 4d 65 72 67 65 2d 3e  assert( pMerge->
1d770 6e 49 6e 70 75 74 3d 3d 30 20 7c 7c 20 70 4d 57  nInput==0 || pMW
1d780 2d 3e 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74  ->pLevel->nRight
1d790 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
1d7a0 28 20 70 4d 65 72 67 65 2d 3e 6e 49 6e 70 75 74  ( pMerge->nInput
1d7b0 3d 3d 30 20 7c 7c 20 70 4d 65 72 67 65 2d 3e 6e  ==0 || pMerge->n
1d7c0 49 6e 70 75 74 3d 3d 28 70 43 73 72 2d 3e 6e 50  Input==(pCsr->nP
1d7d0 74 72 2b 62 42 74 72 65 65 29 20 29 3b 0a 0a 20  tr+bBtree) );.. 
1d7e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 70     for(i=0; i<(p
1d7f0 4d 65 72 67 65 2d 3e 6e 49 6e 70 75 74 2d 62 42  Merge->nInput-bB
1d800 74 72 65 65 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  tree); i++){.   
1d810 20 20 20 53 65 67 6d 65 6e 74 50 74 72 20 2a 70     SegmentPtr *p
1d820 50 74 72 20 3d 20 26 70 43 73 72 2d 3e 61 50 74  Ptr = &pCsr->aPt
1d830 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
1d840 70 50 74 72 2d 3e 70 50 67 20 29 7b 0a 20 20 20  pPtr->pPg ){.   
1d850 20 20 20 20 20 70 4d 65 72 67 65 2d 3e 61 49 6e       pMerge->aIn
1d860 70 75 74 5b 69 5d 2e 69 50 67 20 3d 20 6c 73 6d  put[i].iPg = lsm
1d870 46 73 50 61 67 65 4e 75 6d 62 65 72 28 70 50 74  FsPageNumber(pPt
1d880 72 2d 3e 70 50 67 29 3b 0a 20 20 20 20 20 20 20  r->pPg);.       
1d890 20 70 4d 65 72 67 65 2d 3e 61 49 6e 70 75 74 5b   pMerge->aInput[
1d8a0 69 5d 2e 69 43 65 6c 6c 20 3d 20 70 50 74 72 2d  i].iCell = pPtr-
1d8b0 3e 69 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 65  >iCell;.      }e
1d8c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
1d8d0 72 67 65 2d 3e 61 49 6e 70 75 74 5b 69 5d 2e 69  rge->aInput[i].i
1d8e0 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Pg = 0;.        
1d8f0 70 4d 65 72 67 65 2d 3e 61 49 6e 70 75 74 5b 69  pMerge->aInput[i
1d900 5d 2e 69 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20  ].iCell = 0;.   
1d910 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1d920 66 28 20 62 42 74 72 65 65 20 26 26 20 70 4d 65  f( bBtree && pMe
1d930 72 67 65 2d 3e 6e 49 6e 70 75 74 20 29 7b 0a 20  rge->nInput ){. 
1d940 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
1d950 70 43 73 72 2d 3e 6e 50 74 72 20 29 3b 0a 20 20  pCsr->nPtr );.  
1d960 20 20 20 20 62 74 72 65 65 43 75 72 73 6f 72 50      btreeCursorP
1d970 6f 73 69 74 69 6f 6e 28 70 43 73 72 2d 3e 70 42  osition(pCsr->pB
1d980 74 43 73 72 2c 20 26 70 4d 65 72 67 65 2d 3e 61  tCsr, &pMerge->a
1d990 49 6e 70 75 74 5b 69 5d 29 3b 0a 20 20 20 20 7d  Input[i]);.    }
1d9a0 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
1d9b0 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 74  he location of t
1d9c0 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a  he split-key */.
1d9d0 20 20 20 20 69 50 74 72 20 3d 20 70 43 73 72 2d      iPtr = pCsr-
1d9e0 3e 61 54 72 65 65 5b 31 5d 20 2d 20 43 55 52 53  >aTree[1] - CURS
1d9f0 4f 52 5f 44 41 54 41 5f 53 45 47 4d 45 4e 54 3b  OR_DATA_SEGMENT;
1da00 0a 20 20 20 20 69 66 28 20 69 50 74 72 3c 70 43  .    if( iPtr<pC
1da10 73 72 2d 3e 6e 50 74 72 20 29 7b 0a 20 20 20 20  sr->nPtr ){.    
1da20 20 20 70 4d 65 72 67 65 2d 3e 73 70 6c 69 74 6b    pMerge->splitk
1da30 65 79 20 3d 20 70 4d 65 72 67 65 2d 3e 61 49 6e  ey = pMerge->aIn
1da40 70 75 74 5b 69 50 74 72 5d 3b 0a 20 20 20 20 7d  put[iPtr];.    }
1da50 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 74 72 65  else{.      btre
1da60 65 43 75 72 73 6f 72 53 70 6c 69 74 6b 65 79 28  eCursorSplitkey(
1da70 70 43 73 72 2d 3e 70 42 74 43 73 72 2c 20 26 70  pCsr->pBtCsr, &p
1da80 4d 65 72 67 65 2d 3e 73 70 6c 69 74 6b 65 79 29  Merge->splitkey)
1da90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20  ;.    }.    .   
1daa0 20 70 4d 65 72 67 65 2d 3e 69 4f 75 74 70 75 74   pMerge->iOutput
1dab0 4f 66 66 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  Off = -1;.  }.. 
1dac0 20 6c 73 6d 4d 43 75 72 73 6f 72 43 6c 6f 73 65   lsmMCursorClose
1dad0 28 70 43 73 72 2c 20 30 29 3b 0a 0a 20 20 2f 2a  (pCsr, 0);..  /*
1dae0 20 50 65 72 73 69 73 74 20 61 6e 64 20 72 65 6c   Persist and rel
1daf0 65 61 73 65 20 74 68 65 20 6f 75 74 70 75 74 20  ease the output 
1db00 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72  page. */.  if( r
1db10 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 72 63 20 3d  c==LSM_OK ) rc =
1db20 20 6d 65 72 67 65 57 6f 72 6b 65 72 50 65 72 73   mergeWorkerPers
1db30 69 73 74 41 6e 64 52 65 6c 65 61 73 65 28 70 4d  istAndRelease(pM
1db40 57 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53  W);.  if( rc==LS
1db50 4d 5f 4f 4b 20 29 20 72 63 20 3d 20 6d 65 72 67  M_OK ) rc = merg
1db60 65 57 6f 72 6b 65 72 42 74 72 65 65 49 6e 64 69  eWorkerBtreeIndi
1db70 72 65 63 74 28 70 4d 57 29 3b 0a 20 20 69 66 28  rect(pMW);.  if(
1db80 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 72 63   rc==LSM_OK ) rc
1db90 20 3d 20 6d 65 72 67 65 57 6f 72 6b 65 72 46 69   = mergeWorkerFi
1dba0 6e 69 73 68 48 69 65 72 61 72 63 68 79 28 70 4d  nishHierarchy(pM
1dbb0 57 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53  W);.  if( rc==LS
1dbc0 4d 5f 4f 4b 20 29 20 72 63 20 3d 20 6d 65 72 67  M_OK ) rc = merg
1dbd0 65 57 6f 72 6b 65 72 41 64 64 50 61 64 64 69 6e  eWorkerAddPaddin
1dbe0 67 28 70 4d 57 29 3b 0a 20 20 6c 73 6d 46 73 46  g(pMW);.  lsmFsF
1dbf0 6c 75 73 68 57 61 69 74 69 6e 67 28 70 4d 57 2d  lushWaiting(pMW-
1dc00 3e 70 44 62 2d 3e 70 46 53 2c 20 26 72 63 29 3b  >pDb->pFS, &rc);
1dc10 0a 20 20 6d 65 72 67 65 57 6f 72 6b 65 72 52 65  .  mergeWorkerRe
1dc20 6c 65 61 73 65 41 6c 6c 28 70 4d 57 29 3b 0a 0a  leaseAll(pMW);..
1dc30 20 20 6c 73 6d 46 72 65 65 28 70 4d 57 2d 3e 70    lsmFree(pMW->p
1dc40 44 62 2d 3e 70 45 6e 76 2c 20 70 4d 57 2d 3e 61  Db->pEnv, pMW->a
1dc50 47 6f 62 62 6c 65 29 3b 0a 20 20 70 4d 57 2d 3e  Gobble);.  pMW->
1dc60 61 47 6f 62 62 6c 65 20 3d 20 30 3b 0a 20 20 70  aGobble = 0;.  p
1dc70 4d 57 2d 3e 70 43 73 72 20 3d 20 30 3b 0a 0a 20  MW->pCsr = 0;.. 
1dc80 20 2a 70 52 63 20 3d 20 72 63 3b 0a 7d 0a 0a 2f   *pRc = rc;.}../
1dc90 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
1dca0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
1dcb0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1dcc0 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 74 68  being used as th
1dcd0 65 20 69 6e 70 75 74 20 66 6f 72 0a 2a 2a 20 61  e input for.** a
1dce0 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
1dcf0 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  . When this func
1dd00 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1dd10 2a 70 69 46 6c 61 67 73 20 63 6f 6e 74 61 69 6e  *piFlags contain
1dd20 73 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  s the.** databas
1dd30 65 20 65 6e 74 72 79 20 66 6c 61 67 73 20 66 6f  e entry flags fo
1dd40 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
1dd50 74 72 79 2e 20 54 68 65 20 65 6e 74 72 79 20 61  try. The entry a
1dd60 62 6f 75 74 20 74 6f 20 62 65 20 77 72 69 74 74  bout to be writt
1dd70 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 75 74  en.** to the out
1dd80 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  put..**.** Note 
1dd90 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69  that this functi
1dda0 6f 6e 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 77  on only has to w
1ddb0 6f 72 6b 20 66 6f 72 20 63 75 72 73 6f 72 73 20  ork for cursors 
1ddc0 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 0a 2a  configured to .*
1ddd0 2a 20 69 74 65 72 61 74 65 20 66 6f 72 77 61 72  * iterate forwar
1dde0 64 73 20 28 6e 6f 74 20 62 61 63 6b 77 61 72 64  ds (not backward
1ddf0 73 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  s)..*/.static vo
1de00 69 64 20 6d 65 72 67 65 52 61 6e 67 65 44 65 6c  id mergeRangeDel
1de10 65 74 65 73 28 4d 75 6c 74 69 43 75 72 73 6f 72  etes(MultiCursor
1de20 20 2a 70 43 73 72 2c 20 69 6e 74 20 2a 70 69 56   *pCsr, int *piV
1de30 61 6c 2c 20 69 6e 74 20 2a 70 69 46 6c 61 67 73  al, int *piFlags
1de40 29 7b 0a 20 20 69 6e 74 20 66 20 3d 20 2a 70 69  ){.  int f = *pi
1de50 46 6c 61 67 73 3b 0a 20 20 69 6e 74 20 69 4b 65  Flags;.  int iKe
1de60 79 20 3d 20 70 43 73 72 2d 3e 61 54 72 65 65 5b  y = pCsr->aTree[
1de70 31 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  1];.  int i;..  
1de80 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 66 6c  assert( pCsr->fl
1de90 61 67 73 20 26 20 43 55 52 53 4f 52 5f 4e 45 58  ags & CURSOR_NEX
1dea0 54 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  T_OK );.  if( pC
1deb0 73 72 2d 3e 66 6c 61 67 73 20 26 20 43 55 52 53  sr->flags & CURS
1dec0 4f 52 5f 49 47 4e 4f 52 45 5f 44 45 4c 45 54 45  OR_IGNORE_DELETE
1ded0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 69   ){.    /* The i
1dee0 67 6e 6f 72 65 2d 64 65 6c 65 74 65 20 66 6c 61  gnore-delete fla
1def0 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 74 68  g is set when th
1df00 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
1df10 6d 65 72 67 65 20 77 69 6c 6c 20 66 6f 72 6d 0a  merge will form.
1df20 20 20 20 20 2a 2a 20 74 68 65 20 6f 6c 64 65 73      ** the oldes
1df30 74 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 64  t level in the d
1df40 61 74 61 62 61 73 65 2e 20 49 6e 20 74 68 69 73  atabase. In this
1df50 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e   case there is n
1df60 6f 20 70 6f 69 6e 74 20 69 6e 0a 20 20 20 20 2a  o point in.    *
1df70 2a 20 72 65 74 61 69 6e 69 6e 67 20 61 6e 79 20  * retaining any 
1df80 72 61 6e 67 65 2d 64 65 6c 65 74 65 20 66 6c 61  range-delete fla
1df90 67 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  gs.  */.    asse
1dfa0 72 74 28 20 28 66 20 26 20 4c 53 4d 5f 50 4f 49  rt( (f & LSM_POI
1dfb0 4e 54 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 3b  NT_DELETE)==0 );
1dfc0 0a 20 20 20 20 66 20 26 3d 20 7e 28 4c 53 4d 5f  .    f &= ~(LSM_
1dfd0 53 54 41 52 54 5f 44 45 4c 45 54 45 7c 4c 53 4d  START_DELETE|LSM
1dfe0 5f 45 4e 44 5f 44 45 4c 45 54 45 29 3b 0a 20 20  _END_DELETE);.  
1dff0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
1e000 3d 30 3b 20 69 3c 28 43 55 52 53 4f 52 5f 44 41  =0; i<(CURSOR_DA
1e010 54 41 5f 53 45 47 4d 45 4e 54 20 2b 20 70 43 73  TA_SEGMENT + pCs
1e020 72 2d 3e 6e 50 74 72 29 3b 20 69 2b 2b 29 7b 0a  r->nPtr); i++){.
1e030 20 20 20 20 20 20 69 66 28 20 69 21 3d 69 4b 65        if( i!=iKe
1e040 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y ){.        int
1e050 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
1e060 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20  void *pKey;.    
1e070 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20      int nKey;.  
1e080 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20        int res;. 
1e090 20 20 20 20 20 20 20 6d 75 6c 74 69 43 75 72 73         multiCurs
1e0a0 6f 72 47 65 74 4b 65 79 28 70 43 73 72 2c 20 69  orGetKey(pCsr, i
1e0b0 2c 20 26 65 54 79 70 65 2c 20 26 70 4b 65 79 2c  , &eType, &pKey,
1e0c0 20 26 6e 4b 65 79 29 3b 0a 0a 20 20 20 20 20 20   &nKey);..      
1e0d0 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
1e0e0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 6f          res = so
1e0f0 72 74 65 64 4b 65 79 43 6f 6d 70 61 72 65 28 70  rtedKeyCompare(p
1e100 43 73 72 2d 3e 70 44 62 2d 3e 78 43 6d 70 2c 20  Csr->pDb->xCmp, 
1e110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1e120 74 54 6f 70 69 63 28 70 43 73 72 2d 3e 65 54 79  tTopic(pCsr->eTy
1e130 70 65 29 2c 20 70 43 73 72 2d 3e 6b 65 79 2e 70  pe), pCsr->key.p
1e140 44 61 74 61 2c 20 70 43 73 72 2d 3e 6b 65 79 2e  Data, pCsr->key.
1e150 6e 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20  nData,.         
1e160 20 20 20 20 20 72 74 54 6f 70 69 63 28 65 54 79       rtTopic(eTy
1e170 70 65 29 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 0a  pe), pKey, nKey.
1e180 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1e190 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
1e1a0 65 73 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  es<=0 );.       
1e1b0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
1e1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1e1d0 20 28 66 20 26 20 28 4c 53 4d 5f 49 4e 53 45 52   (f & (LSM_INSER
1e1e0 54 7c 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c 45  T|LSM_POINT_DELE
1e1f0 54 45 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  TE))==0 ){.     
1e200 20 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79           if( eTy
1e210 70 65 20 26 20 4c 53 4d 5f 49 4e 53 45 52 54 20  pe & LSM_INSERT 
1e220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1e230 20 20 20 66 20 7c 3d 20 4c 53 4d 5f 49 4e 53 45     f |= LSM_INSE
1e240 52 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  RT;.            
1e250 20 20 20 20 2a 70 69 56 61 6c 20 3d 20 69 3b 0a      *piVal = i;.
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
1e280 73 65 20 69 66 28 20 65 54 79 70 65 20 26 20 4c  se if( eType & L
1e290 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c 45 54 45 20  SM_POINT_DELETE 
1e2a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1e2b0 20 20 20 66 20 7c 3d 20 4c 53 4d 5f 50 4f 49 4e     f |= LSM_POIN
1e2c0 54 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  T_DELETE;.      
1e2d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e2f0 20 20 20 20 66 20 7c 3d 20 28 65 54 79 70 65 20      f |= (eType 
1e300 26 20 28 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45 54  & (LSM_END_DELET
1e310 45 7c 4c 53 4d 5f 53 54 41 52 54 5f 44 45 4c 45  E|LSM_START_DELE
1e320 54 45 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TE));.          
1e330 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  }..          if(
1e340 20 69 3e 69 4b 65 79 20 26 26 20 28 65 54 79 70   i>iKey && (eTyp
1e350 65 20 26 20 4c 53 4d 5f 45 4e 44 5f 44 45 4c 45  e & LSM_END_DELE
1e360 54 45 29 20 26 26 20 72 65 73 3c 30 20 29 7b 0a  TE) && res<0 ){.
1e370 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1e380 66 20 26 20 28 4c 53 4d 5f 49 4e 53 45 52 54 7c  f & (LSM_INSERT|
1e390 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c 45 54 45  LSM_POINT_DELETE
1e3a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1e3b0 20 20 20 66 20 7c 3d 20 28 4c 53 4d 5f 45 4e 44     f |= (LSM_END
1e3c0 5f 44 45 4c 45 54 45 7c 4c 53 4d 5f 53 54 41 52  _DELETE|LSM_STAR
1e3d0 54 5f 44 45 4c 45 54 45 29 3b 0a 20 20 20 20 20  T_DELETE);.     
1e3e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 66 20 3d 20              f = 
1e400 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
1e410 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1e420 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1e430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e440 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  }.    }..    ass
1e450 65 72 74 28 20 28 66 20 26 20 4c 53 4d 5f 49 4e  ert( (f & LSM_IN
1e460 53 45 52 54 29 3d 3d 30 20 7c 7c 20 28 66 20 26  SERT)==0 || (f &
1e470 20 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45 4c 45 54   LSM_POINT_DELET
1e480 45 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  E)==0 );.    if(
1e490 20 28 66 20 26 20 4c 53 4d 5f 53 54 41 52 54 5f   (f & LSM_START_
1e4a0 44 45 4c 45 54 45 29 20 0a 20 20 20 20 20 26 26  DELETE) .     &&
1e4b0 20 28 66 20 26 20 4c 53 4d 5f 45 4e 44 5f 44 45   (f & LSM_END_DE
1e4c0 4c 45 54 45 29 20 0a 20 20 20 20 20 26 26 20 28  LETE) .     && (
1e4d0 66 20 26 20 4c 53 4d 5f 50 4f 49 4e 54 5f 44 45  f & LSM_POINT_DE
1e4e0 4c 45 54 45 20 29 0a 20 20 20 20 29 7b 0a 20 20  LETE ).    ){.  
1e4f0 20 20 20 20 66 20 3d 20 30 3b 0a 20 20 20 20 7d      f = 0;.    }
1e500 0a 20 20 7d 0a 0a 20 20 2a 70 69 46 6c 61 67 73  .  }..  *piFlags
1e510 20 3d 20 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   = f;.}..static 
1e520 69 6e 74 20 6d 65 72 67 65 57 6f 72 6b 65 72 53  int mergeWorkerS
1e530 74 65 70 28 4d 65 72 67 65 57 6f 72 6b 65 72 20  tep(MergeWorker 
1e540 2a 70 4d 57 29 7b 0a 20 20 6c 73 6d 5f 64 62 20  *pMW){.  lsm_db 
1e550 2a 70 44 62 20 3d 20 70 4d 57 2d 3e 70 44 62 3b  *pDb = pMW->pDb;
1e560 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1e570 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 4d  se handle */.  M
1e580 75 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72  ultiCursor *pCsr
1e590 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1e5a0 43 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20 69  Cursor to read i
1e5b0 6e 70 75 74 20 64 61 74 61 20 66 72 6f 6d 20 2a  nput data from *
1e5c0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d  /.  int rc = LSM
1e5d0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
1e5e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1e5f0 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 3b   */.  int eType;
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e610 20 20 20 20 2f 2a 20 53 4f 52 54 45 44 5f 53 45      /* SORTED_SE
1e620 50 41 52 41 54 4f 52 2c 20 57 52 49 54 45 20 6f  PARATOR, WRITE o
1e630 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 76 6f  r DELETE */.  vo
1e640 69 64 20 2a 70 4b 65 79 3b 20 69 6e 74 20 6e 4b  id *pKey; int nK
1e650 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4b  ey;         /* K
1e660 65 79 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ey */.  Pgno iPt
1e670 72 3b 0a 20 20 69 6e 74 20 69 56 61 6c 3b 0a 0a  r;.  int iVal;..
1e680 20 20 70 43 73 72 20 3d 20 70 4d 57 2d 3e 70 43    pCsr = pMW->pC
1e690 73 72 3b 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74  sr;..  /* Pull t
1e6a0 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 6f  he next record o
1e6b0 75 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  ut of the source
1e6c0 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 6c 73   cursor. */.  ls
1e6d0 6d 4d 43 75 72 73 6f 72 4b 65 79 28 70 43 73 72  mMCursorKey(pCsr
1e6e0 2c 20 26 70 4b 65 79 2c 20 26 6e 4b 65 79 29 3b  , &pKey, &nKey);
1e6f0 0a 20 20 65 54 79 70 65 20 3d 20 70 43 73 72 2d  .  eType = pCsr-
1e700 3e 65 54 79 70 65 3b 0a 0a 20 20 2f 2a 20 46 69  >eType;..  /* Fi
1e710 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 65 20  gure out if the 
1e720 6f 75 74 70 75 74 20 72 65 63 6f 72 64 20 6d 61  output record ma
1e730 79 20 68 61 76 65 20 61 20 64 69 66 66 65 72 65  y have a differe
1e740 6e 74 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65  nt pointer value
1e750 0a 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 70  .  ** than the p
1e760 72 65 76 69 6f 75 73 2e 20 54 68 69 73 20 69 73  revious. This is
1e770 20 74 68 65 20 63 61 73 65 20 69 66 20 74 68 65   the case if the
1e780 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
1e790 69 64 65 6e 74 69 63 61 6c 20 74 6f 0a 20 20 2a  identical to.  *
1e7a0 2a 20 61 20 6b 65 79 20 74 68 61 74 20 61 70 70  * a key that app
1e7b0 65 61 72 73 20 69 6e 20 74 68 65 20 6c 6f 77 65  ears in the lowe
1e7c0 73 74 20 6c 65 76 65 6c 20 72 75 6e 20 62 65 69  st level run bei
1e7d0 6e 67 20 6d 65 72 67 65 64 2e 20 49 66 20 73 6f  ng merged. If so
1e7e0 2c 20 73 65 74 20 0a 20 20 2a 2a 20 69 50 74 72  , set .  ** iPtr
1e7f0 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
1e800 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 2e 20   pointer value. 
1e810 49 66 20 6e 6f 74 2c 20 6c 65 61 76 65 20 69 50  If not, leave iP
1e820 74 72 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20  tr set to zero, 
1e830 0a 20 20 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  .  ** indicating
1e840 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
1e850 20 70 6f 69 6e 74 65 72 20 76 61 6c 75 65 20 73   pointer value s
1e860 68 6f 75 6c 64 20 62 65 20 61 20 63 6f 70 79 20  hould be a copy 
1e870 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20 0a  of the pointer .
1e880 20 20 2a 2a 20 76 61 6c 75 65 20 77 72 69 74 74    ** value writt
1e890 65 6e 20 77 69 74 68 20 74 68 65 20 70 72 65 76  en with the prev
1e8a0 69 6f 75 73 20 6b 65 79 2e 20 20 2a 2f 0a 20 20  ious key.  */.  
1e8b0 69 50 74 72 20 3d 20 28 70 43 73 72 2d 3e 70 50  iPtr = (pCsr->pP
1e8c0 72 65 76 4d 65 72 67 65 50 74 72 20 3f 20 2a 70  revMergePtr ? *p
1e8d0 43 73 72 2d 3e 70 50 72 65 76 4d 65 72 67 65 50  Csr->pPrevMergeP
1e8e0 74 72 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 70  tr : 0);.  if( p
1e8f0 43 73 72 2d 3e 70 42 74 43 73 72 20 29 7b 0a 20  Csr->pBtCsr ){. 
1e900 20 20 20 42 74 72 65 65 43 75 72 73 6f 72 20 2a     BtreeCursor *
1e910 70 42 74 43 73 72 20 3d 20 70 43 73 72 2d 3e 70  pBtCsr = pCsr->p
1e920 42 74 43 73 72 3b 0a 20 20 20 20 69 66 28 20 70  BtCsr;.    if( p
1e930 42 74 43 73 72 2d 3e 70 4b 65 79 20 29 7b 0a 20  BtCsr->pKey ){. 
1e940 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 72       int res = r
1e950 74 54 6f 70 69 63 28 70 42 74 43 73 72 2d 3e 65  tTopic(pBtCsr->e
1e960 54 79 70 65 29 20 2d 20 72 74 54 6f 70 69 63 28  Type) - rtTopic(
1e970 65 54 79 70 65 29 3b 0a 20 20 20 20 20 20 69 66  eType);.      if
1e980 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d  ( res==0 ) res =
1e990 20 70 44 62 2d 3e 78 43 6d 70 28 70 42 74 43 73   pDb->xCmp(pBtCs
1e9a0 72 2d 3e 70 4b 65 79 2c 20 70 42 74 43 73 72 2d  r->pKey, pBtCsr-
1e9b0 3e 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 6e 4b 65  >nKey, pKey, nKe
1e9c0 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  y);.      if( 0=
1e9d0 3d 72 65 73 20 29 20 69 50 74 72 20 3d 20 70 42  =res ) iPtr = pB
1e9e0 74 43 73 72 2d 3e 69 50 74 72 3b 0a 20 20 20 20  tCsr->iPtr;.    
1e9f0 20 20 61 73 73 65 72 74 28 20 72 65 73 3e 3d 30    assert( res>=0
1ea00 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
1ea10 65 20 69 66 28 20 70 43 73 72 2d 3e 6e 50 74 72  e if( pCsr->nPtr
1ea20 20 29 7b 0a 20 20 20 20 53 65 67 6d 65 6e 74 50   ){.    SegmentP
1ea30 74 72 20 2a 70 50 74 72 20 3d 20 26 70 43 73 72  tr *pPtr = &pCsr
1ea40 2d 3e 61 50 74 72 5b 70 43 73 72 2d 3e 6e 50 74  ->aPtr[pCsr->nPt
1ea50 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  r-1];.    if( pP
1ea60 74 72 2d 3e 70 50 67 0a 20 20 20 20 20 26 26 20  tr->pPg.     && 
1ea70 30 3d 3d 70 44 62 2d 3e 78 43 6d 70 28 70 50 74  0==pDb->xCmp(pPt
1ea80 72 2d 3e 70 4b 65 79 2c 20 70 50 74 72 2d 3e 6e  r->pKey, pPtr->n
1ea90 4b 65 79 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29  Key, pKey, nKey)
1eaa0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50  .    ){.      iP
1eab0 74 72 20 3d 20 70 50 74 72 2d 3e 69 50 74 72 2b  tr = pPtr->iPtr+
1eac0 70 50 74 72 2d 3e 69 50 67 50 74 72 3b 0a 20 20  pPtr->iPgPtr;.  
1ead0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 56 61 6c 20    }.  }..  iVal 
1eae0 3d 20 70 43 73 72 2d 3e 61 54 72 65 65 5b 31 5d  = pCsr->aTree[1]
1eaf0 3b 0a 20 20 6d 65 72 67 65 52 61 6e 67 65 44 65  ;.  mergeRangeDe
1eb00 6c 65 74 65 73 28 70 43 73 72 2c 20 26 69 56 61  letes(pCsr, &iVa
1eb10 6c 2c 20 26 65 54 79 70 65 29 3b 0a 0a 20 20 69  l, &eType);..  i
1eb20 66 28 20 65 54 79 70 65 21 3d 30 20 29 7b 0a 20  f( eType!=0 ){. 
1eb30 20 20 20 69 66 28 20 70 4d 57 2d 3e 61 47 6f 62     if( pMW->aGob
1eb40 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ble ){.      int
1eb50 20 69 47 6f 62 62 6c 65 20 3d 20 70 43 73 72 2d   iGobble = pCsr-
1eb60 3e 61 54 72 65 65 5b 31 5d 20 2d 20 43 55 52 53  >aTree[1] - CURS
1eb70 4f 52 5f 44 41 54 41 5f 53 45 47 4d 45 4e 54 3b  OR_DATA_SEGMENT;
1eb80 0a 20 20 20 20 20 20 69 66 28 20 69 47 6f 62 62  .      if( iGobb
1eb90 6c 65 3c 70 43 73 72 2d 3e 6e 50 74 72 20 26 26  le<pCsr->nPtr &&
1eba0 20 69 47 6f 62 62 6c 65 3e 3d 30 20 29 7b 0a 20   iGobble>=0 ){. 
1ebb0 20 20 20 20 20 20 20 53 65 67 6d 65 6e 74 50 74         SegmentPt
1ebc0 72 20 2a 70 47 6f 62 62 6c 65 20 3d 20 26 70 43  r *pGobble = &pC
1ebd0 73 72 2d 3e 61 50 74 72 5b 69 47 6f 62 62 6c 65  sr->aPtr[iGobble
1ebe0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ];.        if( (
1ebf0 70 47 6f 62 62 6c 65 2d 3e 66 6c 61 67 73 20 26  pGobble->flags &
1ec00 20 50 47 46 54 52 5f 53 4b 49 50 5f 54 48 49 53   PGFTR_SKIP_THIS
1ec10 5f 46 4c 41 47 29 3d 3d 30 20 29 7b 0a 20 20 20  _FLAG)==0 ){.   
1ec20 20 20 20 20 20 20 20 70 4d 57 2d 3e 61 47 6f 62         pMW->aGob
1ec30 62 6c 65 5b 69 47 6f 62 62 6c 65 5d 20 3d 20 6c  ble[iGobble] = l
1ec40 73 6d 46 73 50 61 67 65 4e 75 6d 62 65 72 28 70  smFsPageNumber(p
1ec50 47 6f 62 62 6c 65 2d 3e 70 50 67 29 3b 0a 20 20  Gobble->pPg);.  
1ec60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ec70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1ec80 20 74 68 69 73 20 69 73 20 61 20 73 65 70 61 72   this is a separ
1ec90 61 74 6f 72 20 6b 65 79 20 61 6e 64 20 77 65 20  ator key and we 
1eca0 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 75  know that the ou
1ecb0 74 70 75 74 20 70 6f 69 6e 74 65 72 20 68 61 73  tput pointer has
1ecc0 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 63 68 61 6e   not.    ** chan
1ecd0 67 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ged, there is no
1ece0 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e   point in writin
1ecf0 67 20 61 6e 20 6f 75 74 70 75 74 20 72 65 63 6f  g an output reco
1ed00 72 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  rd. Otherwise,. 
1ed10 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 20 2a     ** proceed. *
1ed20 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53  /.    if( rc==LS
1ed30 4d 5f 4f 4b 20 26 26 20 28 72 74 49 73 53 65 70  M_OK && (rtIsSep
1ed40 61 72 61 74 6f 72 28 65 54 79 70 65 29 3d 3d 30  arator(eType)==0
1ed50 20 7c 7c 20 69 50 74 72 21 3d 30 29 20 29 7b 0a   || iPtr!=0) ){.
1ed60 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1ed70 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
1ed80 68 65 20 6d 61 69 6e 20 72 75 6e 2e 20 2a 2f 0a  he main run. */.
1ed90 20 20 20 20 20 20 76 6f 69 64 20 2a 70 56 61 6c        void *pVal
1eda0 3b 20 69 6e 74 20 6e 56 61 6c 3b 0a 20 20 20 20  ; int nVal;.    
1edb0 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72 73    rc = multiCurs
1edc0 6f 72 47 65 74 56 61 6c 28 70 43 73 72 2c 20 69  orGetVal(pCsr, i
1edd0 56 61 6c 2c 20 26 70 56 61 6c 2c 20 26 6e 56 61  Val, &pVal, &nVa
1ede0 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56  l);.      if( pV
1edf0 61 6c 20 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  al && rc==LSM_OK
1ee00 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1ee10 72 74 28 20 6e 56 61 6c 3e 3d 30 20 29 3b 0a 20  rt( nVal>=0 );. 
1ee20 20 20 20 20 20 20 20 72 63 20 3d 20 73 6f 72 74         rc = sort
1ee30 65 64 42 6c 6f 62 53 65 74 28 70 44 62 2d 3e 70  edBlobSet(pDb->p
1ee40 45 6e 76 2c 20 26 70 43 73 72 2d 3e 76 61 6c 2c  Env, &pCsr->val,
1ee50 20 70 56 61 6c 2c 20 6e 56 61 6c 29 3b 0a 20 20   pVal, nVal);.  
1ee60 20 20 20 20 20 20 70 56 61 6c 20 3d 20 70 43 73        pVal = pCs
1ee70 72 2d 3e 76 61 6c 2e 70 44 61 74 61 3b 0a 20 20  r->val.pData;.  
1ee80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1ee90 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
1eea0 20 20 20 20 20 20 72 63 20 3d 20 6d 65 72 67 65        rc = merge
1eeb0 57 6f 72 6b 65 72 57 72 69 74 65 28 70 4d 57 2c  WorkerWrite(pMW,
1eec0 20 65 54 79 70 65 2c 20 70 4b 65 79 2c 20 6e 4b   eType, pKey, nK
1eed0 65 79 2c 20 70 56 61 6c 2c 20 6e 56 61 6c 2c 20  ey, pVal, nVal, 
1eee0 28 69 6e 74 29 69 50 74 72 29 3b 0a 20 20 20 20  (int)iPtr);.    
1eef0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1ef00 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20   /* Advance the 
1ef10 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65  cursor to the ne
1ef20 78 74 20 69 6e 70 75 74 20 72 65 63 6f 72 64 20  xt input record 
1ef30 28 61 73 73 75 6d 69 6e 67 20 6f 6e 65 20 65 78  (assuming one ex
1ef40 69 73 74 73 29 2e 20 2a 2f 0a 20 20 61 73 73 65  ists). */.  asse
1ef50 72 74 28 20 6c 73 6d 4d 43 75 72 73 6f 72 56 61  rt( lsmMCursorVa
1ef60 6c 69 64 28 70 4d 57 2d 3e 70 43 73 72 29 20 29  lid(pMW->pCsr) )
1ef70 3b 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f  ;.  if( rc==LSM_
1ef80 4f 4b 20 29 20 72 63 20 3d 20 6c 73 6d 4d 43 75  OK ) rc = lsmMCu
1ef90 72 73 6f 72 4e 65 78 74 28 70 4d 57 2d 3e 70 43  rsorNext(pMW->pC
1efa0 73 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  sr);..  return r
1efb0 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
1efc0 20 6d 65 72 67 65 57 6f 72 6b 65 72 44 6f 6e 65   mergeWorkerDone
1efd0 28 4d 65 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d  (MergeWorker *pM
1efe0 57 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 4d 57  W){.  return pMW
1eff0 2d 3e 70 43 73 72 3d 3d 30 20 7c 7c 20 21 6c 73  ->pCsr==0 || !ls
1f000 6d 4d 43 75 72 73 6f 72 56 61 6c 69 64 28 70 4d  mMCursorValid(pM
1f010 57 2d 3e 70 43 73 72 29 3b 0a 7d 0a 0a 73 74 61  W->pCsr);.}..sta
1f020 74 69 63 20 76 6f 69 64 20 73 6f 72 74 65 64 46  tic void sortedF
1f030 72 65 65 4c 65 76 65 6c 28 6c 73 6d 5f 65 6e 76  reeLevel(lsm_env
1f040 20 2a 70 45 6e 76 2c 20 4c 65 76 65 6c 20 2a 70   *pEnv, Level *p
1f050 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
1f060 20 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c 20    lsmFree(pEnv, 
1f070 70 2d 3e 70 53 70 6c 69 74 4b 65 79 29 3b 0a 20  p->pSplitKey);. 
1f080 20 20 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c     lsmFree(pEnv,
1f090 20 70 2d 3e 70 4d 65 72 67 65 29 3b 0a 20 20 20   p->pMerge);.   
1f0a0 20 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c 20 70   lsmFree(pEnv, p
1f0b0 2d 3e 61 52 68 73 29 3b 0a 20 20 20 20 6c 73 6d  ->aRhs);.    lsm
1f0c0 46 72 65 65 28 70 45 6e 76 2c 20 70 29 3b 0a 20  Free(pEnv, p);. 
1f0d0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
1f0e0 64 20 73 6f 72 74 65 64 49 6e 76 6f 6b 65 57 6f  d sortedInvokeWo
1f0f0 72 6b 48 6f 6f 6b 28 6c 73 6d 5f 64 62 20 2a 70  rkHook(lsm_db *p
1f100 44 62 29 7b 0a 20 20 69 66 28 20 70 44 62 2d 3e  Db){.  if( pDb->
1f110 78 57 6f 72 6b 20 29 7b 0a 20 20 20 20 70 44 62  xWork ){.    pDb
1f120 2d 3e 78 57 6f 72 6b 28 70 44 62 2c 20 70 44 62  ->xWork(pDb, pDb
1f130 2d 3e 70 57 6f 72 6b 43 74 78 29 3b 0a 20 20 7d  ->pWorkCtx);.  }
1f140 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .}..static int s
1f150 6f 72 74 65 64 4e 65 77 54 6f 70 6c 65 76 65 6c  ortedNewToplevel
1f160 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c  (.  lsm_db *pDb,
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f180 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1f190 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  n handle */.  in
1f1a0 74 20 65 54 72 65 65 2c 20 20 20 20 20 20 20 20  t eTree,        
1f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f1c0 20 4f 6e 65 20 6f 66 20 74 68 65 20 54 52 45 45   One of the TREE
1f1d0 5f 58 58 58 20 63 6f 6e 73 74 61 6e 74 73 20 2a  _XXX constants *
1f1e0 2f 0a 20 20 69 6e 74 20 2a 70 6e 57 72 69 74 65  /.  int *pnWrite
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f200 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62      /* OUT: Numb
1f210 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 20 70  er of database p
1f220 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ages written */.
1f230 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  ){.  int rc = LS
1f240 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  M_OK;           
1f250 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
1f260 6f 64 65 20 2a 2f 0a 20 20 4d 75 6c 74 69 43 75  ode */.  MultiCu
1f270 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 30 3b 0a  rsor *pCsr = 0;.
1f280 20 20 4c 65 76 65 6c 20 2a 70 4e 65 78 74 20 3d    Level *pNext =
1f290 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f2a0 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
1f2b0 20 74 6f 70 20 6c 65 76 65 6c 20 2a 2f 0a 20 20   top level */.  
1f2c0 4c 65 76 65 6c 20 2a 70 4e 65 77 3b 20 20 20 20  Level *pNew;    
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2e0 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 76 65 6c  /* The new level
1f2f0 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 53 65 67   itself */.  Seg
1f300 6d 65 6e 74 20 2a 70 4c 69 6e 6b 65 64 20 3d 20  ment *pLinked = 
1f310 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1f320 44 65 6c 65 74 65 20 73 65 70 61 72 61 74 6f 72  Delete separator
1f330 73 20 66 72 6f 6d 20 74 68 69 73 20 73 65 67 6d  s from this segm
1f340 65 6e 74 20 2a 2f 0a 20 20 4c 65 76 65 6c 20 2a  ent */.  Level *
1f350 70 44 65 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  pDel = 0;       
1f360 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
1f370 74 65 20 74 68 69 73 20 65 6e 74 69 72 65 20 6c  te this entire l
1f380 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 57  evel */.  int nW
1f390 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rite = 0;       
1f3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f3b0 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 20  ber of database 
1f3c0 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a 2f  pages written */
1f3d0 0a 20 20 46 72 65 65 6c 69 73 74 20 66 72 65 65  .  Freelist free
1f3e0 6c 69 73 74 3b 0a 0a 20 20 69 66 28 20 65 54 72  list;..  if( eTr
1f3f0 65 65 21 3d 54 52 45 45 5f 4e 4f 4e 45 20 29 7b  ee!=TREE_NONE ){
1f400 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 53 68 6d  .    rc = lsmShm
1f410 43 61 63 68 65 43 68 75 6e 6b 73 28 70 44 62 2c  CacheChunks(pDb,
1f420 20 70 44 62 2d 3e 74 72 65 65 68 64 72 2e 6e 43   pDb->treehdr.nC
1f430 68 75 6e 6b 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  hunk);.  }..  as
1f440 73 65 72 74 28 20 70 44 62 2d 3e 62 55 73 65 46  sert( pDb->bUseF
1f450 72 65 65 6c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  reelist==0 );.  
1f460 70 44 62 2d 3e 70 46 72 65 65 6c 69 73 74 20 3d  pDb->pFreelist =
1f470 20 26 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 44   &freelist;.  pD
1f480 62 2d 3e 62 55 73 65 46 72 65 65 6c 69 73 74 20  b->bUseFreelist 
1f490 3d 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 66  = 1;.  memset(&f
1f4a0 72 65 65 6c 69 73 74 2c 20 30 2c 20 73 69 7a 65  reelist, 0, size
1f4b0 6f 66 28 66 72 65 65 6c 69 73 74 29 29 3b 0a 0a  of(freelist));..
1f4c0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
1f4d0 65 20 6e 65 77 20 6c 65 76 65 6c 20 73 74 72 75  e new level stru
1f4e0 63 74 75 72 65 20 74 6f 20 77 72 69 74 65 20 74  cture to write t
1f4f0 6f 2e 20 2a 2f 0a 20 20 70 4e 65 78 74 20 3d 20  o. */.  pNext = 
1f500 6c 73 6d 44 62 53 6e 61 70 73 68 6f 74 4c 65 76  lsmDbSnapshotLev
1f510 65 6c 28 70 44 62 2d 3e 70 57 6f 72 6b 65 72 29  el(pDb->pWorker)
1f520 3b 0a 20 20 70 4e 65 77 20 3d 20 28 4c 65 76 65  ;.  pNew = (Leve
1f530 6c 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72  l *)lsmMallocZer
1f540 6f 52 63 28 70 44 62 2d 3e 70 45 6e 76 2c 20 73  oRc(pDb->pEnv, s
1f550 69 7a 65 6f 66 28 4c 65 76 65 6c 29 2c 20 26 72  izeof(Level), &r
1f560 63 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  c);.  if( pNew )
1f570 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78  {.    pNew->pNex
1f580 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 6c  t = pNext;.    l
1f590 73 6d 44 62 53 6e 61 70 73 68 6f 74 53 65 74 4c  smDbSnapshotSetL
1f5a0 65 76 65 6c 28 70 44 62 2d 3e 70 57 6f 72 6b 65  evel(pDb->pWorke
1f5b0 72 2c 20 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  r, pNew);.  }.. 
1f5c0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 63 75 72   /* Create a cur
1f5d0 73 6f 72 20 74 6f 20 67 61 74 68 65 72 20 74 68  sor to gather th
1f5e0 65 20 64 61 74 61 20 72 65 71 75 69 72 65 64 20  e data required 
1f5f0 62 79 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65  by the new segme
1f600 6e 74 2e 20 54 68 65 20 6e 65 77 0a 20 20 2a 2a  nt. The new.  **
1f610 20 73 65 67 6d 65 6e 74 20 63 6f 6e 74 61 69 6e   segment contain
1f620 73 20 65 76 65 72 79 74 68 69 6e 67 20 69 6e 20  s everything in 
1f630 74 68 65 20 74 72 65 65 20 61 6e 64 20 70 6f 69  the tree and poi
1f640 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6e 65 78  nters to the nex
1f650 74 20 73 65 67 6d 65 6e 74 0a 20 20 2a 2a 20 69  t segment.  ** i
1f660 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
1f670 69 66 20 61 6e 79 29 2e 20 20 2a 2f 0a 20 20 70  if any).  */.  p
1f680 43 73 72 20 3d 20 6d 75 6c 74 69 43 75 72 73 6f  Csr = multiCurso
1f690 72 4e 65 77 28 70 44 62 2c 20 26 72 63 29 3b 0a  rNew(pDb, &rc);.
1f6a0 20 20 69 66 28 20 70 43 73 72 20 29 7b 0a 20 20    if( pCsr ){.  
1f6b0 20 20 70 43 73 72 2d 3e 70 44 62 20 3d 20 70 44    pCsr->pDb = pD
1f6c0 62 3b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  b;.    rc = mult
1f6d0 69 43 75 72 73 6f 72 56 69 73 69 74 46 72 65 65  iCursorVisitFree
1f6e0 6c 69 73 74 28 70 43 73 72 29 3b 0a 20 20 20 20  list(pCsr);.    
1f6f0 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  if( rc==LSM_OK )
1f700 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 75 6c  {.      rc = mul
1f710 74 69 43 75 72 73 6f 72 41 64 64 54 72 65 65 28  tiCursorAddTree(
1f720 70 43 73 72 2c 20 70 44 62 2d 3e 70 57 6f 72 6b  pCsr, pDb->pWork
1f730 65 72 2c 20 65 54 72 65 65 29 3b 0a 20 20 20 20  er, eTree);.    
1f740 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53  }.    if( rc==LS
1f750 4d 5f 4f 4b 20 26 26 20 70 4e 65 78 74 20 26 26  M_OK && pNext &&
1f760 20 70 4e 65 78 74 2d 3e 70 4d 65 72 67 65 3d 3d   pNext->pMerge==
1f770 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  0 ){.      if( (
1f780 70 4e 65 78 74 2d 3e 66 6c 61 67 73 20 26 20 4c  pNext->flags & L
1f790 45 56 45 4c 5f 46 52 45 45 4c 49 53 54 5f 4f 4e  EVEL_FREELIST_ON
1f7a0 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  LY) ){.        p
1f7b0 44 65 6c 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20  Del = pNext;.   
1f7c0 20 20 20 20 20 70 43 73 72 2d 3e 61 50 74 72 20       pCsr->aPtr 
1f7d0 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52  = lsmMallocZeroR
1f7e0 63 28 70 44 62 2d 3e 70 45 6e 76 2c 20 73 69 7a  c(pDb->pEnv, siz
1f7f0 65 6f 66 28 53 65 67 6d 65 6e 74 50 74 72 29 2c  eof(SegmentPtr),
1f800 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 6d   &rc);.        m
1f810 75 6c 74 69 43 75 72 73 6f 72 41 64 64 4f 6e 65  ultiCursorAddOne
1f820 28 70 43 73 72 2c 20 70 4e 65 78 74 2c 20 26 72  (pCsr, pNext, &r
1f830 63 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  c);.      }else 
1f840 69 66 28 20 65 54 72 65 65 21 3d 54 52 45 45 5f  if( eTree!=TREE_
1f850 4e 4f 4e 45 20 26 26 20 70 4e 65 78 74 2d 3e 6c  NONE && pNext->l
1f860 68 73 2e 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  hs.iRoot ){.    
1f870 20 20 20 20 70 4c 69 6e 6b 65 64 20 3d 20 26 70      pLinked = &p
1f880 4e 65 78 74 2d 3e 6c 68 73 3b 0a 20 20 20 20 20  Next->lhs;.     
1f890 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72     rc = btreeCur
1f8a0 73 6f 72 4e 65 77 28 70 44 62 2c 20 70 4c 69 6e  sorNew(pDb, pLin
1f8b0 6b 65 64 2c 20 26 70 43 73 72 2d 3e 70 42 74 43  ked, &pCsr->pBtC
1f8c0 73 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sr);.      }.   
1f8d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1f8e0 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6f  is will be the o
1f8f0 6e 6c 79 20 73 65 67 6d 65 6e 74 20 69 6e 20 74  nly segment in t
1f900 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 69 73  he database, dis
1f910 63 61 72 64 20 61 6e 79 20 64 65 6c 65 74 65 0a  card any delete.
1f920 20 20 20 20 2a 2a 20 6d 61 72 6b 65 72 73 20 70      ** markers p
1f930 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69 6e  resent in the in
1f940 2d 6d 65 6d 6f 72 79 20 74 72 65 65 2e 20 20 2a  -memory tree.  *
1f950 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 78 74 3d  /.    if( pNext=
1f960 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 75 6c 74  =0 ){.      mult
1f970 69 43 75 72 73 6f 72 49 67 6e 6f 72 65 44 65 6c  iCursorIgnoreDel
1f980 65 74 65 28 70 43 73 72 29 3b 0a 20 20 20 20 7d  ete(pCsr);.    }
1f990 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
1f9a0 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 6c 73  LSM_OK ){.    ls
1f9b0 6d 4d 43 75 72 73 6f 72 43 6c 6f 73 65 28 70 43  mMCursorClose(pC
1f9c0 73 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  sr, 0);.  }else{
1f9d0 0a 20 20 20 20 50 67 6e 6f 20 69 4c 65 66 74 50  .    Pgno iLeftP
1f9e0 74 72 20 3d 20 30 3b 0a 20 20 20 20 4d 65 72 67  tr = 0;.    Merg
1f9f0 65 20 6d 65 72 67 65 3b 20 20 20 20 20 20 20 20  e merge;        
1fa00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72            /* Mer
1fa10 67 65 20 6f 62 6a 65 63 74 20 75 73 65 64 20 74  ge object used t
1fa20 6f 20 63 72 65 61 74 65 20 6e 65 77 20 6c 65 76  o create new lev
1fa30 65 6c 20 2a 2f 0a 20 20 20 20 4d 65 72 67 65 57  el */.    MergeW
1fa40 6f 72 6b 65 72 20 6d 65 72 67 65 77 6f 72 6b 65  orker mergeworke
1fa50 72 3b 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65  r;      /* Merge
1fa60 57 6f 72 6b 65 72 20 6f 62 6a 65 63 74 20 66 6f  Worker object fo
1fa70 72 20 74 68 65 20 73 61 6d 65 20 70 75 72 70 6f  r the same purpo
1fa80 73 65 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73 65  se */..    memse
1fa90 74 28 26 6d 65 72 67 65 2c 20 30 2c 20 73 69 7a  t(&merge, 0, siz
1faa0 65 6f 66 28 4d 65 72 67 65 29 29 3b 0a 20 20 20  eof(Merge));.   
1fab0 20 6d 65 6d 73 65 74 28 26 6d 65 72 67 65 77 6f   memset(&mergewo
1fac0 72 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  rker, 0, sizeof(
1fad0 4d 65 72 67 65 57 6f 72 6b 65 72 29 29 3b 0a 0a  MergeWorker));..
1fae0 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 72 67 65      pNew->pMerge
1faf0 20 3d 20 26 6d 65 72 67 65 3b 0a 20 20 20 20 70   = &merge;.    p
1fb00 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 4c 45  New->flags |= LE
1fb10 56 45 4c 5f 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a  VEL_INCOMPLETE;.
1fb20 20 20 20 20 6d 65 72 67 65 77 6f 72 6b 65 72 2e      mergeworker.
1fb30 70 44 62 20 3d 20 70 44 62 3b 0a 20 20 20 20 6d  pDb = pDb;.    m
1fb40 65 72 67 65 77 6f 72 6b 65 72 2e 70 4c 65 76 65  ergeworker.pLeve
1fb50 6c 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6d 65  l = pNew;.    me
1fb60 72 67 65 77 6f 72 6b 65 72 2e 70 43 73 72 20 3d  rgeworker.pCsr =
1fb70 20 70 43 73 72 3b 0a 20 20 20 20 70 43 73 72 2d   pCsr;.    pCsr-
1fb80 3e 70 50 72 65 76 4d 65 72 67 65 50 74 72 20 3d  >pPrevMergePtr =
1fb90 20 26 69 4c 65 66 74 50 74 72 3b 0a 0a 20 20 20   &iLeftPtr;..   
1fba0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 73 65 70   /* Mark the sep
1fbb0 61 72 61 74 6f 72 73 20 61 72 72 61 79 20 66 6f  arators array fo
1fbc0 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 20  r the new level 
1fbd0 61 73 20 61 20 22 70 68 61 6e 74 6f 6d 22 2e 20  as a "phantom". 
1fbe0 2a 2f 0a 20 20 20 20 6d 65 72 67 65 77 6f 72 6b  */.    mergework
1fbf0 65 72 2e 62 46 6c 75 73 68 20 3d 20 31 3b 0a 0a  er.bFlush = 1;..
1fc00 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 77 6f      /* Do the wo
1fc10 72 6b 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  rk to create the
1fc20 20 6e 65 77 20 6d 65 72 67 65 64 20 73 65 67 6d   new merged segm
1fc30 65 6e 74 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ent on disk */. 
1fc40 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
1fc50 4b 20 29 20 72 63 20 3d 20 6c 73 6d 4d 43 75 72  K ) rc = lsmMCur
1fc60 73 6f 72 46 69 72 73 74 28 70 43 73 72 29 3b 0a  sorFirst(pCsr);.
1fc70 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 4c      while( rc==L
1fc80 53 4d 5f 4f 4b 20 26 26 20 6d 65 72 67 65 57 6f  SM_OK && mergeWo
1fc90 72 6b 65 72 44 6f 6e 65 28 26 6d 65 72 67 65 77  rkerDone(&mergew
1fca0 6f 72 6b 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  orker)==0 ){.   
1fcb0 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57 6f 72     rc = mergeWor
1fcc0 6b 65 72 53 74 65 70 28 26 6d 65 72 67 65 77 6f  kerStep(&mergewo
1fcd0 72 6b 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rker);.    }.   
1fce0 20 6d 65 72 67 65 57 6f 72 6b 65 72 53 68 75 74   mergeWorkerShut
1fcf0 64 6f 77 6e 28 26 6d 65 72 67 65 77 6f 72 6b 65  down(&mergeworke
1fd00 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 61 73 73  r, &rc);.    ass
1fd10 65 72 74 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20  ert( rc!=LSM_OK 
1fd20 7c 7c 20 6d 65 72 67 65 77 6f 72 6b 65 72 2e 6e  || mergeworker.n
1fd30 57 6f 72 6b 3d 3d 30 20 7c 7c 20 70 4e 65 77 2d  Work==0 || pNew-
1fd40 3e 6c 68 73 2e 69 46 69 72 73 74 20 29 3b 0a 20  >lhs.iFirst );. 
1fd50 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
1fd60 4b 20 26 26 20 70 4e 65 77 2d 3e 6c 68 73 2e 69  K && pNew->lhs.i
1fd70 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 72  First ){.      r
1fd80 63 20 3d 20 6c 73 6d 46 73 53 6f 72 74 65 64 46  c = lsmFsSortedF
1fd90 69 6e 69 73 68 28 70 44 62 2d 3e 70 46 53 2c 20  inish(pDb->pFS, 
1fda0 26 70 4e 65 77 2d 3e 6c 68 73 29 3b 0a 20 20 20  &pNew->lhs);.   
1fdb0 20 7d 0a 20 20 20 20 6e 57 72 69 74 65 20 3d 20   }.    nWrite = 
1fdc0 6d 65 72 67 65 77 6f 72 6b 65 72 2e 6e 57 6f 72  mergeworker.nWor
1fdd0 6b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61  k;.    pNew->fla
1fde0 67 73 20 26 3d 20 7e 4c 45 56 45 4c 5f 49 4e 43  gs &= ~LEVEL_INC
1fdf0 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 69 66 28  OMPLETE;.    if(
1fe00 20 65 54 72 65 65 3d 3d 54 52 45 45 5f 4e 4f 4e   eTree==TREE_NON
1fe10 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  E ){.      pNew-
1fe20 3e 66 6c 61 67 73 20 7c 3d 20 4c 45 56 45 4c 5f  >flags |= LEVEL_
1fe30 46 52 45 45 4c 49 53 54 5f 4f 4e 4c 59 3b 0a 20  FREELIST_ONLY;. 
1fe40 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 70     }.    pNew->p
1fe50 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Merge = 0;.  }..
1fe60 20 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b    if( rc!=LSM_OK
1fe70 20 7c 7c 20 70 4e 65 77 2d 3e 6c 68 73 2e 69 46   || pNew->lhs.iF
1fe80 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  irst==0 ){.    a
1fe90 73 73 65 72 74 28 20 72 63 21 3d 4c 53 4d 5f 4f  ssert( rc!=LSM_O
1fea0 4b 20 7c 7c 20 70 44 62 2d 3e 70 57 6f 72 6b 65  K || pDb->pWorke
1feb0 72 2d 3e 66 72 65 65 6c 69 73 74 2e 6e 45 6e 74  r->freelist.nEnt
1fec0 72 79 3d 3d 30 20 29 3b 0a 20 20 20 20 6c 73 6d  ry==0 );.    lsm
1fed0 44 62 53 6e 61 70 73 68 6f 74 53 65 74 4c 65 76  DbSnapshotSetLev
1fee0 65 6c 28 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2c  el(pDb->pWorker,
1fef0 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 73 6f 72   pNext);.    sor
1ff00 74 65 64 46 72 65 65 4c 65 76 65 6c 28 70 44 62  tedFreeLevel(pDb
1ff10 2d 3e 70 45 6e 76 2c 20 70 4e 65 77 29 3b 0a 20  ->pEnv, pNew);. 
1ff20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
1ff30 70 4c 69 6e 6b 65 64 20 29 7b 0a 20 20 20 20 20  pLinked ){.     
1ff40 20 70 4c 69 6e 6b 65 64 2d 3e 69 52 6f 6f 74 20   pLinked->iRoot 
1ff50 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
1ff60 66 28 20 70 44 65 6c 20 29 7b 0a 20 20 20 20 20  f( pDel ){.     
1ff70 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
1ff80 4e 65 78 74 3d 3d 70 44 65 6c 20 29 3b 0a 20 20  Next==pDel );.  
1ff90 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
1ffa0 3d 20 70 44 65 6c 2d 3e 70 4e 65 78 74 3b 0a 20  = pDel->pNext;. 
1ffb0 20 20 20 20 20 6c 73 6d 46 73 53 6f 72 74 65 64       lsmFsSorted
1ffc0 44 65 6c 65 74 65 28 70 44 62 2d 3e 70 46 53 2c  Delete(pDb->pFS,
1ffd0 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2c 20 31   pDb->pWorker, 1
1ffe0 2c 20 26 70 44 65 6c 2d 3e 6c 68 73 29 3b 0a 20  , &pDel->lhs);. 
1fff0 20 20 20 20 20 73 6f 72 74 65 64 46 72 65 65 4c       sortedFreeL
20000 65 76 65 6c 28 70 44 62 2d 3e 70 45 6e 76 2c 20  evel(pDb->pEnv, 
20010 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  pDel);.    }..#i
20020 66 20 4c 53 4d 5f 4c 4f 47 5f 53 54 52 55 43 54  f LSM_LOG_STRUCT
20030 55 52 45 0a 20 20 20 20 6c 73 6d 53 6f 72 74 65  URE.    lsmSorte
20040 64 44 75 6d 70 53 74 72 75 63 74 75 72 65 28 70  dDumpStructure(p
20050 44 62 2c 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72  Db, pDb->pWorker
20060 2c 20 4c 53 4d 5f 4c 4f 47 5f 44 41 54 41 2c 20  , LSM_LOG_DATA, 
20070 30 2c 20 22 6e 65 77 2d 74 6f 70 6c 65 76 65 6c  0, "new-toplevel
20080 22 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ");.#endif..    
20090 69 66 28 20 66 72 65 65 6c 69 73 74 2e 6e 45 6e  if( freelist.nEn
200a0 74 72 79 20 29 7b 0a 20 20 20 20 20 20 46 72 65  try ){.      Fre
200b0 65 6c 69 73 74 20 2a 70 20 3d 20 26 70 44 62 2d  elist *p = &pDb-
200c0 3e 70 57 6f 72 6b 65 72 2d 3e 66 72 65 65 6c 69  >pWorker->freeli
200d0 73 74 3b 0a 20 20 20 20 20 20 6c 73 6d 46 72 65  st;.      lsmFre
200e0 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70 2d 3e  e(pDb->pEnv, p->
200f0 61 45 6e 74 72 79 29 3b 0a 20 20 20 20 20 20 6d  aEntry);.      m
20100 65 6d 63 70 79 28 70 2c 20 26 66 72 65 65 6c 69  emcpy(p, &freeli
20110 73 74 2c 20 73 69 7a 65 6f 66 28 66 72 65 65 6c  st, sizeof(freel
20120 69 73 74 29 29 3b 0a 20 20 20 20 20 20 66 72 65  ist));.      fre
20130 65 6c 69 73 74 2e 61 45 6e 74 72 79 20 3d 20 30  elist.aEntry = 0
20140 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20150 20 20 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2d     pDb->pWorker-
20160 3e 66 72 65 65 6c 69 73 74 2e 6e 45 6e 74 72 79  >freelist.nEntry
20170 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
20180 20 61 73 73 65 72 74 42 74 72 65 65 4f 6b 28 70   assertBtreeOk(p
20190 44 62 2c 20 26 70 4e 65 77 2d 3e 6c 68 73 29 3b  Db, &pNew->lhs);
201a0 0a 20 20 20 20 73 6f 72 74 65 64 49 6e 76 6f 6b  .    sortedInvok
201b0 65 57 6f 72 6b 48 6f 6f 6b 28 70 44 62 29 3b 0a  eWorkHook(pDb);.
201c0 20 20 7d 0a 0a 20 20 69 66 28 20 70 6e 57 72 69    }..  if( pnWri
201d0 74 65 20 29 20 2a 70 6e 57 72 69 74 65 20 3d 20  te ) *pnWrite = 
201e0 6e 57 72 69 74 65 3b 0a 20 20 70 44 62 2d 3e 70  nWrite;.  pDb->p
201f0 57 6f 72 6b 65 72 2d 3e 6e 57 72 69 74 65 20 2b  Worker->nWrite +
20200 3d 20 6e 57 72 69 74 65 3b 0a 20 20 70 44 62 2d  = nWrite;.  pDb-
20210 3e 70 46 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a  >pFreelist = 0;.
20220 20 20 70 44 62 2d 3e 62 55 73 65 46 72 65 65 6c    pDb->bUseFreel
20230 69 73 74 20 3d 20 30 3b 0a 20 20 6c 73 6d 46 72  ist = 0;.  lsmFr
20240 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20 66 72  ee(pDb->pEnv, fr
20250 65 65 6c 69 73 74 2e 61 45 6e 74 72 79 29 3b 0a  eelist.aEntry);.
20260 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20270 2f 2a 0a 2a 2a 20 54 68 65 20 6e 4d 65 72 67 65  /*.** The nMerge
20280 20 6c 65 76 65 6c 73 20 69 6e 20 74 68 65 20 4c   levels in the L
20290 53 4d 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  SM beginning wit
202a0 68 20 70 4c 65 76 65 6c 20 63 6f 6e 73 69 73 74  h pLevel consist
202b0 20 6f 66 20 61 0a 2a 2a 20 6c 65 66 74 2d 68 61   of a.** left-ha
202c0 6e 64 2d 73 69 64 65 20 73 65 67 6d 65 6e 74 20  nd-side segment 
202d0 6f 6e 6c 79 2e 20 52 65 70 6c 61 63 65 20 74 68  only. Replace th
202e0 65 73 65 20 6c 65 76 65 6c 73 20 77 69 74 68 20  ese levels with 
202f0 61 20 73 69 6e 67 6c 65 20 6e 65 77 0a 2a 2a 20  a single new.** 
20300 6c 65 76 65 6c 20 63 6f 6e 73 69 73 74 69 6e 67  level consisting
20310 20 6f 66 20 61 20 6e 65 77 20 65 6d 70 74 79 20   of a new empty 
20320 73 65 67 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6c  segment on the l
20330 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 61 6e  eft-hand-side an
20340 64 20 74 68 65 0a 2a 2a 20 6e 4d 65 72 67 65 20  d the.** nMerge 
20350 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
20360 65 20 72 65 70 6c 61 63 65 64 20 6c 65 76 65 6c  e replaced level
20370 73 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  s on the right-h
20380 61 6e 64 2d 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20  and-side..**.** 
20390 41 6c 73 6f 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Also, allocate a
203a0 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 20 4d 65  nd populate a Me
203b0 72 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 73  rge object and s
203c0 65 74 20 4c 65 76 65 6c 2e 70 4d 65 72 67 65 20  et Level.pMerge 
203d0 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 69  to.** point to i
203e0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
203f0 20 73 6f 72 74 65 64 4d 65 72 67 65 53 65 74 75   sortedMergeSetu
20400 70 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62  p(.  lsm_db *pDb
20410 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20420 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
20430 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 4c 65 76   handle */.  Lev
20440 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20  el *pLevel,     
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20460 46 69 72 73 74 20 6c 65 76 65 6c 20 74 6f 20 6d  First level to m
20470 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  erge */.  int nM
20480 65 72 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  erge,           
20490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72            /* Mer
204a0 67 65 20 74 68 69 73 20 6d 61 6e 79 20 6c 65 76  ge this many lev
204b0 65 6c 73 20 74 6f 67 65 74 68 65 72 20 2a 2f 0a  els together */.
204c0 20 20 4c 65 76 65 6c 20 2a 2a 70 70 4e 65 77 20    Level **ppNew 
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204e0 20 20 2f 2a 20 4e 65 77 2c 20 6d 65 72 67 65 64    /* New, merged
204f0 2c 20 6c 65 76 65 6c 20 2a 2f 0a 29 7b 0a 20 20  , level */.){.  
20500 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b  int rc = LSM_OK;
20510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20520 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
20530 2f 0a 20 20 4c 65 76 65 6c 20 2a 70 4e 65 77 3b  /.  Level *pNew;
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 20 20 20 20 2f 2a 20 4e 65 77 20 4c 65 76 65 6c      /* New Level
20560 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
20570 20 62 55 73 65 4e 65 78 74 20 3d 20 30 3b 20 20   bUseNext = 0;  
20580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20590 54 72 75 65 20 74 6f 20 6c 69 6e 6b 20 69 6e 20  True to link in 
205a0 6e 65 78 74 20 73 65 70 61 72 61 74 6f 72 73 20  next separators 
205b0 2a 2f 0a 20 20 4d 65 72 67 65 20 2a 70 4d 65 72  */.  Merge *pMer
205c0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
205d0 20 20 20 20 20 2f 2a 20 4e 65 77 20 4d 65 72 67       /* New Merg
205e0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  e object */.  in
205f0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
20600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20610 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
20620 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 4d 65  allocated at pMe
20630 72 67 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 4c  rge */..#ifdef L
20640 53 4d 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 69  SM_DEBUG.  int i
20650 4c 65 76 65 6c 3b 0a 20 20 4c 65 76 65 6c 20 2a  Level;.  Level *
20660 70 58 20 3d 20 70 4c 65 76 65 6c 3b 0a 20 20 66  pX = pLevel;.  f
20670 6f 72 28 69 4c 65 76 65 6c 3d 30 3b 20 69 4c 65  or(iLevel=0; iLe
20680 76 65 6c 3c 6e 4d 65 72 67 65 3b 20 69 4c 65 76  vel<nMerge; iLev
20690 65 6c 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  el++){.    asser
206a0 74 28 20 70 58 2d 3e 6e 52 69 67 68 74 3d 3d 30  t( pX->nRight==0
206b0 20 29 3b 0a 20 20 20 20 70 58 20 3d 20 70 58 2d   );.    pX = pX-
206c0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64  >pNext;.  }.#end
206d0 69 66 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  if..  /* Allocat
206e0 65 20 74 68 65 20 6e 65 77 20 4c 65 76 65 6c 20  e the new Level 
206f0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 70 4e 65 77  object */.  pNew
20700 20 3d 20 28 4c 65 76 65 6c 20 2a 29 6c 73 6d 4d   = (Level *)lsmM
20710 61 6c 6c 6f 63 5a 65 72 6f 52 63 28 70 44 62 2d  allocZeroRc(pDb-
20720 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28 4c 65  >pEnv, sizeof(Le
20730 76 65 6c 29 2c 20 26 72 63 29 3b 0a 20 20 69 66  vel), &rc);.  if
20740 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e  ( pNew ){.    pN
20750 65 77 2d 3e 61 52 68 73 20 3d 20 28 53 65 67 6d  ew->aRhs = (Segm
20760 65 6e 74 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a  ent *)lsmMallocZ
20770 65 72 6f 52 63 28 70 44 62 2d 3e 70 45 6e 76 2c  eroRc(pDb->pEnv,
20780 20 0a 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 20 20 20 20                  
207a0 20 20 20 20 20 20 20 20 20 20 6e 4d 65 72 67 65            nMerge
207b0 20 2a 20 73 69 7a 65 6f 66 28 53 65 67 6d 65 6e   * sizeof(Segmen
207c0 74 29 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 20  t), &rc);.  }.. 
207d0 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
207e0 20 6e 65 77 20 4c 65 76 65 6c 20 6f 62 6a 65 63   new Level objec
207f0 74 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 4c  t */.  if( rc==L
20800 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 4c 65 76  SM_OK ){.    Lev
20810 65 6c 20 2a 70 4e 65 78 74 20 3d 20 30 3b 20 20  el *pNext = 0;  
20820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
20830 76 65 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 4e  vel following pN
20840 65 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  ew */.    int i;
20850 0a 20 20 20 20 69 6e 74 20 62 46 72 65 65 4f 6e  .    int bFreeOn
20860 6c 79 20 3d 20 31 3b 0a 20 20 20 20 4c 65 76 65  ly = 1;.    Leve
20870 6c 20 2a 70 54 6f 70 4c 65 76 65 6c 3b 0a 20 20  l *pTopLevel;.  
20880 20 20 4c 65 76 65 6c 20 2a 70 20 3d 20 70 4c 65    Level *p = pLe
20890 76 65 6c 3b 0a 20 20 20 20 4c 65 76 65 6c 20 2a  vel;.    Level *
208a0 2a 70 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  *pp;.    pNew->n
208b0 52 69 67 68 74 20 3d 20 6e 4d 65 72 67 65 3b 0a  Right = nMerge;.
208c0 20 20 20 20 70 4e 65 77 2d 3e 69 41 67 65 20 3d      pNew->iAge =
208d0 20 70 4c 65 76 65 6c 2d 3e 69 41 67 65 2b 31 3b   pLevel->iAge+1;
208e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
208f0 6e 4d 65 72 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  nMerge; i++){.  
20900 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
20910 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
20920 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
20930 78 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  xt;.      pNew->
20940 61 52 68 73 5b 69 5d 20 3d 20 70 2d 3e 6c 68 73  aRhs[i] = p->lhs
20950 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e  ;.      if( (p->
20960 66 6c 61 67 73 20 26 20 4c 45 56 45 4c 5f 46 52  flags & LEVEL_FR
20970 45 45 4c 49 53 54 5f 4f 4e 4c 59 29 3d 3d 30 20  EELIST_ONLY)==0 
20980 29 20 62 46 72 65 65 4f 6e 6c 79 20 3d 20 30 3b  ) bFreeOnly = 0;
20990 0a 20 20 20 20 20 20 73 6f 72 74 65 64 46 72 65  .      sortedFre
209a0 65 4c 65 76 65 6c 28 70 44 62 2d 3e 70 45 6e 76  eLevel(pDb->pEnv
209b0 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 20 3d 20  , p);.      p = 
209c0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  pNext;.    }..  
209d0 20 20 69 66 28 20 62 46 72 65 65 4f 6e 6c 79 20    if( bFreeOnly 
209e0 29 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d  ) pNew->flags |=
209f0 20 4c 45 56 45 4c 5f 46 52 45 45 4c 49 53 54 5f   LEVEL_FREELIST_
20a00 4f 4e 4c 59 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ONLY;..    /* Re
20a10 70 6c 61 63 65 20 74 68 65 20 6f 6c 64 20 6c 65  place the old le
20a20 76 65 6c 73 20 77 69 74 68 20 74 68 65 20 6e 65  vels with the ne
20a30 77 2e 20 2a 2f 0a 20 20 20 20 70 54 6f 70 4c 65  w. */.    pTopLe
20a40 76 65 6c 20 3d 20 6c 73 6d 44 62 53 6e 61 70 73  vel = lsmDbSnaps
20a50 68 6f 74 4c 65 76 65 6c 28 70 44 62 2d 3e 70 57  hotLevel(pDb->pW
20a60 6f 72 6b 65 72 29 3b 0a 20 20 20 20 70 4e 65 77  orker);.    pNew
20a70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
20a80 20 66 6f 72 28 70 70 3d 26 70 54 6f 70 4c 65 76   for(pp=&pTopLev
20a90 65 6c 3b 20 2a 70 70 21 3d 70 4c 65 76 65 6c 3b  el; *pp!=pLevel;
20aa0 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65   pp=&((*pp)->pNe
20ab0 78 74 29 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  xt));.    *pp = 
20ac0 70 4e 65 77 3b 0a 20 20 20 20 6c 73 6d 44 62 53  pNew;.    lsmDbS
20ad0 6e 61 70 73 68 6f 74 53 65 74 4c 65 76 65 6c 28  napshotSetLevel(
20ae0 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2c 20 70 54  pDb->pWorker, pT
20af0 6f 70 4c 65 76 65 6c 29 3b 0a 0a 20 20 20 20 2f  opLevel);..    /
20b00 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
20b10 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6e  her or not the n
20b20 65 78 74 20 73 65 70 61 72 61 74 6f 72 73 20 77  ext separators w
20b30 69 6c 6c 20 62 65 20 6c 69 6e 6b 65 64 20 69 6e  ill be linked in
20b40 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 78   */.    if( pNex
20b50 74 20 26 26 20 70 4e 65 78 74 2d 3e 70 4d 65 72  t && pNext->pMer
20b60 67 65 3d 3d 30 20 26 26 20 70 4e 65 78 74 2d 3e  ge==0 && pNext->
20b70 6c 68 73 2e 69 52 6f 6f 74 20 26 26 20 70 4e 65  lhs.iRoot && pNe
20b80 78 74 20 0a 20 20 20 20 20 26 26 20 28 62 46 72  xt .     && (bFr
20b90 65 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 4e  eeOnly==0 || (pN
20ba0 65 78 74 2d 3e 66 6c 61 67 73 20 26 20 4c 45 56  ext->flags & LEV
20bb0 45 4c 5f 46 52 45 45 4c 49 53 54 5f 4f 4e 4c 59  EL_FREELIST_ONLY
20bc0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
20bd0 62 55 73 65 4e 65 78 74 20 3d 20 31 3b 0a 20 20  bUseNext = 1;.  
20be0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
20bf0 6c 6f 63 61 74 65 20 74 68 65 20 6d 65 72 67 65  locate the merge
20c00 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 6e 42 79   object */.  nBy
20c10 74 65 20 3d 20 73 69 7a 65 6f 66 28 4d 65 72 67  te = sizeof(Merg
20c20 65 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 72 67  e) + sizeof(Merg
20c30 65 49 6e 70 75 74 29 20 2a 20 28 6e 4d 65 72 67  eInput) * (nMerg
20c40 65 20 2b 20 62 55 73 65 4e 65 78 74 29 3b 0a 20  e + bUseNext);. 
20c50 20 70 4d 65 72 67 65 20 3d 20 28 4d 65 72 67 65   pMerge = (Merge
20c60 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f   *)lsmMallocZero
20c70 52 63 28 70 44 62 2d 3e 70 45 6e 76 2c 20 6e 42  Rc(pDb->pEnv, nB
20c80 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 69 66 28  yte, &rc);.  if(
20c90 20 70 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 70   pMerge ){.    p
20ca0 4d 65 72 67 65 2d 3e 61 49 6e 70 75 74 20 3d 20  Merge->aInput = 
20cb0 28 4d 65 72 67 65 49 6e 70 75 74 20 2a 29 26 70  (MergeInput *)&p
20cc0 4d 65 72 67 65 5b 31 5d 3b 0a 20 20 20 20 70 4d  Merge[1];.    pM
20cd0 65 72 67 65 2d 3e 6e 49 6e 70 75 74 20 3d 20 6e  erge->nInput = n
20ce0 4d 65 72 67 65 20 2b 20 62 55 73 65 4e 65 78 74  Merge + bUseNext
20cf0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 72  ;.    pNew->pMer
20d00 67 65 20 3d 20 70 4d 65 72 67 65 3b 0a 20 20 7d  ge = pMerge;.  }
20d10 0a 0a 20 20 2a 70 70 4e 65 77 20 3d 20 70 4e 65  ..  *ppNew = pNe
20d20 77 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  w;.  return rc;.
20d30 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  }..static int me
20d40 72 67 65 57 6f 72 6b 65 72 49 6e 69 74 28 0a 20  rgeWorkerInit(. 
20d50 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 20 20   lsm_db *pDb,   
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d70 20 2f 2a 20 44 62 20 63 6f 6e 6e 65 63 74 69 6f   /* Db connectio
20d80 6e 20 74 6f 20 64 6f 20 6d 65 72 67 65 20 77 6f  n to do merge wo
20d90 72 6b 20 2a 2f 0a 20 20 4c 65 76 65 6c 20 2a 70  rk */.  Level *p
20da0 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  Level,          
20db0 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
20dc0 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 6d 65 72 67   to work on merg
20dd0 69 6e 67 20 2a 2f 0a 20 20 4d 65 72 67 65 57 6f  ing */.  MergeWo
20de0 72 6b 65 72 20 2a 70 4d 57 20 20 20 20 20 20 20  rker *pMW       
20df0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
20e00 63 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ct to initialize
20e10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
20e20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20  = LSM_OK;       
20e30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
20e40 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 72  rn code */.  Mer
20e50 67 65 20 2a 70 4d 65 72 67 65 20 3d 20 70 4c 65  ge *pMerge = pLe
20e60 76 65 6c 2d 3e 70 4d 65 72 67 65 3b 20 2f 2a 20  vel->pMerge; /* 
20e70 50 65 72 73 69 73 74 65 6e 74 20 70 61 72 74 20  Persistent part 
20e80 6f 66 20 6d 65 72 67 65 20 73 74 61 74 65 20 2a  of merge state *
20e90 2f 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20  /.  MultiCursor 
20ea0 2a 70 43 73 72 20 3d 20 30 3b 20 20 20 20 20 20  *pCsr = 0;      
20eb0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
20ec0 65 6e 65 64 20 66 6f 72 20 70 4d 57 20 2a 2f 0a  ened for pMW */.
20ed0 20 20 4c 65 76 65 6c 20 2a 70 4e 65 78 74 20 3d    Level *pNext =
20ee0 20 70 4c 65 76 65 6c 2d 3e 70 4e 65 78 74 3b 20   pLevel->pNext; 
20ef0 20 20 2f 2a 20 4e 65 78 74 20 6c 65 76 65 6c 20    /* Next level 
20f00 69 6e 20 4c 53 4d 20 2a 2f 0a 0a 20 20 61 73 73  in LSM */..  ass
20f10 65 72 74 28 20 70 44 62 2d 3e 70 57 6f 72 6b 65  ert( pDb->pWorke
20f20 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
20f30 4c 65 76 65 6c 2d 3e 70 4d 65 72 67 65 20 29 3b  Level->pMerge );
20f40 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65  .  assert( pLeve
20f50 6c 2d 3e 6e 52 69 67 68 74 3e 30 20 29 3b 0a 0a  l->nRight>0 );..
20f60 20 20 6d 65 6d 73 65 74 28 70 4d 57 2c 20 30 2c    memset(pMW, 0,
20f70 20 73 69 7a 65 6f 66 28 4d 65 72 67 65 57 6f 72   sizeof(MergeWor
20f80 6b 65 72 29 29 3b 0a 20 20 70 4d 57 2d 3e 70 44  ker));.  pMW->pD
20f90 62 20 3d 20 70 44 62 3b 0a 20 20 70 4d 57 2d 3e  b = pDb;.  pMW->
20fa0 70 4c 65 76 65 6c 20 3d 20 70 4c 65 76 65 6c 3b  pLevel = pLevel;
20fb0 0a 20 20 70 4d 57 2d 3e 61 47 6f 62 62 6c 65 20  .  pMW->aGobble 
20fc0 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52  = lsmMallocZeroR
20fd0 63 28 70 44 62 2d 3e 70 45 6e 76 2c 20 73 69 7a  c(pDb->pEnv, siz
20fe0 65 6f 66 28 50 67 6e 6f 29 20 2a 20 70 4c 65 76  eof(Pgno) * pLev
20ff0 65 6c 2d 3e 6e 52 69 67 68 74 2c 20 26 72 63 29  el->nRight, &rc)
21000 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61  ;..  /* Create a
21010 20 6d 75 6c 74 69 2d 63 75 72 73 6f 72 20 74 6f   multi-cursor to
21020 20 72 65 61 64 20 74 68 65 20 64 61 74 61 20 74   read the data t
21030 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e  o write to the n
21040 65 77 0a 20 20 2a 2a 20 73 65 67 6d 65 6e 74 2e  ew.  ** segment.
21050 20 54 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74   The new segment
21060 20 63 6f 6e 74 61 69 6e 73 3a 0a 20 20 2a 2a 0a   contains:.  **.
21070 20 20 2a 2a 20 20 20 31 2e 20 52 65 63 6f 72 64    **   1. Record
21080 73 20 66 72 6f 6d 20 4c 48 53 20 6f 66 20 65 61  s from LHS of ea
21090 63 68 20 6f 66 20 74 68 65 20 6e 4d 65 72 67 65  ch of the nMerge
210a0 20 6c 65 76 65 6c 73 20 62 65 69 6e 67 20 6d 65   levels being me
210b0 72 67 65 64 2e 0a 20 20 2a 2a 20 20 20 32 2e 20  rged..  **   2. 
210c0 53 65 70 61 72 61 74 6f 72 73 20 66 72 6f 6d 20  Separators from 
210d0 65 69 74 68 65 72 20 74 68 65 20 6c 61 73 74 20  either the last 
210e0 6c 65 76 65 6c 20 62 65 69 6e 67 20 6d 65 72 67  level being merg
210f0 65 64 2c 20 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed, or the.  ** 
21100 20 20 20 20 20 73 65 70 61 72 61 74 6f 72 73 20       separators 
21110 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
21120 4c 48 53 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  LHS of the follo
21130 77 69 6e 67 20 6c 65 76 65 6c 2c 20 6f 72 20 6e  wing level, or n
21140 65 69 74 68 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a  either..  **.  *
21150 2a 20 49 66 20 74 68 65 20 6e 65 77 20 6c 65 76  * If the new lev
21160 65 6c 20 69 73 20 74 68 65 20 6c 6f 77 65 73 74  el is the lowest
21170 20 28 6f 6c 64 65 73 74 29 20 69 6e 20 74 68 65   (oldest) in the
21180 20 64 62 2c 20 64 69 73 63 61 72 64 20 61 6e 79   db, discard any
21190 0a 20 20 2a 2a 20 64 65 6c 65 74 65 20 6b 65 79  .  ** delete key
211a0 73 2e 20 4b 65 79 20 61 6e 6e 69 68 69 6c 61 74  s. Key annihilat
211b0 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 43 73 72  ion..  */.  pCsr
211c0 20 3d 20 6d 75 6c 74 69 43 75 72 73 6f 72 4e 65   = multiCursorNe
211d0 77 28 70 44 62 2c 20 26 72 63 29 3b 0a 20 20 69  w(pDb, &rc);.  i
211e0 66 28 20 70 43 73 72 20 29 7b 0a 20 20 20 20 70  f( pCsr ){.    p
211f0 43 73 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 55  Csr->flags |= CU
21200 52 53 4f 52 5f 4e 45 58 54 5f 4f 4b 3b 0a 20 20  RSOR_NEXT_OK;.  
21210 20 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72 73    rc = multiCurs
21220 6f 72 41 64 64 52 68 73 28 70 43 73 72 2c 20 70  orAddRhs(pCsr, p
21230 4c 65 76 65 6c 29 3b 0a 20 20 7d 0a 20 20 69 66  Level);.  }.  if
21240 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20  ( rc==LSM_OK && 
21250 70 4d 65 72 67 65 2d 3e 6e 49 6e 70 75 74 20 3e  pMerge->nInput >
21260 20 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74 20   pLevel->nRight 
21270 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
21280 65 43 75 72 73 6f 72 4e 65 77 28 70 44 62 2c 20  eCursorNew(pDb, 
21290 26 70 4e 65 78 74 2d 3e 6c 68 73 2c 20 26 70 43  &pNext->lhs, &pC
212a0 73 72 2d 3e 70 42 74 43 73 72 29 3b 0a 20 20 7d  sr->pBtCsr);.  }
212b0 65 6c 73 65 20 69 66 28 20 70 4e 65 78 74 20 29  else if( pNext )
212c0 7b 0a 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f  {.    multiCurso
212d0 72 52 65 61 64 53 65 70 61 72 61 74 6f 72 73 28  rReadSeparators(
212e0 70 43 73 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCsr);.  }else{.
212f0 20 20 20 20 6d 75 6c 74 69 43 75 72 73 6f 72 49      multiCursorI
21300 67 6e 6f 72 65 44 65 6c 65 74 65 28 70 43 73 72  gnoreDelete(pCsr
21310 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
21320 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20  ( rc!=LSM_OK || 
21330 70 4d 65 72 67 65 2d 3e 6e 49 6e 70 75 74 3d 3d  pMerge->nInput==
21340 28 70 43 73 72 2d 3e 6e 50 74 72 2b 28 70 43 73  (pCsr->nPtr+(pCs
21350 72 2d 3e 70 42 74 43 73 72 21 3d 30 29 29 20 29  r->pBtCsr!=0)) )
21360 3b 0a 20 20 70 4d 57 2d 3e 70 43 73 72 20 3d 20  ;.  pMW->pCsr = 
21370 70 43 73 72 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64  pCsr;..  /* Load
21380 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
21390 61 72 63 68 79 20 69 6e 74 6f 20 6d 65 6d 6f 72  archy into memor
213a0 79 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  y. */.  if( rc==
213b0 4c 53 4d 5f 4f 4b 20 29 20 72 63 20 3d 20 6d 65  LSM_OK ) rc = me
213c0 72 67 65 57 6f 72 6b 65 72 4c 6f 61 64 48 69 65  rgeWorkerLoadHie
213d0 72 61 72 63 68 79 28 70 4d 57 29 3b 0a 20 20 69  rarchy(pMW);.  i
213e0 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  f( rc==LSM_OK &&
213f0 20 70 4d 57 2d 3e 68 69 65 72 2e 6e 48 69 65 72   pMW->hier.nHier
21400 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4d 57 2d 3e  ==0 ){.    pMW->
21410 61 53 61 76 65 5b 30 5d 2e 69 50 67 6e 6f 20 3d  aSave[0].iPgno =
21420 20 70 4c 65 76 65 6c 2d 3e 6c 68 73 2e 69 46 69   pLevel->lhs.iFi
21430 72 73 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  rst;.  }..  /* P
21440 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73  osition the curs
21450 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  or. */.  if( rc=
21460 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  =LSM_OK ){.    p
21470 43 73 72 2d 3e 70 50 72 65 76 4d 65 72 67 65 50  Csr->pPrevMergeP
21480 74 72 20 3d 20 26 70 4d 65 72 67 65 2d 3e 69 43  tr = &pMerge->iC
21490 75 72 72 65 6e 74 50 74 72 3b 0a 20 20 20 20 69  urrentPtr;.    i
214a0 66 28 20 70 4c 65 76 65 6c 2d 3e 6c 68 73 2e 69  f( pLevel->lhs.i
214b0 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  First==0 ){.    
214c0 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
214d0 61 72 72 61 79 20 69 73 20 73 74 69 6c 6c 20 65  array is still e
214e0 6d 70 74 79 2e 20 53 6f 20 70 6f 73 69 74 69 6f  mpty. So positio
214f0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 74 20  n the cursor at 
21500 74 68 65 20 76 65 72 79 20 0a 20 20 20 20 20 20  the very .      
21510 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
21520 69 6e 70 75 74 2e 20 20 2a 2f 0a 20 20 20 20 20  input.  */.     
21530 20 72 63 20 3d 20 6d 75 6c 74 69 43 75 72 73 6f   rc = multiCurso
21540 72 45 6e 64 28 70 43 73 72 2c 20 30 29 3b 0a 20  rEnd(pCsr, 0);. 
21550 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21560 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 61 72  /* The output ar
21570 72 61 79 20 69 73 20 6e 6f 6e 2d 65 6d 70 74 79  ray is non-empty
21580 2e 20 50 6f 73 69 74 69 6f 6e 20 74 68 65 20 63  . Position the c
21590 75 72 73 6f 72 20 62 61 73 65 64 20 6f 6e 20 74  ursor based on t
215a0 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  he.      ** page
215b0 2f 63 65 6c 6c 20 64 61 74 61 20 73 61 76 65 64  /cell data saved
215c0 20 69 6e 20 74 68 65 20 4d 65 72 67 65 2e 61 49   in the Merge.aI
215d0 6e 70 75 74 5b 5d 20 61 72 72 61 79 2e 20 20 2a  nput[] array.  *
215e0 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  /.      int i;. 
215f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63       for(i=0; rc
21600 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 69 3c 70 43  ==LSM_OK && i<pC
21610 73 72 2d 3e 6e 50 74 72 3b 20 69 2b 2b 29 7b 0a  sr->nPtr; i++){.
21620 20 20 20 20 20 20 20 20 4d 65 72 67 65 49 6e 70          MergeInp
21630 75 74 20 2a 70 49 6e 70 75 74 20 3d 20 26 70 4d  ut *pInput = &pM
21640 65 72 67 65 2d 3e 61 49 6e 70 75 74 5b 69 5d 3b  erge->aInput[i];
21650 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
21660 70 75 74 2d 3e 69 50 67 20 29 7b 0a 20 20 20 20  put->iPg ){.    
21670 20 20 20 20 20 20 53 65 67 6d 65 6e 74 50 74 72        SegmentPtr
21680 20 2a 70 50 74 72 3b 0a 20 20 20 20 20 20 20 20   *pPtr;.        
21690 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e    assert( pCsr->
216a0 61 50 74 72 5b 69 5d 2e 70 50 67 3d 3d 30 20 29  aPtr[i].pPg==0 )
216b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 74 72  ;.          pPtr
216c0 20 3d 20 26 70 43 73 72 2d 3e 61 50 74 72 5b 69   = &pCsr->aPtr[i
216d0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ];.          rc 
216e0 3d 20 73 65 67 6d 65 6e 74 50 74 72 4c 6f 61 64  = segmentPtrLoad
216f0 50 61 67 65 28 70 44 62 2d 3e 70 46 53 2c 20 70  Page(pDb->pFS, p
21700 50 74 72 2c 20 28 69 6e 74 29 70 49 6e 70 75 74  Ptr, (int)pInput
21710 2d 3e 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20  ->iPg);.        
21720 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b    if( rc==LSM_OK
21730 20 26 26 20 70 50 74 72 2d 3e 6e 43 65 6c 6c 3e   && pPtr->nCell>
21740 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
21750 20 72 63 20 3d 20 73 65 67 6d 65 6e 74 50 74 72   rc = segmentPtr
21760 4c 6f 61 64 43 65 6c 6c 28 70 50 74 72 2c 20 70  LoadCell(pPtr, p
21770 49 6e 70 75 74 2d 3e 69 43 65 6c 6c 29 3b 0a 20  Input->iCell);. 
21780 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21790 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
217a0 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f      if( rc==LSM_
217b0 4f 4b 20 26 26 20 70 43 73 72 2d 3e 70 42 74 43  OK && pCsr->pBtC
217c0 73 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  sr ){.        in
217d0 74 20 28 2a 78 43 6d 70 29 28 76 6f 69 64 20 2a  t (*xCmp)(void *
217e0 2c 20 69 6e 74 2c 20 76 6f 69 64 20 2a 2c 20 69  , int, void *, i
217f0 6e 74 29 20 3d 20 70 43 73 72 2d 3e 70 44 62 2d  nt) = pCsr->pDb-
21800 3e 78 43 6d 70 3b 0a 20 20 20 20 20 20 20 20 61  >xCmp;.        a
21810 73 73 65 72 74 28 20 69 3d 3d 70 43 73 72 2d 3e  ssert( i==pCsr->
21820 6e 50 74 72 20 29 3b 0a 20 20 20 20 20 20 20 20  nPtr );.        
21830 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
21840 52 65 73 74 6f 72 65 28 70 43 73 72 2d 3e 70 42  Restore(pCsr->pB
21850 74 43 73 72 2c 20 78 43 6d 70 2c 20 26 70 4d 65  tCsr, xCmp, &pMe
21860 72 67 65 2d 3e 61 49 6e 70 75 74 5b 69 5d 29 3b  rge->aInput[i]);
21870 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
21880 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  if( rc==LSM_OK )
21890 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d  {.        rc = m
218a0 75 6c 74 69 43 75 72 73 6f 72 53 65 74 75 70 54  ultiCursorSetupT
218b0 72 65 65 28 70 43 73 72 2c 20 30 29 3b 0a 20 20  ree(pCsr, 0);.  
218c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
218d0 70 43 73 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43  pCsr->flags |= C
218e0 55 52 53 4f 52 5f 4e 45 58 54 5f 4f 4b 3b 0a 20  URSOR_NEXT_OK;. 
218f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
21900 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .}..static int s
21910 6f 72 74 65 64 42 74 72 65 65 47 6f 62 62 6c 65  ortedBtreeGobble
21920 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c  (.  lsm_db *pDb,
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21940 20 20 20 20 2f 2a 20 57 6f 72 6b 65 72 20 63 6f      /* Worker co
21950 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 4d 75  nnection */.  Mu
21960 6c 74 69 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  ltiCursor *pCsr,
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21980 20 4d 75 6c 74 69 2d 63 75 72 73 6f 72 20 62 65   Multi-cursor be
21990 69 6e 67 20 75 73 65 64 20 66 6f 72 20 61 20 6d  ing used for a m
219a0 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 47  erge */.  int iG
219b0 6f 62 62 6c 65 20 20 20 20 20 20 20 20 20 20 20  obble           
219c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 43 73            /* pCs
219d0 72 2d 3e 61 50 74 72 5b 5d 20 65 6e 74 72 79 20  r->aPtr[] entry 
219e0 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 2a 2f  to operate on */
219f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c  .){.  int rc = L
21a00 53 4d 5f 4f 4b 3b 0a 20 20 69 66 28 20 72 74 54  SM_OK;.  if( rtT
21a10 6f 70 69 63 28 70 43 73 72 2d 3e 65 54 79 70 65  opic(pCsr->eType
21a20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 65 67 6d  )==0 ){.    Segm
21a30 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 43 73 72  ent *pSeg = pCsr
21a40 2d 3e 61 50 74 72 5b 69 47 6f 62 62 6c 65 5d 2e  ->aPtr[iGobble].
21a50 70 53 65 67 3b 0a 20 20 20 20 50 67 6e 6f 20 2a  pSeg;.    Pgno *
21a60 61 50 67 3b 0a 20 20 20 20 69 6e 74 20 6e 50 67  aPg;.    int nPg
21a70 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 66  ;..    /* Seek f
21a80 72 6f 6d 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  rom the root of 
21a90 74 68 65 20 62 2d 74 72 65 65 20 74 6f 20 74 68  the b-tree to th
21aa0 65 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20 74  e segment leaf t
21ab0 68 61 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  hat may contain.
21ac0 20 20 20 20 2a 2a 20 61 20 6b 65 79 20 65 71 75      ** a key equ
21ad0 61 6c 20 74 6f 20 74 68 65 20 6f 6e 65 20 6d 75  al to the one mu
21ae0 6c 74 69 2d 63 75 72 73 6f 72 20 63 75 72 72 65  lti-cursor curre
21af0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ntly points to. 
21b00 52 65 63 6f 72 64 20 74 68 65 0a 20 20 20 20 2a  Record the.    *
21b10 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
21b20 20 65 61 63 68 20 62 2d 74 72 65 65 20 70 61 67   each b-tree pag
21b30 65 20 61 6e 64 20 74 68 65 20 6c 65 61 66 2e 20  e and the leaf. 
21b40 54 68 65 20 73 65 67 6d 65 6e 74 20 6d 61 79 20  The segment may 
21b50 62 65 0a 20 20 20 20 2a 2a 20 67 6f 62 62 6c 65  be.    ** gobble
21b60 64 20 75 70 20 74 6f 20 28 62 75 74 20 6e 6f 74  d up to (but not
21b70 20 69 6e 63 6c 75 64 69 6e 67 29 20 74 68 65 20   including) the 
21b80 66 69 72 73 74 20 6f 66 20 74 68 65 73 65 20 70  first of these p
21b90 61 67 65 20 6e 75 6d 62 65 72 73 2e 0a 20 20 20  age numbers..   
21ba0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
21bb0 70 53 65 67 2d 3e 69 52 6f 6f 74 3e 30 20 29 3b  pSeg->iRoot>0 );
21bc0 0a 20 20 20 20 61 50 67 20 3d 20 6c 73 6d 4d 61  .    aPg = lsmMa
21bd0 6c 6c 6f 63 5a 65 72 6f 52 63 28 70 44 62 2d 3e  llocZeroRc(pDb->
21be0 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28 50 67 6e  pEnv, sizeof(Pgn
21bf0 6f 29 2a 33 32 2c 20 26 72 63 29 3b 0a 20 20 20  o)*32, &rc);.   
21c00 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
21c10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  ){.      rc = se
21c20 65 6b 49 6e 42 74 72 65 65 28 70 43 73 72 2c 20  ekInBtree(pCsr, 
21c30 70 53 65 67 2c 20 0a 20 20 20 20 20 20 20 20 20  pSeg, .         
21c40 20 72 74 54 6f 70 69 63 28 70 43 73 72 2d 3e 65   rtTopic(pCsr->e
21c50 54 79 70 65 29 2c 20 70 43 73 72 2d 3e 6b 65 79  Type), pCsr->key
21c60 2e 70 44 61 74 61 2c 20 70 43 73 72 2d 3e 6b 65  .pData, pCsr->ke
21c70 79 2e 6e 44 61 74 61 2c 20 61 50 67 2c 20 30 0a  y.nData, aPg, 0.
21c80 20 20 20 20 20 20 29 3b 20 0a 20 20 20 20 7d 0a        ); .    }.
21c90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d  .    if( rc==LSM
21ca0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  _OK ){.      for
21cb0 28 6e 50 67 3d 30 3b 20 61 50 67 5b 6e 50 67 5d  (nPg=0; aPg[nPg]
21cc0 3b 20 6e 50 67 2b 2b 29 3b 0a 20 20 20 20 20 20  ; nPg++);.      
21cd0 6c 73 6d 46 73 47 6f 62 62 6c 65 28 70 44 62 2c  lsmFsGobble(pDb,
21ce0 20 70 53 65 67 2c 20 61 50 67 2c 20 6e 50 67 29   pSeg, aPg, nPg)
21cf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c 73 6d  ;.    }..    lsm
21d00 46 72 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20  Free(pDb->pEnv, 
21d10 61 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  aPg);.  }.  retu
21d20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21d30 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
21d40 73 20 74 6f 20 61 20 6c 65 76 65 6c 20 6f 66 20  s to a level of 
21d50 61 67 65 20 4e 2e 20 52 65 74 75 72 6e 20 74 68  age N. Return th
21d60 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  e number of leve
21d70 6c 73 20 69 6e 0a 2a 2a 20 74 68 65 20 6c 69 6e  ls in.** the lin
21d80 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
21d90 67 20 61 74 20 70 20 74 68 61 74 20 68 61 76 65  g at p that have
21da0 20 61 67 65 3d 4e 20 28 61 6c 77 61 79 73 20 61   age=N (always a
21db0 74 20 6c 65 61 73 74 20 31 29 2e 0a 2a 2f 0a 73  t least 1)..*/.s
21dc0 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74 65 64  tatic int sorted
21dd0 43 6f 75 6e 74 4c 65 76 65 6c 73 28 4c 65 76 65  CountLevels(Leve
21de0 6c 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 41 67  l *p){.  int iAg
21df0 65 20 3d 20 70 2d 3e 69 41 67 65 3b 0a 20 20 69  e = p->iAge;.  i
21e00 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20 64  nt nRet = 0;.  d
21e10 6f 20 7b 0a 20 20 20 20 6e 52 65 74 2b 2b 3b 0a  o {.    nRet++;.
21e20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
21e30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20 26 26  ;.  }while( p &&
21e40 20 70 2d 3e 69 41 67 65 3d 3d 69 41 67 65 20 29   p->iAge==iAge )
21e50 3b 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b  ;.  return nRet;
21e60 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .}..static int s
21e70 6f 72 74 65 64 53 65 6c 65 63 74 4c 65 76 65 6c  ortedSelectLevel
21e80 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 69 6e  (lsm_db *pDb, in
21e90 74 20 6e 4d 65 72 67 65 2c 20 4c 65 76 65 6c 20  t nMerge, Level 
21ea0 2a 2a 70 70 4f 75 74 29 7b 0a 20 20 4c 65 76 65  **ppOut){.  Leve
21eb0 6c 20 2a 70 54 6f 70 4c 65 76 65 6c 20 3d 20 6c  l *pTopLevel = l
21ec0 73 6d 44 62 53 6e 61 70 73 68 6f 74 4c 65 76 65  smDbSnapshotLeve
21ed0 6c 28 70 44 62 2d 3e 70 57 6f 72 6b 65 72 29 3b  l(pDb->pWorker);
21ee0 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f  .  int rc = LSM_
21ef0 4f 4b 3b 0a 20 20 4c 65 76 65 6c 20 2a 70 4c 65  OK;.  Level *pLe
21f00 76 65 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  vel = 0;        
21f10 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61      /* Output va
21f20 6c 75 65 20 2a 2f 0a 20 20 4c 65 76 65 6c 20 2a  lue */.  Level *
21f30 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
21f40 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20 6c         /* Best l
21f50 65 76 65 6c 20 74 6f 20 77 6f 72 6b 20 6f 6e 20  evel to work on 
21f60 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a  found so far */.
21f70 20 20 69 6e 74 20 6e 42 65 73 74 3b 20 20 20 20    int nBest;    
21f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
21fa0 6d 65 6e 74 73 20 6d 65 72 67 65 64 20 61 74 20  ments merged at 
21fb0 70 42 65 73 74 20 2a 2f 0a 20 20 4c 65 76 65 6c  pBest */.  Level
21fc0 20 2a 70 54 68 69 73 20 3d 20 30 3b 20 20 20 20   *pThis = 0;    
21fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
21fe0 74 20 69 6e 20 72 75 6e 20 6f 66 20 6c 65 76 65  t in run of leve
21ff0 6c 73 20 77 69 74 68 20 61 67 65 3d 69 41 67 65  ls with age=iAge
22000 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 68 69 73 20   */.  int nThis 
22010 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22020 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22030 20 6c 65 76 65 6c 73 20 73 74 61 72 74 69 6e 67   levels starting
22040 20 61 74 20 70 54 68 69 73 20 2a 2f 0a 0a 20 20   at pThis */..  
22050 61 73 73 65 72 74 28 20 6e 4d 65 72 67 65 3e 3d  assert( nMerge>=
22060 31 20 29 3b 0a 20 20 6e 42 65 73 74 20 3d 20 4c  1 );.  nBest = L
22070 53 4d 5f 4d 41 58 28 31 2c 20 6e 4d 65 72 67 65  SM_MAX(1, nMerge
22080 2d 31 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  -1);..  /* Find 
22090 74 68 65 20 6c 6f 6e 67 65 73 74 20 63 6f 6e 74  the longest cont
220a0 69 67 75 6f 75 73 20 72 75 6e 20 6f 66 20 6c 65  iguous run of le
220b0 76 65 6c 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  vels not current
220c0 6c 79 20 75 6e 64 65 72 67 6f 69 6e 67 20 61 20  ly undergoing a 
220d0 0a 20 20 2a 2a 20 6d 65 72 67 65 20 77 69 74 68  .  ** merge with
220e0 20 74 68 65 20 73 61 6d 65 20 61 67 65 20 69 6e   the same age in
220f0 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
22100 4f 72 20 74 68 65 20 6c 65 76 65 6c 20 62 65 69  Or the level bei
22110 6e 67 20 6d 65 72 67 65 64 0a 20 20 2a 2a 20 77  ng merged.  ** w
22120 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
22130 6e 75 6d 62 65 72 20 6f 66 20 72 69 67 68 74 2d  number of right-
22140 68 61 6e 64 20 73 65 67 6d 65 6e 74 73 2e 20 57  hand segments. W
22150 6f 72 6b 20 6f 6e 20 69 74 2e 20 2a 2f 0a 20 20  ork on it. */.  
22160 66 6f 72 28 70 4c 65 76 65 6c 3d 70 54 6f 70 4c  for(pLevel=pTopL
22170 65 76 65 6c 3b 20 70 4c 65 76 65 6c 3b 20 70 4c  evel; pLevel; pL
22180 65 76 65 6c 3d 70 4c 65 76 65 6c 2d 3e 70 4e 65  evel=pLevel->pNe
22190 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 65  xt){.    if( pLe
221a0 76 65 6c 2d 3e 6e 52 69 67 68 74 3d 3d 30 20 26  vel->nRight==0 &
221b0 26 20 70 54 68 69 73 20 26 26 20 70 4c 65 76 65  & pThis && pLeve
221c0 6c 2d 3e 69 41 67 65 3d 3d 70 54 68 69 73 2d 3e  l->iAge==pThis->
221d0 69 41 67 65 20 29 7b 0a 20 20 20 20 20 20 6e 54  iAge ){.      nT
221e0 68 69 73 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  his++;.    }else
221f0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 54 68 69  {.      if( nThi
22200 73 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20  s>nBest ){.     
22210 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
22220 69 41 67 65 21 3d 70 54 68 69 73 2d 3e 69 41 67  iAge!=pThis->iAg
22230 65 2b 31 29 0a 20 20 20 20 20 20 20 20 20 7c 7c  e+1).         ||
22240 20 28 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74   (pLevel->nRight
22250 3d 3d 30 20 26 26 20 73 6f 72 74 65 64 43 6f 75  ==0 && sortedCou
22260 6e 74 4c 65 76 65 6c 73 28 70 4c 65 76 65 6c 29  ntLevels(pLevel)
22270 3c 3d 70 44 62 2d 3e 6e 4d 65 72 67 65 29 0a 20  <=pDb->nMerge). 
22280 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
22290 20 20 20 20 70 42 65 73 74 20 3d 20 70 54 68 69      pBest = pThi
222a0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65  s;.          nBe
222b0 73 74 20 3d 20 6e 54 68 69 73 3b 0a 20 20 20 20  st = nThis;.    
222c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
222d0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
222e0 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  nRight ){.      
222f0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 52    if( pLevel->nR
22300 69 67 68 74 3e 6e 42 65 73 74 20 29 7b 0a 20 20  ight>nBest ){.  
22310 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20          nBest = 
22320 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3b 0a  pLevel->nRight;.
22330 20 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20            pBest 
22340 3d 20 70 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20  = pLevel;.      
22350 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 54 68 69    }.        nThi
22360 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  s = 0;.        p
22370 54 68 69 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  This = 0;.      
22380 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
22390 54 68 69 73 20 3d 20 70 4c 65 76 65 6c 3b 0a 20  This = pLevel;. 
223a0 20 20 20 20 20 20 20 6e 54 68 69 73 20 3d 20 31         nThis = 1
223b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
223c0 20 20 7d 0a 20 20 69 66 28 20 6e 54 68 69 73 3e    }.  if( nThis>
223d0 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 61 73 73  nBest ){.    ass
223e0 65 72 74 28 20 70 54 68 69 73 20 29 3b 0a 20 20  ert( pThis );.  
223f0 20 20 70 42 65 73 74 20 3d 20 70 54 68 69 73 3b    pBest = pThis;
22400 0a 20 20 20 20 6e 42 65 73 74 20 3d 20 6e 54 68  .    nBest = nTh
22410 69 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  is;.  }..  if( p
22420 42 65 73 74 3d 3d 30 20 26 26 20 6e 4d 65 72 67  Best==0 && nMerg
22430 65 3d 3d 31 20 29 7b 0a 20 20 20 20 69 6e 74 20  e==1 ){.    int 
22440 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 69  nFree = 0;.    i
22450 6e 74 20 6e 55 73 72 20 3d 20 30 3b 0a 20 20 20  nt nUsr = 0;.   
22460 20 66 6f 72 28 70 4c 65 76 65 6c 3d 70 54 6f 70   for(pLevel=pTop
22470 4c 65 76 65 6c 3b 20 70 4c 65 76 65 6c 3b 20 70  Level; pLevel; p
22480 4c 65 76 65 6c 3d 70 4c 65 76 65 6c 2d 3e 70 4e  Level=pLevel->pN
22490 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
224a0 72 74 28 20 21 70 4c 65 76 65 6c 2d 3e 6e 52 69  rt( !pLevel->nRi
224b0 67 68 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ght );.      if(
224c0 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26   pLevel->flags &
224d0 20 4c 45 56 45 4c 5f 46 52 45 45 4c 49 53 54 5f   LEVEL_FREELIST_
224e0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
224f0 6e 46 72 65 65 2b 2b 3b 0a 20 20 20 20 20 20 7d  nFree++;.      }
22500 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 55  else{.        nU
22510 73 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sr++;.      }.  
22520 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 55 73 72    }.    if( nUsr
22530 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 65 73  >1 ){.      pBes
22540 74 20 3d 20 70 54 6f 70 4c 65 76 65 6c 3b 0a 20  t = pTopLevel;. 
22550 20 20 20 20 20 6e 42 65 73 74 20 3d 20 6e 46 72       nBest = nFr
22560 65 65 20 2b 20 6e 55 73 72 3b 0a 20 20 20 20 7d  ee + nUsr;.    }
22570 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 65 73  .  }..  if( pBes
22580 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 65  t ){.    if( pBe
22590 73 74 2d 3e 6e 52 69 67 68 74 3d 3d 30 20 29 7b  st->nRight==0 ){
225a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 6f 72 74  .      rc = sort
225b0 65 64 4d 65 72 67 65 53 65 74 75 70 28 70 44 62  edMergeSetup(pDb
225c0 2c 20 70 42 65 73 74 2c 20 6e 42 65 73 74 2c 20  , pBest, nBest, 
225d0 70 70 4f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  ppOut);.    }els
225e0 65 7b 0a 20 20 20 20 20 20 2a 70 70 4f 75 74 20  e{.      *ppOut 
225f0 3d 20 70 42 65 73 74 3b 0a 20 20 20 20 7d 0a 20  = pBest;.    }. 
22600 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
22610 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .}..static int s
22620 6f 72 74 65 64 44 62 49 73 46 75 6c 6c 28 6c 73  ortedDbIsFull(ls
22630 6d 5f 64 62 20 2a 70 44 62 29 7b 0a 20 20 4c 65  m_db *pDb){.  Le
22640 76 65 6c 20 2a 70 54 6f 70 20 3d 20 6c 73 6d 44  vel *pTop = lsmD
22650 62 53 6e 61 70 73 68 6f 74 4c 65 76 65 6c 28 70  bSnapshotLevel(p
22660 44 62 2d 3e 70 57 6f 72 6b 65 72 29 3b 0a 0a 20  Db->pWorker);.. 
22670 20 69 66 28 20 6c 73 6d 44 61 74 61 62 61 73 65   if( lsmDatabase
22680 46 75 6c 6c 28 70 44 62 29 20 29 20 72 65 74 75  Full(pDb) ) retu
22690 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 70  rn 1;.  if( pTop
226a0 20 26 26 20 70 54 6f 70 2d 3e 69 41 67 65 3d 3d   && pTop->iAge==
226b0 30 0a 20 20 20 26 26 20 28 70 54 6f 70 2d 3e 6e  0.   && (pTop->n
226c0 52 69 67 68 74 20 7c 7c 20 73 6f 72 74 65 64 43  Right || sortedC
226d0 6f 75 6e 74 4c 65 76 65 6c 73 28 70 54 6f 70 29  ountLevels(pTop)
226e0 3e 3d 70 44 62 2d 3e 6e 4d 65 72 67 65 29 0a 20  >=pDb->nMerge). 
226f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
22700 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
22710 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
22720 75 63 74 20 4d 6f 76 65 42 6c 6f 63 6b 43 74 78  uct MoveBlockCtx
22730 20 4d 6f 76 65 42 6c 6f 63 6b 43 74 78 3b 0a 73   MoveBlockCtx;.s
22740 74 72 75 63 74 20 4d 6f 76 65 42 6c 6f 63 6b 43  truct MoveBlockC
22750 74 78 20 7b 0a 20 20 69 6e 74 20 69 53 65 65 6e  tx {.  int iSeen
22760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22770 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
22780 75 73 20 66 72 65 65 20 62 6c 6f 63 6b 20 6f 6e  us free block on
22790 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69   list */.  int i
227a0 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20  From;           
227b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
227c0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c  tal number of bl
227d0 6f 63 6b 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ocks in file */.
227e0 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  };..static int m
227f0 6f 76 65 42 6c 6f 63 6b 43 62 28 76 6f 69 64 20  oveBlockCb(void 
22800 2a 70 43 74 78 2c 20 69 6e 74 20 69 42 6c 6b 2c  *pCtx, int iBlk,
22810 20 69 36 34 20 69 53 6e 61 70 73 68 6f 74 29 7b   i64 iSnapshot){
22820 0a 20 20 4d 6f 76 65 42 6c 6f 63 6b 43 74 78 20  .  MoveBlockCtx 
22830 2a 70 20 3d 20 28 4d 6f 76 65 42 6c 6f 63 6b 43  *p = (MoveBlockC
22840 74 78 20 2a 29 70 43 74 78 3b 0a 20 20 61 73 73  tx *)pCtx;.  ass
22850 65 72 74 28 20 70 2d 3e 69 46 72 6f 6d 3d 3d 30  ert( p->iFrom==0
22860 20 29 3b 0a 20 20 69 66 28 20 69 42 6c 6b 3d 3d   );.  if( iBlk==
22870 28 70 2d 3e 69 53 65 65 6e 2d 31 29 20 29 7b 0a  (p->iSeen-1) ){.
22880 20 20 20 20 70 2d 3e 69 53 65 65 6e 20 3d 20 69      p->iSeen = i
22890 42 6c 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Blk;.    return 
228a0 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 46 72 6f  0;.  }.  p->iFro
228b0 6d 20 3d 20 70 2d 3e 69 53 65 65 6e 2d 31 3b 0a  m = p->iSeen-1;.
228c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
228d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
228e0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
228f0 66 75 72 74 68 65 72 20 63 6f 6d 70 61 63 74 20  further compact 
22900 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
22910 68 69 63 68 20 61 6c 6c 20 0a 2a 2a 20 6f 66 20  hich all .** of 
22920 74 68 65 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  the content has 
22930 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 65 72  already been mer
22940 67 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ged into a singl
22950 65 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 0a 2a  e segment. If .*
22960 2a 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 6d  * possible, it m
22970 6f 76 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  oves the content
22980 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 62 6c  s of a single bl
22990 6f 63 6b 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ock from the end
229a0 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   of the.** file 
229b0 74 6f 20 61 20 66 72 65 65 2d 62 6c 6f 63 6b 20  to a free-block 
229c0 74 68 61 74 20 6c 69 65 73 20 63 6c 6f 73 65 72  that lies closer
229d0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
229e0 20 74 68 65 20 66 69 6c 65 20 28 61 6c 6c 6f 77   the file (allow
229f0 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ing.** the file 
22a00 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  to be eventually
22a10 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a   truncated)..*/.
22a20 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74 65  static int sorte
22a30 64 4d 6f 76 65 42 6c 6f 63 6b 28 6c 73 6d 5f 64  dMoveBlock(lsm_d
22a40 62 20 2a 70 44 62 2c 20 69 6e 74 20 2a 70 6e 57  b *pDb, int *pnW
22a50 72 69 74 65 29 7b 0a 20 20 53 6e 61 70 73 68 6f  rite){.  Snapsho
22a60 74 20 2a 70 20 3d 20 70 44 62 2d 3e 70 57 6f 72  t *p = pDb->pWor
22a70 6b 65 72 3b 0a 20 20 4c 65 76 65 6c 20 2a 70 4c  ker;.  Level *pL
22a80 76 6c 20 3d 20 6c 73 6d 44 62 53 6e 61 70 73 68  vl = lsmDbSnapsh
22a90 6f 74 4c 65 76 65 6c 28 70 29 3b 0a 20 20 69 6e  otLevel(p);.  in
22aa0 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20  t iFrom;        
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ac0 20 42 6c 6f 63 6b 20 74 6f 20 6d 6f 76 65 20 2a   Block to move *
22ad0 2f 0a 20 20 69 6e 74 20 69 54 6f 3b 20 20 20 20  /.  int iTo;    
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22af0 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
22b00 6f 6e 20 74 6f 20 6d 6f 76 65 20 62 6c 6f 63 6b  on to move block
22b10 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b   to */.  int rc;
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
22b40 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 4d 6f  rn code */..  Mo
22b50 76 65 42 6c 6f 63 6b 43 74 78 20 73 43 74 78 3b  veBlockCtx sCtx;
22b60 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c  ..  assert( pLvl
22b70 2d 3e 70 4e 65 78 74 3d 3d 30 20 26 26 20 70 4c  ->pNext==0 && pL
22b80 76 6c 2d 3e 6e 52 69 67 68 74 3d 3d 30 20 29 3b  vl->nRight==0 );
22b90 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 65  .  assert( p->re
22ba0 64 69 72 65 63 74 2e 6e 3c 3d 4c 53 4d 5f 4d 41  direct.n<=LSM_MA
22bb0 58 5f 42 4c 4f 43 4b 5f 52 45 44 49 52 45 43 54  X_BLOCK_REDIRECT
22bc0 53 20 29 3b 0a 0a 20 20 2a 70 6e 57 72 69 74 65  S );..  *pnWrite
22bd0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   = 0;..  /* Chec
22be0 6b 20 74 68 61 74 20 74 68 65 20 72 65 64 69 72  k that the redir
22bf0 65 63 74 20 61 72 72 61 79 20 69 73 20 6e 6f 74  ect array is not
22c00 20 61 6c 72 65 61 64 79 20 66 75 6c 6c 2e 20 49   already full. I
22c10 66 20 69 74 20 69 73 2c 20 72 65 74 75 72 6e 0a  f it is, return.
22c20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 6d 6f 76    ** without mov
22c30 69 6e 67 20 61 6e 79 20 64 61 74 61 62 61 73 65  ing any database
22c40 20 63 6f 6e 74 65 6e 74 2e 20 20 2a 2f 0a 20 20   content.  */.  
22c50 69 66 28 20 70 2d 3e 72 65 64 69 72 65 63 74 2e  if( p->redirect.
22c60 6e 3e 3d 4c 53 4d 5f 4d 41 58 5f 42 4c 4f 43 4b  n>=LSM_MAX_BLOCK
22c70 5f 52 45 44 49 52 45 43 54 53 20 29 20 72 65 74  _REDIRECTS ) ret
22c80 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 0a 20 20 2f  urn LSM_OK;..  /
22c90 2a 20 46 69 6e 64 20 74 68 65 20 6c 61 73 74 20  * Find the last 
22ca0 62 6c 6f 63 6b 20 6f 66 20 63 6f 6e 74 65 6e 74  block of content
22cb0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
22cc0 20 66 69 6c 65 2e 20 44 6f 20 74 68 69 73 20 62   file. Do this b
22cd0 79 20 0a 20 20 2a 2a 20 74 72 61 76 65 72 73 69  y .  ** traversi
22ce0 6e 67 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  ng the free-list
22cf0 20 69 6e 20 72 65 76 65 72 73 65 20 28 64 65 73   in reverse (des
22d00 63 65 6e 64 69 6e 67 20 62 6c 6f 63 6b 20 6e 75  cending block nu
22d10 6d 62 65 72 29 20 6f 72 64 65 72 2e 0a 20 20 2a  mber) order..  *
22d20 2a 20 54 68 65 20 66 69 72 73 74 20 62 6c 6f 63  * The first bloc
22d30 6b 20 6e 6f 74 20 6f 6e 20 74 68 65 20 66 72 65  k not on the fre
22d40 65 20 6c 69 73 74 20 69 73 20 74 68 65 20 6f 6e  e list is the on
22d50 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 6d  e that will be m
22d60 6f 76 65 64 2e 0a 20 20 2a 2a 20 53 69 6e 63 65  oved..  ** Since
22d70 20 74 68 65 20 64 62 20 63 6f 6e 73 69 73 74 73   the db consists
22d80 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 73 65 67   of a single seg
22d90 6d 65 6e 74 2c 20 74 68 65 72 65 20 69 73 20 6e  ment, there is n
22da0 6f 20 61 6d 62 69 67 75 69 74 79 20 61 73 0a 20  o ambiguity as. 
22db0 20 2a 2a 20 74 6f 20 77 68 69 63 68 20 73 65 67   ** to which seg
22dc0 6d 65 6e 74 20 74 68 65 20 62 6c 6f 63 6b 20 62  ment the block b
22dd0 65 6c 6f 6e 67 73 20 74 6f 2e 20 20 2a 2f 0a 20  elongs to.  */. 
22de0 20 73 43 74 78 2e 69 53 65 65 6e 20 3d 20 70 2d   sCtx.iSeen = p-
22df0 3e 6e 42 6c 6f 63 6b 2b 31 3b 0a 20 20 73 43 74  >nBlock+1;.  sCt
22e00 78 2e 69 46 72 6f 6d 20 3d 20 30 3b 0a 20 20 72  x.iFrom = 0;.  r
22e10 63 20 3d 20 6c 73 6d 57 61 6c 6b 46 72 65 65 6c  c = lsmWalkFreel
22e20 69 73 74 28 70 44 62 2c 20 31 2c 20 6d 6f 76 65  ist(pDb, 1, move
22e30 42 6c 6f 63 6b 43 62 2c 20 26 73 43 74 78 29 3b  BlockCb, &sCtx);
22e40 0a 20 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f  .  if( rc!=LSM_O
22e50 4b 20 7c 7c 20 73 43 74 78 2e 69 46 72 6f 6d 3d  K || sCtx.iFrom=
22e60 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
22e70 20 20 69 46 72 6f 6d 20 3d 20 73 43 74 78 2e 69    iFrom = sCtx.i
22e80 46 72 6f 6d 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  From;..  /* Find
22e90 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
22ea0 62 6c 6f 63 6b 20 69 6e 20 74 68 65 20 64 61 74  block in the dat
22eb0 61 62 61 73 65 2c 20 69 67 6e 6f 72 69 6e 67 20  abase, ignoring 
22ec0 62 6c 6f 63 6b 20 31 2e 20 42 6c 6f 63 6b 0a 20  block 1. Block. 
22ed0 20 2a 2a 20 31 20 69 73 20 74 72 69 63 6b 79 20   ** 1 is tricky 
22ee0 61 73 20 69 74 20 69 73 20 73 6d 61 6c 6c 65 72  as it is smaller
22ef0 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 20   than the other 
22f00 62 6c 6f 63 6b 73 2e 20 20 2a 2f 0a 20 20 72 63  blocks.  */.  rc
22f10 20 3d 20 6c 73 6d 42 6c 6f 63 6b 41 6c 6c 6f 63   = lsmBlockAlloc
22f20 61 74 65 28 70 44 62 2c 20 69 46 72 6f 6d 2c 20  ate(pDb, iFrom, 
22f30 26 69 54 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  &iTo);.  if( rc!
22f40 3d 4c 53 4d 5f 4f 4b 20 7c 7c 20 69 54 6f 3d 3d  =LSM_OK || iTo==
22f50 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
22f60 20 61 73 73 65 72 74 28 20 69 54 6f 21 3d 31 20   assert( iTo!=1 
22f70 26 26 20 69 54 6f 3c 69 46 72 6f 6d 20 29 3b 0a  && iTo<iFrom );.
22f80 0a 20 20 72 63 20 3d 20 6c 73 6d 46 73 4d 6f 76  .  rc = lsmFsMov
22f90 65 42 6c 6f 63 6b 28 70 44 62 2d 3e 70 46 53 2c  eBlock(pDb->pFS,
22fa0 20 26 70 4c 76 6c 2d 3e 6c 68 73 2c 20 69 54 6f   &pLvl->lhs, iTo
22fb0 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 69 66 28 20  , iFrom);.  if( 
22fc0 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
22fd0 20 20 69 66 28 20 70 2d 3e 72 65 64 69 72 65 63    if( p->redirec
22fe0 74 2e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t.a==0 ){.      
22ff0 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
23000 6f 66 28 73 74 72 75 63 74 20 52 65 64 69 72 65  of(struct Redire
23010 63 74 45 6e 74 72 79 29 20 2a 20 4c 53 4d 5f 4d  ctEntry) * LSM_M
23020 41 58 5f 42 4c 4f 43 4b 5f 52 45 44 49 52 45 43  AX_BLOCK_REDIREC
23030 54 53 3b 0a 20 20 20 20 20 20 70 2d 3e 72 65 64  TS;.      p->red
23040 69 72 65 63 74 2e 61 20 3d 20 6c 73 6d 4d 61 6c  irect.a = lsmMal
23050 6c 6f 63 5a 65 72 6f 52 63 28 70 44 62 2d 3e 70  locZeroRc(pDb->p
23060 45 6e 76 2c 20 6e 42 79 74 65 2c 20 26 72 63 29  Env, nByte, &rc)
23070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23080 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 0a 20  rc==LSM_OK ){.. 
23090 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66       /* Check if
230a0 20 74 68 65 20 62 6c 6f 63 6b 20 6a 75 73 74 20   the block just 
230b0 6d 6f 76 65 64 20 77 61 73 20 61 6c 72 65 61 64  moved was alread
230c0 79 20 72 65 64 69 72 65 63 74 65 64 2e 20 2a 2f  y redirected. */
230d0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
230e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
230f0 2d 3e 72 65 64 69 72 65 63 74 2e 6e 3b 20 69 2b  ->redirect.n; i+
23100 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
23110 70 2d 3e 72 65 64 69 72 65 63 74 2e 61 5b 69 5d  p->redirect.a[i]
23120 2e 69 54 6f 3d 3d 69 46 72 6f 6d 20 29 20 62 72  .iTo==iFrom ) br
23130 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
23140 20 20 20 20 69 66 28 20 69 3d 3d 70 2d 3e 72 65      if( i==p->re
23150 64 69 72 65 63 74 2e 6e 20 29 7b 0a 20 20 20 20  direct.n ){.    
23160 20 20 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 46 72      /* Block iFr
23170 6f 6d 20 77 61 73 20 6e 6f 74 20 61 6c 72 65 61  om was not alrea
23180 64 79 20 72 65 64 69 72 65 63 74 65 64 2e 20 41  dy redirected. A
23190 64 64 20 61 20 6e 65 77 20 61 72 72 61 79 20 65  dd a new array e
231a0 6e 74 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ntry. */.       
231b0 20 6d 65 6d 6d 6f 76 65 28 26 70 2d 3e 72 65 64   memmove(&p->red
231c0 69 72 65 63 74 2e 61 5b 31 5d 2c 20 26 70 2d 3e  irect.a[1], &p->
231d0 72 65 64 69 72 65 63 74 2e 61 5b 30 5d 2c 20 0a  redirect.a[0], .
231e0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
231f0 6f 66 28 73 74 72 75 63 74 20 52 65 64 69 72 65  of(struct Redire
23200 63 74 45 6e 74 72 79 29 20 2a 20 70 2d 3e 72 65  ctEntry) * p->re
23210 64 69 72 65 63 74 2e 6e 0a 20 20 20 20 20 20 20  direct.n.       
23220 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
23230 70 2d 3e 72 65 64 69 72 65 63 74 2e 61 5b 30 5d  p->redirect.a[0]
23240 2e 69 46 72 6f 6d 20 3d 20 69 46 72 6f 6d 3b 0a  .iFrom = iFrom;.
23250 20 20 20 20 20 20 20 20 70 2d 3e 72 65 64 69 72          p->redir
23260 65 63 74 2e 61 5b 30 5d 2e 69 54 6f 20 3d 20 69  ect.a[0].iTo = i
23270 54 6f 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72  To;.        p->r
23280 65 64 69 72 65 63 74 2e 6e 2b 2b 3b 0a 20 20 20  edirect.n++;.   
23290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
232a0 20 20 2f 2a 20 42 6c 6f 63 6b 20 69 46 72 6f 6d    /* Block iFrom
232b0 20 77 61 73 20 61 6c 72 65 61 64 79 20 72 65 64   was already red
232c0 69 72 65 63 74 65 64 2e 20 4f 76 65 72 77 72 69  irected. Overwri
232d0 74 65 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  te existing entr
232e0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 2d  y. */.        p-
232f0 3e 72 65 64 69 72 65 63 74 2e 61 5b 69 5d 2e 69  >redirect.a[i].i
23300 54 6f 20 3d 20 69 54 6f 3b 0a 20 20 20 20 20 20  To = iTo;.      
23310 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 73  }..      rc = ls
23320 6d 42 6c 6f 63 6b 46 72 65 65 28 70 44 62 2c 20  mBlockFree(pDb, 
23330 69 46 72 6f 6d 29 3b 0a 0a 20 20 20 20 20 20 2a  iFrom);..      *
23340 70 6e 57 72 69 74 65 20 3d 20 6c 73 6d 46 73 42  pnWrite = lsmFsB
23350 6c 6f 63 6b 53 69 7a 65 28 70 44 62 2d 3e 70 46  lockSize(pDb->pF
23360 53 29 20 2f 20 6c 73 6d 46 73 50 61 67 65 53 69  S) / lsmFsPageSi
23370 7a 65 28 70 44 62 2d 3e 70 46 53 29 3b 0a 20 20  ze(pDb->pFS);.  
23380 20 20 20 20 70 4c 76 6c 2d 3e 6c 68 73 2e 70 52      pLvl->lhs.pR
23390 65 64 69 72 65 63 74 20 3d 20 26 70 2d 3e 72 65  edirect = &p->re
233a0 64 69 72 65 63 74 3b 0a 20 20 20 20 7d 0a 20 20  direct;.    }.  
233b0 7d 0a 0a 23 69 66 20 4c 53 4d 5f 4c 4f 47 5f 53  }..#if LSM_LOG_S
233c0 54 52 55 43 54 55 52 45 0a 20 20 69 66 28 20 72  TRUCTURE.  if( r
233d0 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20  c==LSM_OK ){.   
233e0 20 63 68 61 72 20 61 42 75 66 5b 36 34 5d 3b 0a   char aBuf[64];.
233f0 20 20 20 20 73 70 72 69 6e 74 66 28 61 42 75 66      sprintf(aBuf
23400 2c 20 22 6d 6f 76 65 2d 62 6c 6f 63 6b 20 25 64  , "move-block %d
23410 2f 25 64 22 2c 20 70 2d 3e 72 65 64 69 72 65 63  /%d", p->redirec
23420 74 2e 6e 2d 31 2c 20 4c 53 4d 5f 4d 41 58 5f 42  t.n-1, LSM_MAX_B
23430 4c 4f 43 4b 5f 52 45 44 49 52 45 43 54 53 29 3b  LOCK_REDIRECTS);
23440 0a 20 20 20 20 6c 73 6d 53 6f 72 74 65 64 44 75  .    lsmSortedDu
23450 6d 70 53 74 72 75 63 74 75 72 65 28 70 44 62 2c  mpStructure(pDb,
23460 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2c 20 4c   pDb->pWorker, L
23470 53 4d 5f 4c 4f 47 5f 44 41 54 41 2c 20 30 2c 20  SM_LOG_DATA, 0, 
23480 61 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  aBuf);.  }.#endi
23490 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
234a0 0a 0a 2f 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ../*.*/.static i
234b0 6e 74 20 6d 65 72 67 65 49 6e 73 65 72 74 46 72  nt mergeInsertFr
234c0 65 65 6c 69 73 74 53 65 67 6d 65 6e 74 73 28 0a  eelistSegments(.
234d0 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 0a    lsm_db *pDb, .
234e0 20 20 69 6e 74 20 6e 46 72 65 65 2c 0a 20 20 4d    int nFree,.  M
234f0 65 72 67 65 57 6f 72 6b 65 72 20 2a 70 4d 57 0a  ergeWorker *pMW.
23500 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53  ){.  int rc = LS
23510 4d 5f 4f 4b 3b 0a 20 20 69 66 28 20 6e 46 72 65  M_OK;.  if( nFre
23520 65 3e 30 20 29 7b 0a 20 20 20 20 4d 75 6c 74 69  e>0 ){.    Multi
23530 43 75 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 70  Cursor *pCsr = p
23540 4d 57 2d 3e 70 43 73 72 3b 0a 20 20 20 20 4c 65  MW->pCsr;.    Le
23550 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 70 4d 57 2d  vel *pLvl = pMW-
23560 3e 70 4c 65 76 65 6c 3b 0a 20 20 20 20 53 65 67  >pLevel;.    Seg
23570 6d 65 6e 74 50 74 72 20 2a 61 4e 65 77 31 3b 0a  mentPtr *aNew1;.
23580 20 20 20 20 53 65 67 6d 65 6e 74 20 2a 61 4e 65      Segment *aNe
23590 77 32 3b 0a 0a 20 20 20 20 4c 65 76 65 6c 20 2a  w2;..    Level *
235a0 70 49 74 65 72 3b 0a 20 20 20 20 4c 65 76 65 6c  pIter;.    Level
235b0 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74   *pNext;.    int
235c0 20 69 20 3d 20 30 3b 0a 0a 20 20 20 20 61 4e 65   i = 0;..    aNe
235d0 77 31 20 3d 20 28 53 65 67 6d 65 6e 74 50 74 72  w1 = (SegmentPtr
235e0 20 2a 29 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f   *)lsmMallocZero
235f0 52 63 28 0a 20 20 20 20 20 20 20 20 70 44 62 2d  Rc(.        pDb-
23600 3e 70 45 6e 76 2c 20 73 69 7a 65 6f 66 28 53 65  >pEnv, sizeof(Se
23610 67 6d 65 6e 74 50 74 72 29 20 2a 20 28 70 43 73  gmentPtr) * (pCs
23620 72 2d 3e 6e 50 74 72 2b 6e 46 72 65 65 29 2c 20  r->nPtr+nFree), 
23630 26 72 63 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  &rc.    );.    i
23640 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
23650 63 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  c;.    memcpy(&a
23660 4e 65 77 31 5b 6e 46 72 65 65 5d 2c 20 70 43 73  New1[nFree], pCs
23670 72 2d 3e 61 50 74 72 2c 20 73 69 7a 65 6f 66 28  r->aPtr, sizeof(
23680 53 65 67 6d 65 6e 74 50 74 72 29 2a 70 43 73 72  SegmentPtr)*pCsr
23690 2d 3e 6e 50 74 72 29 3b 0a 20 20 20 20 70 43 73  ->nPtr);.    pCs
236a0 72 2d 3e 6e 50 74 72 20 2b 3d 20 6e 46 72 65 65  r->nPtr += nFree
236b0 3b 0a 20 20 20 20 6c 73 6d 46 72 65 65 28 70 44  ;.    lsmFree(pD
236c0 62 2d 3e 70 45 6e 76 2c 20 70 43 73 72 2d 3e 61  b->pEnv, pCsr->a
236d0 54 72 65 65 29 3b 0a 20 20 20 20 6c 73 6d 46 72  Tree);.    lsmFr
236e0 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70 43  ee(pDb->pEnv, pC
236f0 73 72 2d 3e 61 50 74 72 29 3b 0a 20 20 20 20 70  sr->aPtr);.    p
23700 43 73 72 2d 3e 61 54 72 65 65 20 3d 20 30 3b 0a  Csr->aTree = 0;.
23710 20 20 20 20 70 43 73 72 2d 3e 61 50 74 72 20 3d      pCsr->aPtr =
23720 20 61 4e 65 77 31 3b 0a 0a 20 20 20 20 61 4e 65   aNew1;..    aNe
23730 77 32 20 3d 20 28 53 65 67 6d 65 6e 74 20 2a 29  w2 = (Segment *)
23740 6c 73 6d 4d 61 6c 6c 6f 63 5a 65 72 6f 52 63 28  lsmMallocZeroRc(
23750 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 45  .        pDb->pE
23760 6e 76 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d 65  nv, sizeof(Segme
23770 6e 74 29 20 2a 20 28 70 4c 76 6c 2d 3e 6e 52 69  nt) * (pLvl->nRi
23780 67 68 74 2b 6e 46 72 65 65 29 2c 20 26 72 63 0a  ght+nFree), &rc.
23790 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
237a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
237b0 20 20 20 6d 65 6d 63 70 79 28 26 61 4e 65 77 32     memcpy(&aNew2
237c0 5b 6e 46 72 65 65 5d 2c 20 70 4c 76 6c 2d 3e 61  [nFree], pLvl->a
237d0 52 68 73 2c 20 73 69 7a 65 6f 66 28 53 65 67 6d  Rhs, sizeof(Segm
237e0 65 6e 74 29 2a 70 4c 76 6c 2d 3e 6e 52 69 67 68  ent)*pLvl->nRigh
237f0 74 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 52  t);.    pLvl->nR
23800 69 67 68 74 20 2b 3d 20 6e 46 72 65 65 3b 0a 20  ight += nFree;. 
23810 20 20 20 6c 73 6d 46 72 65 65 28 70 44 62 2d 3e     lsmFree(pDb->
23820 70 45 6e 76 2c 20 70 4c 76 6c 2d 3e 61 52 68 73  pEnv, pLvl->aRhs
23830 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61 52 68  );.    pLvl->aRh
23840 73 20 3d 20 61 4e 65 77 32 3b 0a 0a 20 20 20 20  s = aNew2;..    
23850 66 6f 72 28 70 49 74 65 72 3d 70 44 62 2d 3e 70  for(pIter=pDb->p
23860 57 6f 72 6b 65 72 2d 3e 70 4c 65 76 65 6c 3b 20  Worker->pLevel; 
23870 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 70 49  rc==LSM_OK && pI
23880 74 65 72 21 3d 70 4c 76 6c 3b 20 70 49 74 65 72  ter!=pLvl; pIter
23890 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 53  =pNext){.      S
238a0 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
238b0 70 4c 76 6c 2d 3e 61 52 68 73 5b 69 5d 3b 0a 20  pLvl->aRhs[i];. 
238c0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 53 65 67       memcpy(pSeg
238d0 2c 20 26 70 49 74 65 72 2d 3e 6c 68 73 2c 20 73  , &pIter->lhs, s
238e0 69 7a 65 6f 66 28 53 65 67 6d 65 6e 74 29 29 3b  izeof(Segment));
238f0 0a 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 61 50  ..      pCsr->aP
23900 74 72 5b 69 5d 2e 70 53 65 67 20 3d 20 70 53 65  tr[i].pSeg = pSe
23910 67 3b 0a 20 20 20 20 20 20 70 43 73 72 2d 3e 61  g;.      pCsr->a
23920 50 74 72 5b 69 5d 2e 70 4c 65 76 65 6c 20 3d 20  Ptr[i].pLevel = 
23930 70 4c 76 6c 3b 0a 20 20 20 20 20 20 72 63 20 3d  pLvl;.      rc =
23940 20 73 65 67 6d 65 6e 74 50 74 72 45 6e 64 28 70   segmentPtrEnd(p
23950 43 73 72 2c 20 26 70 43 73 72 2d 3e 61 50 74 72  Csr, &pCsr->aPtr
23960 5b 69 5d 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20  [i], 0);..      
23970 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2d 3e 70 4c  pDb->pWorker->pL
23980 65 76 65 6c 20 3d 20 70 4e 65 78 74 20 3d 20 70  evel = pNext = p
23990 49 74 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Iter->pNext;.   
239a0 20 20 20 73 6f 72 74 65 64 46 72 65 65 4c 65 76     sortedFreeLev
239b0 65 6c 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70 49  el(pDb->pEnv, pI
239c0 74 65 72 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b  ter);.      i++;
239d0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
239e0 74 28 20 69 3d 3d 6e 46 72 65 65 20 29 3b 0a 20  t( i==nFree );. 
239f0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 4c     assert( rc!=L
23a00 53 4d 5f 4f 4b 20 7c 7c 20 70 44 62 2d 3e 70 57  SM_OK || pDb->pW
23a10 6f 72 6b 65 72 2d 3e 70 4c 65 76 65 6c 3d 3d 70  orker->pLevel==p
23a20 4c 76 6c 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  Lvl );..    for(
23a30 69 3d 6e 46 72 65 65 3b 20 69 3c 70 43 73 72 2d  i=nFree; i<pCsr-
23a40 3e 6e 50 74 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nPtr; i++){.   
23a50 20 20 20 70 43 73 72 2d 3e 61 50 74 72 5b 69 5d     pCsr->aPtr[i]
23a60 2e 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61  .pSeg = &pLvl->a
23a70 52 68 73 5b 69 5d 3b 0a 20 20 20 20 7d 0a 0a 20  Rhs[i];.    }.. 
23a80 20 20 20 6c 73 6d 46 72 65 65 28 70 44 62 2d 3e     lsmFree(pDb->
23a90 70 45 6e 76 2c 20 70 4d 57 2d 3e 61 47 6f 62 62  pEnv, pMW->aGobb
23aa0 6c 65 29 3b 0a 20 20 20 20 70 4d 57 2d 3e 61 47  le);.    pMW->aG
23ab0 6f 62 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  obble = 0;.  }. 
23ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
23ad0 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74 65 64  tatic int sorted
23ae0 57 6f 72 6b 28 0a 20 20 6c 73 6d 5f 64 62 20 2a  Work(.  lsm_db *
23af0 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
23b00 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
23b10 61 73 65 20 68 61 6e 64 6c 65 2e 20 4d 75 73 74  ase handle. Must
23b20 20 62 65 20 77 6f 72 6b 65 72 2e 20 2a 2f 0a 20   be worker. */. 
23b30 20 69 6e 74 20 6e 57 6f 72 6b 2c 20 20 20 20 20   int nWork,     
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
23b60 67 65 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64  ges of work to d
23b70 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 72 67  o */.  int nMerg
23b80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23b90 20 20 20 20 20 20 20 2f 2a 20 54 72 79 20 74 6f         /* Try to
23ba0 20 6d 65 72 67 65 20 74 68 69 73 20 6d 61 6e 79   merge this many
23bb0 20 6c 65 76 65 6c 73 20 61 74 20 6f 6e 63 65 20   levels at once 
23bc0 2a 2f 0a 20 20 69 6e 74 20 62 46 6c 75 73 68 2c  */.  int bFlush,
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23be0 20 20 20 20 20 2f 2a 20 53 65 74 20 69 66 20 63       /* Set if c
23bf0 61 6c 6c 20 69 73 20 74 6f 20 6d 61 6b 65 20 72  all is to make r
23c00 6f 6f 6d 20 66 6f 72 20 61 20 66 6c 75 73 68 20  oom for a flush 
23c10 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 57 72 69 74  */.  int *pnWrit
23c20 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
23c30 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 74       /* OUT: Act
23c40 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ual number of pa
23c50 67 65 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29  ges written */.)
23c60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c 53 4d  {.  int rc = LSM
23c70 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
23c80 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
23c90 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d  de */.  int nRem
23ca0 61 69 6e 69 6e 67 20 3d 20 6e 57 6f 72 6b 3b 20  aining = nWork; 
23cb0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 74 73          /* Units
23cc0 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 62   of work to do b
23cd0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
23ce0 2a 2f 0a 20 20 53 6e 61 70 73 68 6f 74 20 2a 70  */.  Snapshot *p
23cf0 57 6f 72 6b 65 72 20 3d 20 70 44 62 2d 3e 70 57  Worker = pDb->pW
23d00 6f 72 6b 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  orker;..  assert
23d10 28 20 70 57 6f 72 6b 65 72 20 29 3b 0a 20 20 69  ( pWorker );.  i
23d20 66 28 20 6c 73 6d 44 62 53 6e 61 70 73 68 6f 74  f( lsmDbSnapshot
23d30 4c 65 76 65 6c 28 70 57 6f 72 6b 65 72 29 3d 3d  Level(pWorker)==
23d40 30 20 29 20 72 65 74 75 72 6e 20 4c 53 4d 5f 4f  0 ) return LSM_O
23d50 4b 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 52 65  K;..  while( nRe
23d60 6d 61 69 6e 69 6e 67 3e 30 20 29 7b 0a 20 20 20  maining>0 ){.   
23d70 20 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d   Level *pLevel =
23d80 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64   0;..    /* Find
23d90 20 61 20 6c 65 76 65 6c 20 74 6f 20 77 6f 72 6b   a level to work
23da0 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d   on. */.    rc =
23db0 20 73 6f 72 74 65 64 53 65 6c 65 63 74 4c 65 76   sortedSelectLev
23dc0 65 6c 28 70 44 62 2c 20 6e 4d 65 72 67 65 2c 20  el(pDb, nMerge, 
23dd0 26 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 61 73  &pLevel);.    as
23de0 73 65 72 74 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  sert( rc==LSM_OK
23df0 20 7c 7c 20 70 4c 65 76 65 6c 3d 3d 30 20 29 3b   || pLevel==0 );
23e00 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ..    if( pLevel
23e10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
23e20 20 6e 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20   nDone = 0;.    
23e30 20 20 4c 65 76 65 6c 20 2a 70 54 6f 70 4c 65 76    Level *pTopLev
23e40 65 6c 20 3d 20 6c 73 6d 44 62 53 6e 61 70 73 68  el = lsmDbSnapsh
23e50 6f 74 4c 65 76 65 6c 28 70 44 62 2d 3e 70 57 6f  otLevel(pDb->pWo
23e60 72 6b 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rker);.      if(
23e70 20 62 46 6c 75 73 68 3d 3d 30 20 26 26 20 6e 4d   bFlush==0 && nM
23e80 65 72 67 65 3d 3d 31 20 26 26 20 70 54 6f 70 4c  erge==1 && pTopL
23e90 65 76 65 6c 20 26 26 20 70 54 6f 70 4c 65 76 65  evel && pTopLeve
23ea0 6c 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20  l->pNext==0 ){. 
23eb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 6f 72 74         rc = sort
23ec0 65 64 4d 6f 76 65 42 6c 6f 63 6b 28 70 44 62 2c  edMoveBlock(pDb,
23ed0 20 26 6e 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20   &nDone);.      
23ee0 7d 0a 20 20 20 20 20 20 6e 52 65 6d 61 69 6e 69  }.      nRemaini
23ef0 6e 67 20 2d 3d 20 6e 44 6f 6e 65 3b 0a 0a 20 20  ng -= nDone;..  
23f00 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20 6e 6f 74      /* Could not
23f10 20 66 69 6e 64 20 61 6e 79 20 77 6f 72 6b 20 74   find any work t
23f20 6f 20 64 6f 2e 20 46 69 6e 69 73 68 65 64 2e 20  o do. Finished. 
23f30 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 44 6f  */.      if( nDo
23f40 6e 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ne==0 ) break;. 
23f50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23f60 69 6e 74 20 62 53 61 76 65 20 3d 20 30 3b 0a 20  int bSave = 0;. 
23f70 20 20 20 20 20 46 72 65 65 6c 69 73 74 20 66 72       Freelist fr
23f80 65 65 6c 69 73 74 20 3d 20 7b 30 2c 20 30 2c 20  eelist = {0, 0, 
23f90 30 7d 3b 0a 20 20 20 20 20 20 4d 65 72 67 65 57  0};.      MergeW
23fa0 6f 72 6b 65 72 20 6d 65 72 67 65 77 6f 72 6b 65  orker mergeworke
23fb0 72 3b 20 20 20 20 2f 2a 20 53 74 61 74 65 20 75  r;    /* State u
23fc0 73 65 64 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 74  sed to work on t
23fd0 68 65 20 6c 65 76 65 6c 20 6d 65 72 67 65 20 2a  he level merge *
23fe0 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
23ff0 20 70 44 62 2d 3e 62 49 6e 63 72 4d 65 72 67 65   pDb->bIncrMerge
24000 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
24010 65 72 74 28 20 70 44 62 2d 3e 70 46 72 65 65 6c  ert( pDb->pFreel
24020 69 73 74 3d 3d 30 20 26 26 20 70 44 62 2d 3e 62  ist==0 && pDb->b
24030 55 73 65 46 72 65 65 6c 69 73 74 3d 3d 30 20 29  UseFreelist==0 )
24040 3b 0a 0a 20 20 20 20 20 20 70 44 62 2d 3e 62 49  ;..      pDb->bI
24050 6e 63 72 4d 65 72 67 65 20 3d 20 31 3b 0a 20 20  ncrMerge = 1;.  
24060 20 20 20 20 72 63 20 3d 20 6d 65 72 67 65 57 6f      rc = mergeWo
24070 72 6b 65 72 49 6e 69 74 28 70 44 62 2c 20 70 4c  rkerInit(pDb, pL
24080 65 76 65 6c 2c 20 26 6d 65 72 67 65 77 6f 72 6b  evel, &mergework
24090 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
240a0 74 28 20 6d 65 72 67 65 77 6f 72 6b 65 72 2e 6e  t( mergeworker.n
240b0 57 6f 72 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Work==0 );.     
240c0 20 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 72   .      while( r
240d0 63 3d 3d 4c 53 4d 5f 4f 4b 20 0a 20 20 20 20 20  c==LSM_OK .     
240e0 20 20 20 20 20 26 26 20 30 3d 3d 6d 65 72 67 65       && 0==merge
240f0 57 6f 72 6b 65 72 44 6f 6e 65 28 26 6d 65 72 67  WorkerDone(&merg
24100 65 77 6f 72 6b 65 72 29 20 0a 20 20 20 20 20 20  eworker) .      
24110 20 20 20 20 26 26 20 28 6d 65 72 67 65 77 6f 72      && (mergewor
24120 6b 65 72 2e 6e 57 6f 72 6b 3c 6e 52 65 6d 61 69  ker.nWork<nRemai
24130 6e 69 6e 67 20 7c 7c 20 70 44 62 2d 3e 62 55 73  ning || pDb->bUs
24140 65 46 72 65 65 6c 69 73 74 29 0a 20 20 20 20 20  eFreelist).     
24150 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
24160 65 54 79 70 65 20 3d 20 72 74 54 6f 70 69 63 28  eType = rtTopic(
24170 6d 65 72 67 65 77 6f 72 6b 65 72 2e 70 43 73 72  mergeworker.pCsr
24180 2d 3e 65 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ->eType);.      
24190 20 20 72 63 20 3d 20 6d 65 72 67 65 57 6f 72 6b    rc = mergeWork
241a0 65 72 53 74 65 70 28 26 6d 65 72 67 65 77 6f 72  erStep(&mergewor
241b0 6b 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ker);..        /
241c0 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
241d0 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
241e0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 70 61  e first entry pa
241f0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
24200 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65  e.        ** use
24210 72 20 64 61 74 61 20 28 69 2e 65 2e 20 65 69 74  r data (i.e. eit
24220 68 65 72 20 74 6f 20 45 4f 46 20 6f 72 20 74 6f  her to EOF or to
24230 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 2d   the first free-
24240 6c 69 73 74 20 65 6e 74 72 79 0a 20 20 20 20 20  list entry.     
24250 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20     ** that will 
24260 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
24270 72 75 6e 29 2c 20 74 68 65 6e 20 63 68 65 63 6b  run), then check
24280 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
24290 6c 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  le to.        **
242a0 20 6d 65 72 67 65 20 69 6e 20 61 6e 79 20 66 72   merge in any fr
242b0 65 65 2d 6c 69 73 74 20 65 6e 74 72 69 65 73 20  ee-list entries 
242c0 74 68 61 74 20 61 72 65 20 65 69 74 68 65 72 20  that are either 
242d0 69 6e 2d 6d 65 6d 6f 72 79 20 6f 72 20 69 6e 0a  in-memory or in.
242e0 20 20 20 20 20 20 20 20 2a 2a 20 66 72 65 65 2d          ** free-
242f0 6c 69 73 74 2d 6f 6e 6c 79 20 62 6c 6f 63 6b 73  list-only blocks
24300 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  .  */.        if
24310 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20  ( rc==LSM_OK && 
24320 6e 4d 65 72 67 65 3d 3d 31 20 26 26 20 65 54 79  nMerge==1 && eTy
24330 70 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  pe==0.         &
24340 26 20 28 72 74 54 6f 70 69 63 28 6d 65 72 67 65  & (rtTopic(merge
24350 77 6f 72 6b 65 72 2e 70 43 73 72 2d 3e 65 54 79  worker.pCsr->eTy
24360 70 65 29 20 7c 7c 20 6d 65 72 67 65 57 6f 72 6b  pe) || mergeWork
24370 65 72 44 6f 6e 65 28 26 6d 65 72 67 65 77 6f 72  erDone(&mergewor
24380 6b 65 72 29 29 0a 20 20 20 20 20 20 20 20 29 7b  ker)).        ){
24390 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
243a0 46 72 65 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Free = 0;       
243b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
243c0 66 72 65 65 2d 6c 69 73 74 2d 6f 6e 6c 79 20 6c  free-list-only l
243d0 65 76 65 6c 73 20 74 6f 20 6d 65 72 67 65 20 2a  evels to merge *
243e0 2f 0a 20 20 20 20 20 20 20 20 20 20 4c 65 76 65  /.          Leve
243f0 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 20 20 20  l *pLvl;.       
24400 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e     assert( pDb->
24410 70 46 72 65 65 6c 69 73 74 3d 3d 30 20 26 26 20  pFreelist==0 && 
24420 70 44 62 2d 3e 62 55 73 65 46 72 65 65 6c 69 73  pDb->bUseFreelis
24430 74 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 20  t==0 );..       
24440 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20     /* Now check 
24450 69 66 20 61 6c 6c 20 6c 65 76 65 6c 73 20 63 6f  if all levels co
24460 6e 74 61 69 6e 69 6e 67 20 64 61 74 61 20 6e 65  ntaining data ne
24470 77 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  wer than this on
24480 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  e.          ** a
24490 72 65 20 73 69 6e 67 6c 65 2d 73 65 67 6d 65 6e  re single-segmen
244a0 74 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 6c 79  t free-list only
244b0 20 6c 65 76 65 6c 73 2e 20 49 66 20 73 6f 2c 20   levels. If so, 
244c0 74 68 65 79 20 77 69 6c 6c 20 62 65 0a 20 20 20  they will be.   
244d0 20 20 20 20 20 20 20 2a 2a 20 6d 65 72 67 65 64         ** merged
244e0 20 69 6e 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20 20   in now.  */.   
244f0 20 20 20 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d         for(pLvl=
24500 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2d 3e 70 4c  pDb->pWorker->pL
24510 65 76 65 6c 3b 20 0a 20 20 20 20 20 20 20 20 20  evel; .         
24520 20 20 20 20 20 70 4c 76 6c 21 3d 6d 65 72 67 65       pLvl!=merge
24530 77 6f 72 6b 65 72 2e 70 4c 65 76 65 6c 20 26 26  worker.pLevel &&
24540 20 28 70 4c 76 6c 2d 3e 66 6c 61 67 73 20 26 20   (pLvl->flags & 
24550 4c 45 56 45 4c 5f 46 52 45 45 4c 49 53 54 5f 4f  LEVEL_FREELIST_O
24560 4e 4c 59 29 3b 20 0a 20 20 20 20 20 20 20 20 20  NLY); .         
24570 20 20 20 20 20 70 4c 76 6c 3d 70 4c 76 6c 2d 3e       pLvl=pLvl->
24580 70 4e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20  pNext.          
24590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
245a0 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 52 69  ssert( pLvl->nRi
245b0 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
245c0 20 20 20 20 20 20 6e 46 72 65 65 2b 2b 3b 0a 20        nFree++;. 
245d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
245e0 20 20 20 20 20 69 66 28 20 70 4c 76 6c 3d 3d 6d       if( pLvl==m
245f0 65 72 67 65 77 6f 72 6b 65 72 2e 70 4c 65 76 65  ergeworker.pLeve
24600 6c 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 20 20  l ){..          
24610 20 20 72 63 20 3d 20 6d 65 72 67 65 49 6e 73 65    rc = mergeInse
24620 72 74 46 72 65 65 6c 69 73 74 53 65 67 6d 65 6e  rtFreelistSegmen
24630 74 73 28 70 44 62 2c 20 6e 46 72 65 65 2c 20 26  ts(pDb, nFree, &
24640 6d 65 72 67 65 77 6f 72 6b 65 72 29 3b 0a 20 20  mergeworker);.  
24650 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
24660 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
24670 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
24680 75 6c 74 69 43 75 72 73 6f 72 56 69 73 69 74 46  ultiCursorVisitF
24690 72 65 65 6c 69 73 74 28 6d 65 72 67 65 77 6f 72  reelist(mergewor
246a0 6b 65 72 2e 70 43 73 72 29 3b 0a 20 20 20 20 20  ker.pCsr);.     
246b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
246c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d       if( rc==LSM
246d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
246e0 20 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 43       rc = multiC
246f0 75 72 73 6f 72 53 65 74 75 70 54 72 65 65 28 6d  ursorSetupTree(m
24700 65 72 67 65 77 6f 72 6b 65 72 2e 70 43 73 72 2c  ergeworker.pCsr,
24710 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
24720 20 20 20 70 44 62 2d 3e 70 46 72 65 65 6c 69 73     pDb->pFreelis
24730 74 20 3d 20 26 66 72 65 65 6c 69 73 74 3b 0a 20  t = &freelist;. 
24740 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62               pDb
24750 2d 3e 62 55 73 65 46 72 65 65 6c 69 73 74 20 3d  ->bUseFreelist =
24760 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
24770 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
24780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
24790 20 20 20 20 20 20 6e 52 65 6d 61 69 6e 69 6e 67        nRemaining
247a0 20 2d 3d 20 4c 53 4d 5f 4d 41 58 28 6d 65 72 67   -= LSM_MAX(merg
247b0 65 77 6f 72 6b 65 72 2e 6e 57 6f 72 6b 2c 20 31  eworker.nWork, 1
247c0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63  );..      if( rc
247d0 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
247e0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
247f0 74 68 65 20 6d 65 72 67 65 20 6f 70 65 72 61 74  the merge operat
24800 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ion is completel
24810 79 20 66 69 6e 69 73 68 65 64 2e 20 49 66 20 6e  y finished. If n
24820 6f 74 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 67  ot,.        ** g
24830 6f 62 62 6c 65 20 75 70 20 28 64 65 63 6c 61 72  obble up (declar
24840 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 72  e eligible for r
24850 65 63 79 63 6c 69 6e 67 29 20 61 6e 79 20 70 61  ecycling) any pa
24860 67 65 73 20 66 72 6f 6d 20 72 68 73 0a 20 20 20  ges from rhs.   
24870 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 73       ** segments
24880 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 63   for which the c
24890 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
248a0 63 6f 6d 70 6c 65 74 65 6c 79 20 6d 65 72 67 65  completely merge
248b0 64 20 69 6e 74 6f 20 0a 20 20 20 20 20 20 20 20  d into .        
248c0 2a 2a 20 74 68 65 20 6c 68 73 20 6f 66 20 74 68  ** the lhs of th
248d0 65 20 6c 65 76 65 6c 2e 20 20 2a 2f 0a 20 20 20  e level.  */.   
248e0 20 20 20 20 20 69 66 28 20 6d 65 72 67 65 57 6f       if( mergeWo
248f0 72 6b 65 72 44 6f 6e 65 28 26 6d 65 72 67 65 77  rkerDone(&mergew
24900 6f 72 6b 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  orker)==0 ){.   
24910 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
24920 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
24930 20 69 3c 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68   i<pLevel->nRigh
24940 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; i++){.       
24950 20 20 20 20 20 53 65 67 6d 65 6e 74 50 74 72 20       SegmentPtr 
24960 2a 70 47 6f 62 62 6c 65 20 3d 20 26 6d 65 72 67  *pGobble = &merg
24970 65 77 6f 72 6b 65 72 2e 70 43 73 72 2d 3e 61 50  eworker.pCsr->aP
24980 74 72 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  tr[i];.         
24990 20 20 20 69 66 28 20 70 47 6f 62 62 6c 65 2d 3e     if( pGobble->
249a0 70 53 65 67 2d 3e 69 52 6f 6f 74 20 29 7b 0a 20  pSeg->iRoot ){. 
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
249c0 3d 20 73 6f 72 74 65 64 42 74 72 65 65 47 6f 62  = sortedBtreeGob
249d0 62 6c 65 28 70 44 62 2c 20 6d 65 72 67 65 77 6f  ble(pDb, mergewo
249e0 72 6b 65 72 2e 70 43 73 72 2c 20 69 29 3b 0a 20  rker.pCsr, i);. 
249f0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
24a00 20 69 66 28 20 6d 65 72 67 65 77 6f 72 6b 65 72   if( mergeworker
24a10 2e 61 47 6f 62 62 6c 65 5b 69 5d 20 29 7b 0a 20  .aGobble[i] ){. 
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 73 6d               lsm
24a30 46 73 47 6f 62 62 6c 65 28 70 44 62 2c 20 70 47  FsGobble(pDb, pG
24a40 6f 62 62 6c 65 2d 3e 70 53 65 67 2c 20 26 6d 65  obble->pSeg, &me
24a50 72 67 65 77 6f 72 6b 65 72 2e 61 47 6f 62 62 6c  rgeworker.aGobbl
24a60 65 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20  e[i], 1);.      
24a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24a80 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
24a90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
24aa0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   i;.          in
24ab0 74 20 62 45 6d 70 74 79 3b 0a 20 20 20 20 20 20  t bEmpty;.      
24ac0 20 20 20 20 6d 65 72 67 65 57 6f 72 6b 65 72 53      mergeWorkerS
24ad0 68 75 74 64 6f 77 6e 28 26 6d 65 72 67 65 77 6f  hutdown(&mergewo
24ae0 72 6b 65 72 2c 20 26 72 63 29 3b 0a 20 20 20 20  rker, &rc);.    
24af0 20 20 20 20 20 20 62 45 6d 70 74 79 20 3d 20 28        bEmpty = (
24b00 70 4c 65 76 65 6c 2d 3e 6c 68 73 2e 69 46 69 72  pLevel->lhs.iFir
24b10 73 74 3d 3d 30 29 3b 0a 0a 20 20 20 20 20 20 20  st==0);..       
24b20 20 20 20 69 66 28 20 62 45 6d 70 74 79 3d 3d 30     if( bEmpty==0
24b30 20 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29   && rc==LSM_OK )
24b40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
24b50 20 3d 20 6c 73 6d 46 73 53 6f 72 74 65 64 46 69   = lsmFsSortedFi
24b60 6e 69 73 68 28 70 44 62 2d 3e 70 46 53 2c 20 26  nish(pDb->pFS, &
24b70 70 4c 65 76 65 6c 2d 3e 6c 68 73 29 3b 0a 20 20  pLevel->lhs);.  
24b80 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
24b90 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62 55       if( pDb->bU
24ba0 73 65 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20  seFreelist ){.  
24bb0 20 20 20 20 20 20 20 20 20 20 46 72 65 65 6c 69            Freeli
24bc0 73 74 20 2a 70 20 3d 20 26 70 44 62 2d 3e 70 57  st *p = &pDb->pW
24bd0 6f 72 6b 65 72 2d 3e 66 72 65 65 6c 69 73 74 3b  orker->freelist;
24be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 73 6d  .            lsm
24bf0 46 72 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20  Free(pDb->pEnv, 
24c00 70 2d 3e 61 45 6e 74 72 79 29 3b 0a 20 20 20 20  p->aEntry);.    
24c10 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
24c20 2c 20 26 66 72 65 65 6c 69 73 74 2c 20 73 69 7a  , &freelist, siz
24c30 65 6f 66 28 66 72 65 65 6c 69 73 74 29 29 3b 0a  eof(freelist));.
24c40 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d              pDb-
24c50 3e 62 55 73 65 46 72 65 65 6c 69 73 74 20 3d 20  >bUseFreelist = 
24c60 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  0;.            p
24c70 44 62 2d 3e 70 46 72 65 65 6c 69 73 74 20 3d 20  Db->pFreelist = 
24c80 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  0;.            b
24c90 53 61 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Save = 1;.      
24ca0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
24cb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 65 76   for(i=0; i<pLev
24cc0 65 6c 2d 3e 6e 52 69 67 68 74 3b 20 69 2b 2b 29  el->nRight; i++)
24cd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 73  {.            ls
24ce0 6d 46 73 53 6f 72 74 65 64 44 65 6c 65 74 65 28  mFsSortedDelete(
24cf0 70 44 62 2d 3e 70 46 53 2c 20 70 57 6f 72 6b 65  pDb->pFS, pWorke
24d00 72 2c 20 31 2c 20 26 70 4c 65 76 65 6c 2d 3e 61  r, 1, &pLevel->a
24d10 52 68 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Rhs[i]);.       
24d20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
24d30 69 66 28 20 62 45 6d 70 74 79 20 29 7b 0a 20 20  if( bEmpty ){.  
24d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
24d50 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 20 69 73  the new level is
24d60 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
24d70 79 2c 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  y, remove it fro
24d80 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
24d90 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73     ** database s
24da0 6e 61 70 73 68 6f 74 2e 20 54 68 69 73 20 63 61  napshot. This ca
24db0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
24dc0 20 61 6c 6c 20 69 6e 70 75 74 20 6b 65 79 73 20   all input keys 
24dd0 77 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  were.           
24de0 20 2a 2a 20 61 6e 6e 69 68 69 6c 61 74 65 64 2e   ** annihilated.
24df0 20 53 69 6e 63 65 20 6b 65 79 73 20 61 72 65 20   Since keys are 
24e00 6f 6e 6c 79 20 61 6e 6e 69 68 69 6c 61 74 65 64  only annihilated
24e10 20 69 66 20 74 68 65 20 6e 65 77 20 6c 65 76 65   if the new leve
24e20 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  l.            **
24e30 20 69 73 20 74 68 65 20 6c 61 73 74 20 69 6e 20   is the last in 
24e40 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
24e50 28 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6d 6f  (contains the mo
24e60 73 74 20 61 6e 63 69 65 6e 74 20 6f 66 0a 20 20  st ancient of.  
24e70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74            ** dat
24e80 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 29 2c 20  abase content), 
24e90 74 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  this guarantees 
24ea0 74 68 61 74 20 70 4c 65 76 65 6c 2d 3e 70 4e 65  that pLevel->pNe
24eb0 78 74 3d 3d 30 2e 20 20 2a 2f 20 0a 20 20 20 20  xt==0.  */ .    
24ec0 20 20 20 20 20 20 20 20 4c 65 76 65 6c 20 2a 70          Level *p
24ed0 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Top;          /*
24ee0 20 54 6f 70 20 6c 65 76 65 6c 20 6f 66 20 77 6f   Top level of wo
24ef0 72 6b 65 72 20 73 6e 61 70 73 68 6f 74 20 2a 2f  rker snapshot */
24f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 4c 65 76  .            Lev
24f10 65 6c 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20  el **pp;        
24f20 20 20 20 2f 2a 20 52 65 61 64 2f 77 72 69 74 65     /* Read/write
24f30 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 4c 65   iterator for Le
24f40 76 65 6c 2e 70 4e 65 78 74 20 6c 69 73 74 20 2a  vel.pNext list *
24f50 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  /..            a
24f60 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70  ssert( pLevel->p
24f70 4e 65 78 74 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  Next==0 );..    
24f80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
24f90 65 20 74 68 65 20 6c 65 76 65 6c 20 66 72 6f 6d  e the level from
24fa0 20 74 68 65 20 77 6f 72 6b 65 72 20 73 6e 61 70   the worker snap
24fb0 73 68 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  shot. */.       
24fc0 20 20 20 20 20 70 54 6f 70 20 3d 20 6c 73 6d 44       pTop = lsmD
24fd0 62 53 6e 61 70 73 68 6f 74 4c 65 76 65 6c 28 70  bSnapshotLevel(p
24fe0 57 6f 72 6b 65 72 29 3b 0a 20 20 20 20 20 20 20  Worker);.       
24ff0 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 54 6f       for(pp=&pTo
25000 70 3b 20 2a 70 70 21 3d 70 4c 65 76 65 6c 3b 20  p; *pp!=pLevel; 
25010 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78  pp=&((*pp)->pNex
25020 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t));.           
25030 20 2a 70 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70   *pp = pLevel->p
25040 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
25050 20 20 6c 73 6d 44 62 53 6e 61 70 73 68 6f 74 53    lsmDbSnapshotS
25060 65 74 4c 65 76 65 6c 28 70 57 6f 72 6b 65 72 2c  etLevel(pWorker,
25070 20 70 54 6f 70 29 3b 0a 0a 20 20 20 20 20 20 20   pTop);..       
25080 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65       /* Free the
25090 20 4c 65 76 65 6c 20 73 74 72 75 63 74 75 72 65   Level structure
250a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
250b0 20 73 6f 72 74 65 64 46 72 65 65 4c 65 76 65 6c   sortedFreeLevel
250c0 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70 4c 65 76  (pDb->pEnv, pLev
250d0 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  el);.          }
250e0 65 6c 73 65 7b 0a 0a 20 20 20 20 20 20 20 20 20  else{..         
250f0 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 73     /* Free the s
25100 65 70 61 72 61 74 6f 72 73 20 6f 66 20 74 68 65  eparators of the
25110 20 6e 65 78 74 20 6c 65 76 65 6c 2c 20 69 66 20   next level, if 
25120 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
25130 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65           if( pLe
25140 76 65 6c 2d 3e 70 4d 65 72 67 65 2d 3e 6e 49 6e  vel->pMerge->nIn
25150 70 75 74 20 3e 20 70 4c 65 76 65 6c 2d 3e 6e 52  put > pLevel->nR
25160 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
25170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
25180 65 76 65 6c 2d 3e 70 4e 65 78 74 2d 3e 6c 68 73  evel->pNext->lhs
25190 2e 69 52 6f 6f 74 20 29 3b 0a 20 20 20 20 20 20  .iRoot );.      
251a0 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
251b0 70 4e 65 78 74 2d 3e 6c 68 73 2e 69 52 6f 6f 74  pNext->lhs.iRoot
251c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
251d0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
251e0 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 72 69 67   /* Zero the rig
251f0 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20  ht-hand-side of 
25200 70 4c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 20 20  pLevel */.      
25210 20 20 20 20 20 20 6c 73 6d 46 72 65 65 28 70 44        lsmFree(pD
25220 62 2d 3e 70 45 6e 76 2c 20 70 4c 65 76 65 6c 2d  b->pEnv, pLevel-
25230 3e 61 52 68 73 29 3b 0a 20 20 20 20 20 20 20 20  >aRhs);.        
25240 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 52 69 67      pLevel->nRig
25250 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ht = 0;.        
25260 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 52 68 73      pLevel->aRhs
25270 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 0;..         
25280 20 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 4d     /* Free the M
25290 65 72 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  erge object */. 
252a0 20 20 20 20 20 20 20 20 20 20 20 6c 73 6d 46 72             lsmFr
252b0 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20 70 4c  ee(pDb->pEnv, pL
252c0 65 76 65 6c 2d 3e 70 4d 65 72 67 65 29 3b 0a 20  evel->pMerge);. 
252d0 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65             pLeve
252e0 6c 2d 3e 70 4d 65 72 67 65 20 3d 20 30 3b 0a 20  l->pMerge = 0;. 
252f0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
25300 20 20 20 20 20 20 69 66 28 20 62 53 61 76 65 20        if( bSave 
25310 26 26 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  && rc==LSM_OK ){
25320 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62  .            pDb
25330 2d 3e 62 49 6e 63 72 4d 65 72 67 65 20 3d 20 30  ->bIncrMerge = 0
25340 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
25350 20 3d 20 6c 73 6d 53 61 76 65 57 6f 72 6b 65 72   = lsmSaveWorker
25360 28 70 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pDb, 0);.      
25370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
25380 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
25390 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 4d  * Clean up the M
253a0 65 72 67 65 57 6f 72 6b 65 72 20 6f 62 6a 65 63  ergeWorker objec
253b0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 62  t initialized ab
253c0 6f 76 65 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  ove. If no error
253d0 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6f 63  .      ** has oc
253e0 63 75 72 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74  curred, invoke t
253f0 68 65 20 77 6f 72 6b 2d 68 6f 6f 6b 20 74 6f 20  he work-hook to 
25400 69 6e 66 6f 72 6d 20 74 68 65 20 61 70 70 6c 69  inform the appli
25410 63 61 74 69 6f 6e 20 74 68 61 74 0a 20 20 20 20  cation that.    
25420 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
25430 65 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  e structure has 
25440 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 20 20 20 20  changed. */.    
25450 20 20 6d 65 72 67 65 57 6f 72 6b 65 72 53 68 75    mergeWorkerShu
25460 74 64 6f 77 6e 28 26 6d 65 72 67 65 77 6f 72 6b  tdown(&mergework
25470 65 72 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  er, &rc);.      
25480 70 44 62 2d 3e 62 49 6e 63 72 4d 65 72 67 65 20  pDb->bIncrMerge 
25490 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
254a0 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 20 73 6f 72 74  c==LSM_OK ) sort
254b0 65 64 49 6e 76 6f 6b 65 57 6f 72 6b 48 6f 6f 6b  edInvokeWorkHook
254c0 28 70 44 62 29 3b 0a 0a 23 69 66 20 4c 53 4d 5f  (pDb);..#if LSM_
254d0 4c 4f 47 5f 53 54 52 55 43 54 55 52 45 0a 20 20  LOG_STRUCTURE.  
254e0 20 20 20 20 6c 73 6d 53 6f 72 74 65 64 44 75 6d      lsmSortedDum
254f0 70 53 74 72 75 63 74 75 72 65 28 70 44 62 2c 20  pStructure(pDb, 
25500 70 44 62 2d 3e 70 57 6f 72 6b 65 72 2c 20 4c 53  pDb->pWorker, LS
25510 4d 5f 4c 4f 47 5f 44 41 54 41 2c 20 30 2c 20 22  M_LOG_DATA, 0, "
25520 77 6f 72 6b 22 29 3b 0a 23 65 6e 64 69 66 0a 20  work");.#endif. 
25530 20 20 20 20 20 61 73 73 65 72 74 42 74 72 65 65       assertBtree
25540 4f 6b 28 70 44 62 2c 20 26 70 4c 65 76 65 6c 2d  Ok(pDb, &pLevel-
25550 3e 6c 68 73 29 3b 0a 20 20 20 20 20 20 61 73 73  >lhs);.      ass
25560 65 72 74 52 75 6e 49 6e 4f 72 64 65 72 28 70 44  ertRunInOrder(pD
25570 62 2c 20 26 70 4c 65 76 65 6c 2d 3e 6c 68 73 29  b, &pLevel->lhs)
25580 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62  ;..      /* If b
25590 46 6c 75 73 68 20 69 73 20 74 72 75 65 20 61 6e  Flush is true an
255a0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  d the database i
255b0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 63 6f 6e 73  s no longer cons
255c0 69 64 65 72 65 64 20 22 66 75 6c 6c 22 2c 0a 20  idered "full",. 
255d0 20 20 20 20 20 2a 2a 20 62 72 65 61 6b 20 6f 75       ** break ou
255e0 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76  t of the loop ev
255f0 65 6e 20 69 66 20 6e 52 65 6d 61 69 6e 69 6e 67  en if nRemaining
25600 20 69 73 20 73 74 69 6c 6c 20 67 72 65 61 74 65   is still greate
25610 72 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  r than.      ** 
25620 7a 65 72 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  zero. The caller
25630 20 68 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   has an in-memor
25640 79 20 74 72 65 65 20 74 6f 20 66 6c 75 73 68 20  y tree to flush 
25650 74 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 20  to disk.  */.   
25660 20 20 20 69 66 28 20 62 46 6c 75 73 68 20 26 26     if( bFlush &&
25670 20 73 6f 72 74 65 64 44 62 49 73 46 75 6c 6c 28   sortedDbIsFull(
25680 70 44 62 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  pDb)==0 ) break;
25690 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
256a0 28 20 70 6e 57 72 69 74 65 20 29 20 2a 70 6e 57  ( pnWrite ) *pnW
256b0 72 69 74 65 20 3d 20 28 6e 57 6f 72 6b 20 2d 20  rite = (nWork - 
256c0 6e 52 65 6d 61 69 6e 69 6e 67 29 3b 0a 20 20 70  nRemaining);.  p
256d0 57 6f 72 6b 65 72 2d 3e 6e 57 72 69 74 65 20 2b  Worker->nWrite +
256e0 3d 20 28 6e 57 6f 72 6b 20 2d 20 6e 52 65 6d 61  = (nWork - nRema
256f0 69 6e 69 6e 67 29 3b 0a 0a 23 69 66 64 65 66 20  ining);..#ifdef 
25700 4c 53 4d 5f 4c 4f 47 5f 57 4f 52 4b 0a 20 20 6c  LSM_LOG_WORK.  l
25710 73 6d 4c 6f 67 4d 65 73 73 61 67 65 28 70 44 62  smLogMessage(pDb
25720 2c 20 72 63 2c 20 22 73 6f 72 74 65 64 57 6f 72  , rc, "sortedWor
25730 6b 28 29 3a 20 25 64 20 70 61 67 65 73 22 2c 20  k(): %d pages", 
25740 28 6e 57 6f 72 6b 2d 6e 52 65 6d 61 69 6e 69 6e  (nWork-nRemainin
25750 67 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  g));.#endif.  re
25760 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25770 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
25780 6f 6e 6e 65 63 74 69 6f 6e 20 70 61 73 73 65 64  onnection passed
25790 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
257a0 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61  gument must be a
257b0 20 77 6f 72 6b 65 72 0a 2a 2a 20 63 6f 6e 6e 65   worker.** conne
257c0 63 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63  ction. This func
257d0 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74  tion checks if t
257e0 68 65 72 65 20 65 78 69 73 74 73 20 61 6e 20 22  here exists an "
257f0 6f 6c 64 22 20 69 6e 2d 6d 65 6d 6f 72 79 20 74  old" in-memory t
25800 72 65 65 0a 2a 2a 20 72 65 61 64 79 20 74 6f 20  ree.** ready to 
25810 62 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69  be flushed to di
25820 73 6b 2e 20 49 66 20 73 6f 2c 20 74 72 75 65 20  sk. If so, true 
25830 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
25840 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2a  erwise false..**
25850 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
25860 6f 63 63 75 72 73 2c 20 2a 70 52 63 20 69 73 20  occurs, *pRc is 
25870 73 65 74 20 74 6f 20 61 6e 20 4c 53 4d 20 65 72  set to an LSM er
25880 72 6f 72 20 63 6f 64 65 20 62 65 66 6f 72 65 20  ror code before 
25890 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 49 74  returning..** It
258a0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
258b0 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
258c0 4c 53 4d 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73  LSM_OK when this
258d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
258e0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  led..*/.static i
258f0 6e 74 20 73 6f 72 74 65 64 54 72 65 65 48 61 73  nt sortedTreeHas
25900 4f 6c 64 28 6c 73 6d 5f 64 62 20 2a 70 44 62 2c  Old(lsm_db *pDb,
25910 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 69 6e   int *pRc){.  in
25920 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 0a 20  t rc = LSM_OK;. 
25930 20 69 6e 74 20 62 52 65 74 20 3d 20 30 3b 0a 0a   int bRet = 0;..
25940 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
25950 57 6f 72 6b 65 72 20 29 3b 0a 20 20 69 66 28 20  Worker );.  if( 
25960 2a 70 52 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a  *pRc==LSM_OK ){.
25970 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f      if( rc==LSM_
25980 4f 4b 20 0a 20 20 20 20 20 20 20 20 26 26 20 70  OK .        && p
25990 44 62 2d 3e 74 72 65 65 68 64 72 2e 69 4f 6c 64  Db->treehdr.iOld
259a0 53 68 6d 69 64 0a 20 20 20 20 20 20 20 20 26 26  Shmid.        &&
259b0 20 70 44 62 2d 3e 74 72 65 65 68 64 72 2e 69 4f   pDb->treehdr.iO
259c0 6c 64 4c 6f 67 21 3d 70 44 62 2d 3e 70 57 6f 72  ldLog!=pDb->pWor
259d0 6b 65 72 2d 3e 69 4c 6f 67 4f 66 66 20 0a 20 20  ker->iLogOff .  
259e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 52 65      ){.      bRe
259f0 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 1;.    }else
25a00 7b 0a 20 20 20 20 20 20 62 52 65 74 20 3d 20 30  {.      bRet = 0
25a10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63  ;.    }.    *pRc
25a20 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73   = rc;.  }.  ass
25a30 65 72 74 28 20 2a 70 52 63 3d 3d 4c 53 4d 5f 4f  ert( *pRc==LSM_O
25a40 4b 20 7c 7c 20 62 52 65 74 3d 3d 30 20 29 3b 0a  K || bRet==0 );.
25a50 20 20 72 65 74 75 72 6e 20 62 52 65 74 3b 0a 7d    return bRet;.}
25a60 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
25a70 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6f   new free-list o
25a80 6e 6c 79 20 74 6f 70 2d 6c 65 76 65 6c 20 73 65  nly top-level se
25a90 67 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 4c 53  gment. Return LS
25aa0 4d 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  M_OK if successf
25ab0 75 6c 0a 2a 2a 20 6f 72 20 61 6e 20 4c 53 4d 20  ul.** or an LSM 
25ac0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
25ad0 6d 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  me error occurs.
25ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
25af0 6f 72 74 65 64 4e 65 77 46 72 65 65 6c 69 73 74  ortedNewFreelist
25b00 4f 6e 6c 79 28 6c 73 6d 5f 64 62 20 2a 70 44 62  Only(lsm_db *pDb
25b10 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 6f 72 74  ){.  return sort
25b20 65 64 4e 65 77 54 6f 70 6c 65 76 65 6c 28 70 44  edNewToplevel(pD
25b30 62 2c 20 54 52 45 45 5f 4e 4f 4e 45 2c 20 30 29  b, TREE_NONE, 0)
25b40 3b 0a 7d 0a 0a 69 6e 74 20 6c 73 6d 53 61 76 65  ;.}..int lsmSave
25b50 57 6f 72 6b 65 72 28 6c 73 6d 5f 64 62 20 2a 70  Worker(lsm_db *p
25b60 44 62 2c 20 69 6e 74 20 62 46 6c 75 73 68 29 7b  Db, int bFlush){
25b70 0a 20 20 53 6e 61 70 73 68 6f 74 20 2a 70 20 3d  .  Snapshot *p =
25b80 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 3b 0a 20   pDb->pWorker;. 
25b90 20 69 66 28 20 70 2d 3e 66 72 65 65 6c 69 73 74   if( p->freelist
25ba0 2e 6e 45 6e 74 72 79 3e 70 44 62 2d 3e 6e 4d 61  .nEntry>pDb->nMa
25bb0 78 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20  xFreelist ){.   
25bc0 20 69 6e 74 20 72 63 20 3d 20 73 6f 72 74 65 64   int rc = sorted
25bd0 4e 65 77 46 72 65 65 6c 69 73 74 4f 6e 6c 79 28  NewFreelistOnly(
25be0 70 44 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pDb);.    if( rc
25bf0 21 3d 4c 53 4d 5f 4f 4b 20 29 20 72 65 74 75 72  !=LSM_OK ) retur
25c00 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n rc;.  }.  retu
25c10 72 6e 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74  rn lsmCheckpoint
25c20 53 61 76 65 57 6f 72 6b 65 72 28 70 44 62 2c 20  SaveWorker(pDb, 
25c30 62 46 6c 75 73 68 29 3b 0a 7d 0a 0a 73 74 61 74  bFlush);.}..stat
25c40 69 63 20 69 6e 74 20 64 6f 4c 73 6d 53 69 6e 67  ic int doLsmSing
25c50 6c 65 57 6f 72 6b 28 0a 20 20 6c 73 6d 5f 64 62  leWork(.  lsm_db
25c60 20 2a 70 44 62 2c 20 0a 20 20 69 6e 74 20 62 53   *pDb, .  int bS
25c70 68 75 74 64 6f 77 6e 2c 0a 20 20 69 6e 74 20 6e  hutdown,.  int n
25c80 4d 65 72 67 65 2c 20 20 20 20 20 20 20 20 20 20  Merge,          
25c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69             /* Mi
25ca0 6e 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20 74  nimum segments t
25cb0 6f 20 6d 65 72 67 65 20 74 6f 67 65 74 68 65 72  o merge together
25cc0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 2c   */.  int nPage,
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ce0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25cf0 6f 66 20 70 61 67 65 73 20 74 6f 20 77 72 69 74  of pages to writ
25d00 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69  e to disk */.  i
25d10 6e 74 20 2a 70 6e 57 72 69 74 65 2c 20 20 20 20  nt *pnWrite,    
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25d30 2a 20 4f 55 54 3a 20 50 61 67 65 73 20 61 63 74  * OUT: Pages act
25d40 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 74 6f  ually written to
25d50 20 64 69 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 2a   disk */.  int *
25d60 70 62 43 6b 70 74 20 20 20 20 20 20 20 20 20 20  pbCkpt          
25d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
25d80 54 3a 20 54 72 75 65 20 69 66 20 61 6e 20 61 75  T: True if an au
25d90 74 6f 2d 63 68 65 63 6b 70 6f 69 6e 74 20 69 73  to-checkpoint is
25da0 20 72 65 71 2e 20 2a 2f 0a 29 7b 0a 20 20 53 6e   req. */.){.  Sn
25db0 61 70 73 68 6f 74 20 2a 70 57 6f 72 6b 65 72 3b  apshot *pWorker;
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25dd0 20 57 6f 72 6b 65 72 20 73 6e 61 70 73 68 6f 74   Worker snapshot
25de0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 4c   */.  int rc = L
25df0 53 4d 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  SM_OK;          
25e00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
25e10 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44  code */.  int bD
25e20 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  irty = 0;.  int 
25e30 6e 4d 61 78 20 3d 20 6e 50 61 67 65 3b 20 20 20  nMax = nPage;   
25e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
25e50 61 78 69 6d 75 6d 20 70 61 67 65 73 20 74 6f 20  aximum pages to 
25e60 77 72 69 74 65 20 74 6f 20 64 69 73 6b 20 2a 2f  write to disk */
25e70 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50  .  int nRem = nP
25e80 61 67 65 3b 0a 20 20 69 6e 74 20 62 43 6b 70 74  age;.  int bCkpt
25e90 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
25ea0 20 6e 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 2f   nPage>0 );..  /
25eb0 2a 20 4f 70 65 6e 20 74 68 65 20 77 6f 72 6b 65  * Open the worke
25ec0 72 20 27 74 72 61 6e 73 61 63 74 69 6f 6e 27 2e  r 'transaction'.
25ed0 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73   It will be clos
25ee0 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  ed before this f
25ef0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 72 65 74  unction.  ** ret
25f00 75 72 6e 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  urns.  */.  asse
25f10 72 74 28 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72  rt( pDb->pWorker
25f20 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 6c 73  ==0 );.  rc = ls
25f30 6d 42 65 67 69 6e 57 6f 72 6b 28 70 44 62 29 3b  mBeginWork(pDb);
25f40 0a 20 20 69 66 28 20 72 63 21 3d 4c 53 4d 5f 4f  .  if( rc!=LSM_O
25f50 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
25f60 20 70 57 6f 72 6b 65 72 20 3d 20 70 44 62 2d 3e   pWorker = pDb->
25f70 70 57 6f 72 6b 65 72 3b 0a 0a 20 20 2f 2a 20 49  pWorker;..  /* I
25f80 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
25f90 6e 20 69 73 20 64 6f 69 6e 67 20 61 75 74 6f 2d  n is doing auto-
25fa0 63 68 65 63 6b 70 6f 69 6e 74 73 2c 20 73 65 74  checkpoints, set
25fb0 20 6e 4d 61 78 20 28 61 6e 64 20 6e 52 65 6d 29   nMax (and nRem)
25fc0 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
25fd0 69 73 20 63 61 6c 6c 20 73 74 6f 70 73 20 77 72  is call stops wr
25fe0 69 74 69 6e 67 20 77 68 65 6e 20 74 68 65 20 61  iting when the a
25ff0 75 74 6f 2d 63 68 65 63 6b 70 6f 69 6e 74 20 69  uto-checkpoint i
26000 73 20 64 75 65 2e 20 54 68 65 0a 20 20 2a 2a 20  s due. The.  ** 
26010 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 6f 20 74  caller will do t
26020 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 74  he checkpoint, t
26030 68 65 6e 20 70 6f 73 73 69 62 6c 79 20 63 61 6c  hen possibly cal
26040 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
26050 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  again. */.  if( 
26060 62 53 68 75 74 64 6f 77 6e 3d 3d 30 20 26 26 20  bShutdown==0 && 
26070 70 44 62 2d 3e 6e 41 75 74 6f 63 6b 70 74 20 29  pDb->nAutockpt )
26080 7b 0a 20 20 20 20 75 33 32 20 6e 53 79 6e 63 3b  {.    u32 nSync;
26090 0a 20 20 20 20 75 33 32 20 6e 55 6e 73 79 6e 63  .    u32 nUnsync
260a0 3b 0a 20 20 20 20 69 6e 74 20 6e 50 67 73 7a 3b  ;.    int nPgsz;
260b0 0a 0a 20 20 20 20 6c 73 6d 43 68 65 63 6b 70 6f  ..    lsmCheckpo
260c0 69 6e 74 53 79 6e 63 65 64 28 70 44 62 2c 20 30  intSynced(pDb, 0
260d0 2c 20 30 2c 20 26 6e 53 79 6e 63 29 3b 0a 20 20  , 0, &nSync);.  
260e0 20 20 6e 55 6e 73 79 6e 63 20 3d 20 6c 73 6d 43    nUnsync = lsmC
260f0 68 65 63 6b 70 6f 69 6e 74 4e 57 72 69 74 65 28  heckpointNWrite(
26100 70 44 62 2d 3e 70 53 68 6d 68 64 72 2d 3e 61 53  pDb->pShmhdr->aS
26110 6e 61 70 31 2c 20 30 29 3b 0a 20 20 20 20 6e 50  nap1, 0);.    nP
26120 67 73 7a 20 3d 20 6c 73 6d 43 68 65 63 6b 70 6f  gsz = lsmCheckpo
26130 69 6e 74 50 67 73 7a 28 70 44 62 2d 3e 70 53 68  intPgsz(pDb->pSh
26140 6d 68 64 72 2d 3e 61 53 6e 61 70 31 29 3b 0a 0a  mhdr->aSnap1);..
26150 20 20 20 20 6e 4d 61 78 20 3d 20 28 69 6e 74 29      nMax = (int)
26160 4c 53 4d 5f 4d 49 4e 28 6e 4d 61 78 2c 20 28 70  LSM_MIN(nMax, (p
26170 44 62 2d 3e 6e 41 75 74 6f 63 6b 70 74 2f 6e 50  Db->nAutockpt/nP
26180 67 73 7a 29 20 2d 20 28 69 6e 74 29 28 6e 55 6e  gsz) - (int)(nUn
26190 73 79 6e 63 2d 6e 53 79 6e 63 29 29 3b 0a 20 20  sync-nSync));.  
261a0 20 20 69 66 28 20 6e 4d 61 78 3c 6e 52 65 6d 20    if( nMax<nRem 
261b0 29 7b 0a 20 20 20 20 20 20 62 43 6b 70 74 20 3d  ){.      bCkpt =
261c0 20 31 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 3d   1;.      nRem =
261d0 20 4c 53 4d 5f 4d 41 58 28 6e 4d 61 78 2c 20 30   LSM_MAX(nMax, 0
261e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
261f0 2f 2a 20 49 66 20 74 68 65 72 65 20 65 78 69 73  /* If there exis
26200 74 73 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ts in-memory dat
26210 61 20 72 65 61 64 79 20 74 6f 20 62 65 20 66 6c  a ready to be fl
26220 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2c 20 61  ushed to disk, a
26230 74 74 65 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 66  ttempt.  ** to f
26240 6c 75 73 68 20 69 74 20 6e 6f 77 2e 20 20 2a 2f  lush it now.  */
26250 0a 20 20 69 66 28 20 70 44 62 2d 3e 6e 54 72 61  .  if( pDb->nTra
26260 6e 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  nsOpen==0 ){.   
26270 20 72 63 20 3d 20 6c 73 6d 54 72 65 65 4c 6f 61   rc = lsmTreeLoa
26280 64 48 65 61 64 65 72 28 70 44 62 2c 20 30 29 3b  dHeader(pDb, 0);
26290 0a 20 20 7d 0a 20 20 69 66 28 20 73 6f 72 74 65  .  }.  if( sorte
262a0 64 54 72 65 65 48 61 73 4f 6c 64 28 70 44 62 2c  dTreeHasOld(pDb,
262b0 20 26 72 63 29 20 29 7b 0a 20 20 20 20 2f 2a 20   &rc) ){.    /* 
262c0 73 6f 72 74 65 64 44 62 49 73 46 75 6c 6c 28 29  sortedDbIsFull()
262d0 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
262e0 6f 20 69 66 20 65 69 74 68 65 72 20 28 61 29 20  o if either (a) 
262f0 74 68 65 72 65 20 61 72 65 20 74 6f 6f 20 6d 61  there are too ma
26300 6e 79 0a 20 20 20 20 2a 2a 20 6c 65 76 65 6c 73  ny.    ** levels
26310 20 69 6e 20 74 6f 74 61 6c 20 69 6e 20 74 68 65   in total in the
26320 20 64 62 2c 20 6f 72 20 28 62 29 20 74 68 65 72   db, or (b) ther
26330 65 20 61 72 65 20 74 6f 6f 20 6d 61 6e 79 20 6c  e are too many l
26340 65 76 65 6c 73 20 77 69 74 68 20 74 68 65 0a 20  evels with the. 
26350 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61     ** the same a
26360 67 65 20 69 6e 20 74 68 65 20 64 62 2e 20 45 69  ge in the db. Ei
26370 74 68 65 72 20 77 61 79 2c 20 63 61 6c 6c 20 73  ther way, call s
26380 6f 72 74 65 64 57 6f 72 6b 28 29 20 74 6f 20 6d  ortedWork() to m
26390 65 72 67 65 20 0a 20 20 20 20 2a 2a 20 65 78 69  erge .    ** exi
263a0 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 74  sting segments t
263b0 6f 67 65 74 68 65 72 20 75 6e 74 69 6c 20 74 68  ogether until th
263c0 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  is condition is 
263d0 63 6c 65 61 72 65 64 2e 20 20 2a 2f 0a 20 20 20  cleared.  */.   
263e0 20 69 66 28 20 73 6f 72 74 65 64 44 62 49 73 46   if( sortedDbIsF
263f0 75 6c 6c 28 70 44 62 29 20 29 7b 0a 20 20 20 20  ull(pDb) ){.    
26400 20 20 69 6e 74 20 6e 50 67 20 3d 20 30 3b 0a 20    int nPg = 0;. 
26410 20 20 20 20 20 72 63 20 3d 20 73 6f 72 74 65 64       rc = sorted
26420 57 6f 72 6b 28 70 44 62 2c 20 6e 52 65 6d 2c 20  Work(pDb, nRem, 
26430 6e 4d 65 72 67 65 2c 20 31 2c 20 26 6e 50 67 29  nMerge, 1, &nPg)
26440 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20  ;.      nRem -= 
26450 6e 50 67 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nPg;.      asser
26460 74 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 7c 7c  t( rc!=LSM_OK ||
26470 20 6e 52 65 6d 3c 3d 30 20 7c 7c 20 21 73 6f 72   nRem<=0 || !sor
26480 74 65 64 44 62 49 73 46 75 6c 6c 28 70 44 62 29  tedDbIsFull(pDb)
26490 20 29 3b 0a 20 20 20 20 20 20 62 44 69 72 74 79   );.      bDirty
264a0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
264b0 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
264c0 26 26 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20  && nRem>0 ){.   
264d0 20 20 20 69 6e 74 20 6e 50 67 20 3d 20 30 3b 0a     int nPg = 0;.
264e0 20 20 20 20 20 20 72 63 20 3d 20 73 6f 72 74 65        rc = sorte
264f0 64 4e 65 77 54 6f 70 6c 65 76 65 6c 28 70 44 62  dNewToplevel(pDb
26500 2c 20 54 52 45 45 5f 4f 4c 44 2c 20 26 6e 50 67  , TREE_OLD, &nPg
26510 29 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d  );.      nRem -=
26520 20 6e 50 67 3b 0a 20 20 20 20 20 20 69 66 28 20   nPg;.      if( 
26530 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20  rc==LSM_OK ){.  
26540 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 6e        if( pDb->n
26550 54 72 61 6e 73 4f 70 65 6e 3e 30 20 29 7b 0a 20  TransOpen>0 ){. 
26560 20 20 20 20 20 20 20 20 20 6c 73 6d 54 72 65 65           lsmTree
26570 44 69 73 63 61 72 64 4f 6c 64 28 70 44 62 29 3b  DiscardOld(pDb);
26580 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26590 20 20 20 72 63 20 3d 20 6c 73 6d 53 61 76 65 57     rc = lsmSaveW
265a0 6f 72 6b 65 72 28 70 44 62 2c 20 31 29 3b 0a 20  orker(pDb, 1);. 
265b0 20 20 20 20 20 20 20 62 44 69 72 74 79 20 3d 20         bDirty = 
265c0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
265d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 50  .  }..  /* If nP
265e0 61 67 65 20 69 73 20 73 74 69 6c 6c 20 67 72 65  age is still gre
265f0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
26600 64 6f 20 73 6f 6d 65 20 6d 65 72 67 69 6e 67 2e  do some merging.
26610 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53   */.  if( rc==LS
26620 4d 5f 4f 4b 20 26 26 20 6e 52 65 6d 3e 30 20 26  M_OK && nRem>0 &
26630 26 20 62 53 68 75 74 64 6f 77 6e 3d 3d 30 20 29  & bShutdown==0 )
26640 7b 0a 20 20 20 20 69 6e 74 20 6e 50 67 20 3d 20  {.    int nPg = 
26650 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 6f 72 74  0;.    rc = sort
26660 65 64 57 6f 72 6b 28 70 44 62 2c 20 6e 52 65 6d  edWork(pDb, nRem
26670 2c 20 6e 4d 65 72 67 65 2c 20 30 2c 20 26 6e 50  , nMerge, 0, &nP
26680 67 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20  g);.    nRem -= 
26690 6e 50 67 3b 0a 20 20 20 20 69 66 28 20 6e 50 67  nPg;.    if( nPg
266a0 20 29 20 62 44 69 72 74 79 20 3d 20 31 3b 0a 20   ) bDirty = 1;. 
266b0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
266c0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 72 74 20 6f  in-memory part o
266d0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
266e0 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 77 72  is too large, wr
266f0 69 74 65 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20  ite a new .  ** 
26700 74 6f 70 2d 6c 65 76 65 6c 20 63 6f 6e 74 61 69  top-level contai
26710 6e 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e  ning just the in
26720 2d 6d 65 6d 6f 72 79 20 66 72 65 65 2d 6c 69 73  -memory free-lis
26730 74 20 65 6e 74 72 69 65 73 20 74 6f 20 64 69 73  t entries to dis
26740 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  k. */.  if( rc==
26750 4c 53 4d 5f 4f 4b 20 26 26 20 70 44 62 2d 3e 70  LSM_OK && pDb->p
26760 57 6f 72 6b 65 72 2d 3e 66 72 65 65 6c 69 73 74  Worker->freelist
26770 2e 6e 45 6e 74 72 79 20 3e 20 70 44 62 2d 3e 6e  .nEntry > pDb->n
26780 4d 61 78 46 72 65 65 6c 69 73 74 20 29 7b 0a 20  MaxFreelist ){. 
26790 20 20 20 69 6e 74 20 6e 50 67 20 3d 20 30 3b 0a     int nPg = 0;.
267a0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 4c      while( rc==L
267b0 53 4d 5f 4f 4b 20 26 26 20 6c 73 6d 44 61 74 61  SM_OK && lsmData
267c0 62 61 73 65 46 75 6c 6c 28 70 44 62 29 20 29 7b  baseFull(pDb) ){
267d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 6f 72 74  .      rc = sort
267e0 65 64 57 6f 72 6b 28 70 44 62 2c 20 31 36 2c 20  edWork(pDb, 16, 
267f0 6e 4d 65 72 67 65 2c 20 31 2c 20 26 6e 50 67 29  nMerge, 1, &nPg)
26800 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20  ;.      nRem -= 
26810 6e 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nPg;.    }.    i
26820 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b  f( rc==LSM_OK ){
26830 0a 20 20 20 20 20 20 72 63 20 3d 20 73 6f 72 74  .      rc = sort
26840 65 64 4e 65 77 46 72 65 65 6c 69 73 74 4f 6e 6c  edNewFreelistOnl
26850 79 28 70 44 62 29 3b 0a 20 20 20 20 7d 0a 20 20  y(pDb);.    }.  
26860 20 20 6e 52 65 6d 20 2d 3d 20 6e 50 67 3b 0a 20    nRem -= nPg;. 
26870 20 20 20 69 66 28 20 6e 50 67 20 29 20 62 44 69     if( nPg ) bDi
26880 72 74 79 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  rty = 1;.  }..  
26890 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 29  if( rc==LSM_OK )
268a0 7b 0a 20 20 20 20 2a 70 6e 57 72 69 74 65 20 3d  {.    *pnWrite =
268b0 20 28 6e 4d 61 78 20 2d 20 6e 52 65 6d 29 3b 0a   (nMax - nRem);.
268c0 20 20 20 20 2a 70 62 43 6b 70 74 20 3d 20 28 62      *pbCkpt = (b
268d0 43 6b 70 74 20 26 26 20 6e 52 65 6d 3c 3d 30 29  Ckpt && nRem<=0)
268e0 3b 0a 20 20 20 20 69 66 28 20 6e 4d 65 72 67 65  ;.    if( nMerge
268f0 3d 3d 31 20 26 26 20 70 44 62 2d 3e 6e 41 75 74  ==1 && pDb->nAut
26900 6f 63 6b 70 74 3e 30 20 26 26 20 2a 70 6e 57 72  ockpt>0 && *pnWr
26910 69 74 65 3e 30 0a 20 20 20 20 20 26 26 20 70 57  ite>0.     && pW
26920 6f 72 6b 65 72 2d 3e 70 4c 65 76 65 6c 20 0a 20  orker->pLevel . 
26930 20 20 20 20 26 26 20 70 57 6f 72 6b 65 72 2d 3e      && pWorker->
26940 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3d 3d  pLevel->nRight==
26950 30 20 0a 20 20 20 20 20 26 26 20 70 57 6f 72 6b  0 .     && pWork
26960 65 72 2d 3e 70 4c 65 76 65 6c 2d 3e 70 4e 65 78  er->pLevel->pNex
26970 74 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  t==0 .    ){.   
26980 20 20 20 2a 70 62 43 6b 70 74 20 3d 20 31 3b 0a     *pbCkpt = 1;.
26990 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
269a0 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26 20 62   rc==LSM_OK && b
269b0 44 69 72 74 79 20 29 7b 0a 20 20 20 20 6c 73 6d  Dirty ){.    lsm
269c0 46 69 6e 69 73 68 57 6f 72 6b 28 70 44 62 2c 20  FinishWork(pDb, 
269d0 30 2c 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65  0, &rc);.  }else
269e0 7b 0a 20 20 20 20 69 6e 74 20 72 63 64 75 6d 6d  {.    int rcdumm
269f0 79 20 3d 20 4c 53 4d 5f 42 55 53 59 3b 0a 20 20  y = LSM_BUSY;.  
26a00 20 20 6c 73 6d 46 69 6e 69 73 68 57 6f 72 6b 28    lsmFinishWork(
26a10 70 44 62 2c 20 30 2c 20 26 72 63 64 75 6d 6d 79  pDb, 0, &rcdummy
26a20 29 3b 0a 20 20 20 20 2a 70 6e 57 72 69 74 65 20  );.    *pnWrite 
26a30 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
26a40 74 28 20 70 44 62 2d 3e 70 57 6f 72 6b 65 72 3d  t( pDb->pWorker=
26a50 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
26a60 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
26a70 20 64 6f 4c 73 6d 57 6f 72 6b 28 6c 73 6d 5f 64   doLsmWork(lsm_d
26a80 62 20 2a 70 44 62 2c 20 69 6e 74 20 6e 4d 65 72  b *pDb, int nMer
26a90 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 2c 20 69  ge, int nPage, i
26aa0 6e 74 20 2a 70 6e 57 72 69 74 65 29 7b 0a 20 20  nt *pnWrite){.  
26ab0 69 6e 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b  int rc = LSM_OK;
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ad0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
26ae0 2f 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d  /.  int nWrite =
26af0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
26b00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26b10 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a   pages written *
26b20 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 65  /..  assert( nMe
26b30 72 67 65 3e 3d 31 20 29 3b 0a 0a 20 20 69 66 28  rge>=1 );..  if(
26b40 20 6e 50 61 67 65 21 3d 30 20 29 7b 0a 20 20 20   nPage!=0 ){.   
26b50 20 69 6e 74 20 62 43 6b 70 74 20 3d 20 30 3b 0a   int bCkpt = 0;.
26b60 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
26b70 6e 74 20 6e 54 68 69 73 20 3d 20 30 3b 0a 20 20  nt nThis = 0;.  
26b80 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 28      int nReq = (
26b90 6e 50 61 67 65 3e 3d 30 29 20 3f 20 28 6e 50 61  nPage>=0) ? (nPa
26ba0 67 65 2d 6e 57 72 69 74 65 29 20 3a 20 28 28 69  ge-nWrite) : ((i
26bb0 6e 74 29 30 78 37 46 46 46 46 46 46 46 29 3b 0a  nt)0x7FFFFFFF);.
26bc0 0a 20 20 20 20 20 20 62 43 6b 70 74 20 3d 20 30  .      bCkpt = 0
26bd0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 6f 4c  ;.      rc = doL
26be0 73 6d 53 69 6e 67 6c 65 57 6f 72 6b 28 70 44 62  smSingleWork(pDb
26bf0 2c 20 30 2c 20 6e 4d 65 72 67 65 2c 20 6e 52 65  , 0, nMerge, nRe
26c00 71 2c 20 26 6e 54 68 69 73 2c 20 26 62 43 6b 70  q, &nThis, &bCkp
26c10 74 29 3b 0a 20 20 20 20 20 20 6e 57 72 69 74 65  t);.      nWrite
26c20 20 2b 3d 20 6e 54 68 69 73 3b 0a 20 20 20 20 20   += nThis;.     
26c30 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20   if( rc==LSM_OK 
26c40 26 26 20 62 43 6b 70 74 20 29 7b 0a 20 20 20 20  && bCkpt ){.    
26c50 20 20 20 20 72 63 20 3d 20 6c 73 6d 5f 63 68 65      rc = lsm_che
26c60 63 6b 70 6f 69 6e 74 28 70 44 62 2c 20 30 29 3b  ckpoint(pDb, 0);
26c70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
26c80 69 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20  ile( rc==LSM_OK 
26c90 26 26 20 62 43 6b 70 74 20 26 26 20 28 6e 57 72  && bCkpt && (nWr
26ca0 69 74 65 3c 6e 50 61 67 65 20 7c 7c 20 6e 50 61  ite<nPage || nPa
26cb0 67 65 3c 30 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  ge<0) );.  }..  
26cc0 69 66 28 20 70 6e 57 72 69 74 65 20 29 7b 0a 20  if( pnWrite ){. 
26cd0 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f     if( rc==LSM_O
26ce0 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 57 72  K ){.      *pnWr
26cf0 69 74 65 20 3d 20 6e 57 72 69 74 65 3b 0a 20 20  ite = nWrite;.  
26d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
26d10 70 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 20  pnWrite = 0;.   
26d20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
26d30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 65 72  rc;.}../*.** Per
26d40 66 6f 72 6d 20 77 6f 72 6b 20 74 6f 20 6d 65 72  form work to mer
26d50 67 65 20 64 61 74 61 62 61 73 65 20 73 65 67 6d  ge database segm
26d60 65 6e 74 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a  ents together..*
26d70 2f 0a 69 6e 74 20 6c 73 6d 5f 77 6f 72 6b 28 6c  /.int lsm_work(l
26d80 73 6d 5f 64 62 20 2a 70 44 62 2c 20 69 6e 74 20  sm_db *pDb, int 
26d90 6e 4d 65 72 67 65 2c 20 69 6e 74 20 6e 4b 42 2c  nMerge, int nKB,
26da0 20 69 6e 74 20 2a 70 6e 57 72 69 74 65 29 7b 0a   int *pnWrite){.
26db0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
26dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dd0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
26de0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 73 7a 3b   */.  int nPgsz;
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e00 20 20 20 20 20 20 2f 2a 20 4e 6f 6d 69 6e 61 6c        /* Nominal
26e10 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 62 79   page size in by
26e20 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  tes */.  int nPa
26e30 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
26e40 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 69           /* Equi
26e50 76 61 6c 65 6e 74 20 6f 66 20 6e 4b 42 20 69 6e  valent of nKB in
26e60 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
26e70 6e 57 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20  nWrite = 0;     
26e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26e90 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
26ea0 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ritten */..  /* 
26eb0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
26ec0 79 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  y not be called 
26ed0 69 66 20 70 44 62 20 68 61 73 20 61 6e 20 6f 70  if pDb has an op
26ee0 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
26ef0 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
26f00 6e 2e 20 52 65 74 75 72 6e 20 4c 53 4d 5f 4d 49  n. Return LSM_MI
26f10 53 55 53 45 20 69 66 20 61 6e 20 61 70 70 6c 69  SUSE if an appli
26f20 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  cation attempts 
26f30 74 68 69 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  this.  */.  if( 
26f40 70 44 62 2d 3e 6e 54 72 61 6e 73 4f 70 65 6e 20  pDb->nTransOpen 
26f50 7c 7c 20 70 44 62 2d 3e 70 43 73 72 20 29 20 72  || pDb->pCsr ) r
26f60 65 74 75 72 6e 20 4c 53 4d 5f 4d 49 53 55 53 45  eturn LSM_MISUSE
26f70 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 6e 4d 65  _BKPT;.  if( nMe
26f80 72 67 65 3c 3d 30 20 29 20 6e 4d 65 72 67 65 20  rge<=0 ) nMerge 
26f90 3d 20 70 44 62 2d 3e 6e 4d 65 72 67 65 3b 0a 0a  = pDb->nMerge;..
26fa0 20 20 6c 73 6d 46 73 50 75 72 67 65 43 61 63 68    lsmFsPurgeCach
26fb0 65 28 70 44 62 2d 3e 70 46 53 29 3b 0a 0a 20 20  e(pDb->pFS);..  
26fc0 2f 2a 20 43 6f 6e 76 65 72 74 20 66 72 6f 6d 20  /* Convert from 
26fd0 4b 42 20 74 6f 20 70 61 67 65 73 20 2a 2f 0a 20  KB to pages */. 
26fe0 20 6e 50 67 73 7a 20 3d 20 6c 73 6d 46 73 50 61   nPgsz = lsmFsPa
26ff0 67 65 53 69 7a 65 28 70 44 62 2d 3e 70 46 53 29  geSize(pDb->pFS)
27000 3b 0a 20 20 69 66 28 20 6e 4b 42 3e 3d 30 20 29  ;.  if( nKB>=0 )
27010 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 28  {.    nPage = ((
27020 69 36 34 29 6e 4b 42 20 2a 20 31 30 32 34 20 2b  i64)nKB * 1024 +
27030 20 6e 50 67 73 7a 20 2d 20 31 29 20 2f 20 6e 50   nPgsz - 1) / nP
27040 67 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  gsz;.  }else{.  
27050 20 20 6e 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20    nPage = -1;.  
27060 7d 0a 0a 20 20 72 63 20 3d 20 64 6f 4c 73 6d 57  }..  rc = doLsmW
27070 6f 72 6b 28 70 44 62 2c 20 6e 4d 65 72 67 65 2c  ork(pDb, nMerge,
27080 20 6e 50 61 67 65 2c 20 26 6e 57 72 69 74 65 29   nPage, &nWrite)
27090 3b 0a 20 20 0a 20 20 69 66 28 20 70 6e 57 72 69  ;.  .  if( pnWri
270a0 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 6e  te ){.    /* Con
270b0 76 65 72 74 20 62 61 63 6b 20 66 72 6f 6d 20 70  vert back from p
270c0 61 67 65 73 20 74 6f 20 4b 42 20 2a 2f 0a 20 20  ages to KB */.  
270d0 20 20 2a 70 6e 57 72 69 74 65 20 3d 20 28 69 6e    *pnWrite = (in
270e0 74 29 28 28 28 69 36 34 29 6e 57 72 69 74 65 20  t)(((i64)nWrite 
270f0 2a 20 31 30 32 34 20 2b 20 6e 50 67 73 7a 20 2d  * 1024 + nPgsz -
27100 20 31 29 20 2f 20 6e 50 67 73 7a 29 3b 0a 20 20   1) / nPgsz);.  
27110 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27120 0a 0a 69 6e 74 20 6c 73 6d 5f 66 6c 75 73 68 28  ..int lsm_flush(
27130 6c 73 6d 5f 64 62 20 2a 64 62 29 7b 0a 20 20 69  lsm_db *db){.  i
27140 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 64 62  nt rc;..  if( db
27150 2d 3e 6e 54 72 61 6e 73 4f 70 65 6e 3e 30 20 7c  ->nTransOpen>0 |
27160 7c 20 64 62 2d 3e 70 43 73 72 20 29 7b 0a 20 20  | db->pCsr ){.  
27170 20 20 72 63 20 3d 20 4c 53 4d 5f 4d 49 53 55 53    rc = LSM_MISUS
27180 45 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  E_BKPT;.  }else{
27190 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 42 65 67  .    rc = lsmBeg
271a0 69 6e 57 72 69 74 65 54 72 61 6e 73 28 64 62 29  inWriteTrans(db)
271b0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53  ;.    if( rc==LS
271c0 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6c 73  M_OK ){.      ls
271d0 6d 46 6c 75 73 68 54 72 65 65 54 6f 44 69 73 6b  mFlushTreeToDisk
271e0 28 64 62 29 3b 0a 20 20 20 20 20 20 6c 73 6d 54  (db);.      lsmT
271f0 72 65 65 44 69 73 63 61 72 64 4f 6c 64 28 64 62  reeDiscardOld(db
27200 29 3b 0a 20 20 20 20 20 20 6c 73 6d 54 72 65 65  );.      lsmTree
27210 4d 61 6b 65 4f 6c 64 28 64 62 29 3b 0a 20 20 20  MakeOld(db);.   
27220 20 20 20 6c 73 6d 54 72 65 65 44 69 73 63 61 72     lsmTreeDiscar
27230 64 4f 6c 64 28 64 62 29 3b 0a 20 20 20 20 7d 0a  dOld(db);.    }.
27240 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d  .    if( rc==LSM
27250 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
27260 3d 20 6c 73 6d 46 69 6e 69 73 68 57 72 69 74 65  = lsmFinishWrite
27270 54 72 61 6e 73 28 64 62 2c 20 31 29 3b 0a 20 20  Trans(db, 1);.  
27280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
27290 73 6d 46 69 6e 69 73 68 57 72 69 74 65 54 72 61  smFinishWriteTra
272a0 6e 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 7d  ns(db, 0);.    }
272b0 0a 20 20 20 20 6c 73 6d 46 69 6e 69 73 68 52 65  .    lsmFinishRe
272c0 61 64 54 72 61 6e 73 28 64 62 29 3b 0a 20 20 7d  adTrans(db);.  }
272d0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
272e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
272f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
27300 69 6e 20 61 75 74 6f 2d 77 6f 72 6b 20 6d 6f 64  in auto-work mod
27310 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 6d 65 72  e to perform mer
27320 67 69 6e 67 20 77 6f 72 6b 20 6f 6e 0a 2a 2a 20  ging work on.** 
27330 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  the data structu
27340 72 65 2e 20 49 74 20 70 65 72 66 6f 72 6d 73 20  re. It performs 
27350 65 6e 6f 75 67 68 20 6d 65 72 67 69 6e 67 20 77  enough merging w
27360 6f 72 6b 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ork to prevent t
27370 68 65 0a 2a 2a 20 68 65 69 67 68 74 20 6f 66 20  he.** height of 
27380 74 68 65 20 74 72 65 65 20 66 72 6f 6d 20 67 72  the tree from gr
27390 6f 77 69 6e 67 20 69 6e 64 65 66 69 6e 69 74 65  owing indefinite
273a0 6c 79 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  ly assuming that
273b0 20 72 6f 75 67 68 6c 79 0a 2a 2a 20 6e 55 6e 69   roughly.** nUni
273c0 74 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  t database pages
273d0 20 77 6f 72 74 68 20 6f 66 20 64 61 74 61 20 68   worth of data h
273e0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
273f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
27400 0a 2a 2a 20 28 69 2e 65 2e 20 74 68 65 20 69 6e  .** (i.e. the in
27410 2d 6d 65 6d 6f 72 79 20 74 72 65 65 29 20 73 69  -memory tree) si
27420 6e 63 65 20 74 68 65 20 6c 61 73 74 20 63 61 6c  nce the last cal
27430 6c 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d 53 6f 72  l..*/.int lsmSor
27440 74 65 64 41 75 74 6f 57 6f 72 6b 28 0a 20 20 6c  tedAutoWork(.  l
27450 73 6d 5f 64 62 20 2a 70 44 62 2c 20 20 20 20 20  sm_db *pDb,     
27460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27470 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
27480 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 6e 69 74  e */.  int nUnit
27490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
274b0 6f 66 20 64 61 74 61 20 77 72 69 74 74 65 6e 20  of data written 
274c0 74 6f 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72 65  to in-memory tre
274d0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
274e0 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20 20 20   = LSM_OK;      
274f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
27500 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
27510 74 20 6e 44 65 70 74 68 20 3d 20 30 3b 20 20 20  t nDepth = 0;   
27520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27530 20 43 75 72 72 65 6e 74 20 68 65 69 67 68 74 20   Current height 
27540 6f 66 20 74 72 65 65 20 28 6c 6f 6e 67 65 73 74  of tree (longest
27550 20 70 61 74 68 29 20 2a 2f 0a 20 20 4c 65 76 65   path) */.  Leve
27560 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20  l *pLevel;      
27570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
27580 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
27590 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
275a0 0a 20 20 69 6e 74 20 62 52 65 73 74 6f 72 65 20  .  int bRestore 
275b0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
275c0 70 44 62 2d 3e 70 57 6f 72 6b 65 72 3d 3d 30 20  pDb->pWorker==0 
275d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
275e0 2d 3e 6e 54 72 61 6e 73 4f 70 65 6e 3e 30 20 29  ->nTransOpen>0 )
275f0 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e  ;..  /* Determin
27600 65 20 68 6f 77 20 6d 61 6e 79 20 75 6e 69 74 73  e how many units
27610 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 62   of work to do b
27620 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
27630 20 4f 6e 65 20 75 6e 69 74 20 6f 66 0a 20 20 2a   One unit of.  *
27640 2a 20 77 6f 72 6b 20 69 73 20 61 63 68 69 65 76  * work is achiev
27650 65 64 20 62 79 20 77 72 69 74 69 6e 67 20 6f 6e  ed by writing on
27660 65 20 70 61 67 65 20 28 7e 34 4b 42 29 20 6f 66  e page (~4KB) of
27670 20 6d 65 72 67 65 64 20 64 61 74 61 2e 20 20 2a   merged data.  *
27680 2f 0a 20 20 66 6f 72 28 70 4c 65 76 65 6c 3d 6c  /.  for(pLevel=l
27690 73 6d 44 62 53 6e 61 70 73 68 6f 74 4c 65 76 65  smDbSnapshotLeve
276a0 6c 28 70 44 62 2d 3e 70 43 6c 69 65 6e 74 29 3b  l(pDb->pClient);
276b0 20 70 4c 65 76 65 6c 3b 20 70 4c 65 76 65 6c 3d   pLevel; pLevel=
276c0 70 4c 65 76 65 6c 2d 3e 70 4e 65 78 74 29 7b 0a  pLevel->pNext){.
276d0 20 20 20 20 2f 2a 20 6e 44 65 70 74 68 20 2b 3d      /* nDepth +=
276e0 20 4c 53 4d 5f 4d 41 58 28 31 2c 20 70 4c 65 76   LSM_MAX(1, pLev
276f0 65 6c 2d 3e 6e 52 69 67 68 74 29 3b 20 2a 2f 0a  el->nRight); */.
27700 20 20 20 20 6e 44 65 70 74 68 20 2b 3d 20 31 3b      nDepth += 1;
27710 0a 20 20 7d 0a 20 20 69 66 28 20 6c 73 6d 54 72  .  }.  if( lsmTr
27720 65 65 48 61 73 4f 6c 64 28 70 44 62 29 20 29 7b  eeHasOld(pDb) ){
27730 0a 20 20 20 20 6e 44 65 70 74 68 20 2b 3d 20 31  .    nDepth += 1
27740 3b 0a 20 20 20 20 62 52 65 73 74 6f 72 65 20 3d  ;.    bRestore =
27750 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d   1;.    rc = lsm
27760 53 61 76 65 43 75 72 73 6f 72 73 28 70 44 62 29  SaveCursors(pDb)
27770 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 4c 53  ;.    if( rc!=LS
27780 4d 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  M_OK ) return rc
27790 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 44 65  ;.  }..  if( nDe
277a0 70 74 68 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  pth>0 ){.    int
277b0 20 6e 52 65 6d 61 69 6e 69 6e 67 3b 20 20 20 20   nRemaining;    
277c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
277d0 69 74 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64  its of work to d
277e0 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  o before returni
277f0 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 52 65 6d 61  ng */..    nRema
27800 69 6e 69 6e 67 20 3d 20 6e 55 6e 69 74 20 2a 20  ining = nUnit * 
27810 6e 44 65 70 74 68 3b 0a 23 69 66 64 65 66 20 4c  nDepth;.#ifdef L
27820 53 4d 5f 4c 4f 47 5f 57 4f 52 4b 0a 20 20 20 20  SM_LOG_WORK.    
27830 6c 73 6d 4c 6f 67 4d 65 73 73 61 67 65 28 70 44  lsmLogMessage(pD
27840 62 2c 20 72 63 2c 20 22 6c 73 6d 53 6f 72 74 65  b, rc, "lsmSorte
27850 64 41 75 74 6f 57 6f 72 6b 28 29 3a 20 25 64 2a  dAutoWork(): %d*
27860 25 64 20 3d 20 25 64 20 70 61 67 65 73 22 2c 20  %d = %d pages", 
27870 0a 20 20 20 20 20 20 20 20 6e 55 6e 69 74 2c 20  .        nUnit, 
27880 6e 44 65 70 74 68 2c 20 6e 52 65 6d 61 69 6e 69  nDepth, nRemaini
27890 6e 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ng);.#endif.    
278a0 61 73 73 65 72 74 28 20 6e 52 65 6d 61 69 6e 69  assert( nRemaini
278b0 6e 67 3e 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  ng>=0 );.    rc 
278c0 3d 20 64 6f 4c 73 6d 57 6f 72 6b 28 70 44 62 2c  = doLsmWork(pDb,
278d0 20 70 44 62 2d 3e 6e 4d 65 72 67 65 2c 20 6e 52   pDb->nMerge, nR
278e0 65 6d 61 69 6e 69 6e 67 2c 20 30 29 3b 0a 20 20  emaining, 0);.  
278f0 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 42 55    if( rc==LSM_BU
27900 53 59 20 29 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b  SY ) rc = LSM_OK
27910 3b 0a 0a 20 20 20 20 69 66 28 20 62 52 65 73 74  ;..    if( bRest
27920 6f 72 65 20 26 26 20 70 44 62 2d 3e 70 43 73 72  ore && pDb->pCsr
27930 20 29 7b 0a 20 20 20 20 20 20 6c 73 6d 4d 43 75   ){.      lsmMCu
27940 72 73 6f 72 46 72 65 65 43 61 63 68 65 28 70 44  rsorFreeCache(pD
27950 62 29 3b 0a 20 20 20 20 20 20 6c 73 6d 46 72 65  b);.      lsmFre
27960 65 53 6e 61 70 73 68 6f 74 28 70 44 62 2d 3e 70  eSnapshot(pDb->p
27970 45 6e 76 2c 20 70 44 62 2d 3e 70 43 6c 69 65 6e  Env, pDb->pClien
27980 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70  t);.      pDb->p
27990 43 6c 69 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20  Client = 0;.    
279a0 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b    if( rc==LSM_OK
279b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
279c0 20 6c 73 6d 43 68 65 63 6b 70 6f 69 6e 74 4c 6f   lsmCheckpointLo
279d0 61 64 28 70 44 62 2c 20 30 29 3b 0a 20 20 20 20  ad(pDb, 0);.    
279e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
279f0 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
27a00 20 20 20 20 72 63 20 3d 20 6c 73 6d 43 68 65 63      rc = lsmChec
27a10 6b 70 6f 69 6e 74 44 65 73 65 72 69 61 6c 69 7a  kpointDeserializ
27a20 65 28 70 44 62 2c 20 30 2c 20 70 44 62 2d 3e 61  e(pDb, 0, pDb->a
27a30 53 6e 61 70 73 68 6f 74 2c 20 26 70 44 62 2d 3e  Snapshot, &pDb->
27a40 70 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20 20 20  pClient);.      
27a50 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
27a60 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  LSM_OK ){.      
27a70 20 20 72 63 20 3d 20 6c 73 6d 52 65 73 74 6f 72    rc = lsmRestor
27a80 65 43 75 72 73 6f 72 73 28 70 44 62 29 3b 0a 20  eCursors(pDb);. 
27a90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
27aa0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
27ab0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
27ac0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
27ad0 6c 6c 65 64 20 64 75 72 69 6e 67 20 73 79 73 74  lled during syst
27ae0 65 6d 20 73 68 75 74 64 6f 77 6e 2e 20 54 68 65  em shutdown. The
27af0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a 2a 2a 20   contents of.** 
27b00 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 74 72  any in-memory tr
27b10 65 65 73 20 70 72 65 73 65 6e 74 20 28 6f 6c 64  ees present (old
27b20 20 6f 72 20 63 75 72 72 65 6e 74 29 20 61 72 65   or current) are
27b30 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
27b40 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 6c 73 6d  disk..*/.int lsm
27b50 46 6c 75 73 68 54 72 65 65 54 6f 44 69 73 6b 28  FlushTreeToDisk(
27b60 6c 73 6d 5f 64 62 20 2a 70 44 62 29 7b 0a 20 20  lsm_db *pDb){.  
27b70 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
27b80 6c 73 6d 42 65 67 69 6e 57 6f 72 6b 28 70 44 62  lsmBeginWork(pDb
27b90 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
27ba0 4c 53 4d 5f 4f 4b 20 26 26 20 73 6f 72 74 65 64  LSM_OK && sorted
27bb0 44 62 49 73 46 75 6c 6c 28 70 44 62 29 20 29 7b  DbIsFull(pDb) ){
27bc0 0a 20 20 20 20 72 63 20 3d 20 73 6f 72 74 65 64  .    rc = sorted
27bd0 57 6f 72 6b 28 70 44 62 2c 20 32 35 36 2c 20 70  Work(pDb, 256, p
27be0 44 62 2d 3e 6e 4d 65 72 67 65 2c 20 31 2c 20 30  Db->nMerge, 1, 0
27bf0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
27c00 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
27c10 72 63 20 3d 20 73 6f 72 74 65 64 4e 65 77 54 6f  rc = sortedNewTo
27c20 70 6c 65 76 65 6c 28 70 44 62 2c 20 54 52 45 45  plevel(pDb, TREE
27c30 5f 42 4f 54 48 2c 20 30 29 3b 0a 20 20 7d 0a 0a  _BOTH, 0);.  }..
27c40 20 20 6c 73 6d 46 69 6e 69 73 68 57 6f 72 6b 28    lsmFinishWork(
27c50 70 44 62 2c 20 31 2c 20 26 72 63 29 3b 0a 20 20  pDb, 1, &rc);.  
27c60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27c70 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72  .** Return a str
27c80 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
27c90 6f 6e 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e  on of the segmen
27ca0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
27cb0 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
27cc0 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20  * Space for the 
27cd0 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
27ce0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  is allocated usi
27cf0 6e 67 20 6c 73 6d 4d 61 6c 6c 6f 63 28 29 2c 20  ng lsmMalloc(), 
27d00 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
27d10 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
27d20 6c 6c 65 72 20 75 73 69 6e 67 20 6c 73 6d 46 72  ller using lsmFr
27d30 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
27d40 63 68 61 72 20 2a 73 65 67 54 6f 53 74 72 69 6e  char *segToStrin
27d50 67 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c  g(lsm_env *pEnv,
27d60 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20   Segment *pSeg, 
27d70 69 6e 74 20 6e 4d 69 6e 29 7b 0a 20 20 69 6e 74  int nMin){.  int
27d80 20 6e 53 69 7a 65 20 3d 20 70 53 65 67 2d 3e 6e   nSize = pSeg->n
27d90 53 69 7a 65 3b 0a 20 20 50 67 6e 6f 20 69 52 6f  Size;.  Pgno iRo
27da0 6f 74 20 3d 20 70 53 65 67 2d 3e 69 52 6f 6f 74  ot = pSeg->iRoot
27db0 3b 0a 20 20 50 67 6e 6f 20 69 46 69 72 73 74 20  ;.  Pgno iFirst 
27dc0 3d 20 70 53 65 67 2d 3e 69 46 69 72 73 74 3b 0a  = pSeg->iFirst;.
27dd0 20 20 50 67 6e 6f 20 69 4c 61 73 74 20 3d 20 70    Pgno iLast = p
27de0 53 65 67 2d 3e 69 4c 61 73 74 50 67 3b 0a 20 20  Seg->iLastPg;.  
27df0 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 63 68 61 72  char *z;..  char
27e00 20 2a 7a 31 3b 0a 20 20 63 68 61 72 20 2a 7a 32   *z1;.  char *z2
27e10 3b 0a 20 20 69 6e 74 20 6e 50 61 64 3b 0a 0a 20  ;.  int nPad;.. 
27e20 20 7a 31 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 50   z1 = lsmMallocP
27e30 72 69 6e 74 66 28 70 45 6e 76 2c 20 22 25 64 2e  rintf(pEnv, "%d.
27e40 25 64 22 2c 20 69 46 69 72 73 74 2c 20 69 4c 61  %d", iFirst, iLa
27e50 73 74 29 3b 0a 20 20 69 66 28 20 69 52 6f 6f 74  st);.  if( iRoot
27e60 20 29 7b 0a 20 20 20 20 7a 32 20 3d 20 6c 73 6d   ){.    z2 = lsm
27e70 4d 61 6c 6c 6f 63 50 72 69 6e 74 66 28 70 45 6e  MallocPrintf(pEn
27e80 76 2c 20 22 72 6f 6f 74 3d 25 64 22 2c 20 69 52  v, "root=%d", iR
27e90 6f 6f 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oot);.  }else{. 
27ea0 20 20 20 7a 32 20 3d 20 6c 73 6d 4d 61 6c 6c 6f     z2 = lsmMallo
27eb0 63 50 72 69 6e 74 66 28 70 45 6e 76 2c 20 22 73  cPrintf(pEnv, "s
27ec0 69 7a 65 3d 25 64 22 2c 20 6e 53 69 7a 65 29 3b  ize=%d", nSize);
27ed0 0a 20 20 7d 0a 0a 20 20 6e 50 61 64 20 3d 20 6e  .  }..  nPad = n
27ee0 4d 69 6e 20 2d 20 32 20 2d 20 73 74 72 6c 65 6e  Min - 2 - strlen
27ef0 28 7a 31 29 20 2d 20 31 20 2d 20 73 74 72 6c 65  (z1) - 1 - strle
27f00 6e 28 7a 32 29 3b 0a 20 20 6e 50 61 64 20 3d 20  n(z2);.  nPad = 
27f10 4c 53 4d 5f 4d 41 58 28 30 2c 20 6e 50 61 64 29  LSM_MAX(0, nPad)
27f20 3b 0a 0a 20 20 69 66 28 20 69 52 6f 6f 74 20 29  ;..  if( iRoot )
27f30 7b 0a 20 20 20 20 7a 20 3d 20 6c 73 6d 4d 61 6c  {.    z = lsmMal
27f40 6c 6f 63 50 72 69 6e 74 66 28 70 45 6e 76 2c 20  locPrintf(pEnv, 
27f50 22 2f 25 73 20 25 2a 73 25 73 5c 5c 22 2c 20 7a  "/%s %*s%s\\", z
27f60 31 2c 20 6e 50 61 64 2c 20 22 22 2c 20 7a 32 29  1, nPad, "", z2)
27f70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
27f80 20 3d 20 6c 73 6d 4d 61 6c 6c 6f 63 50 72 69 6e   = lsmMallocPrin
27f90 74 66 28 70 45 6e 76 2c 20 22 7c 25 73 20 25 2a  tf(pEnv, "|%s %*
27fa0 73 25 73 7c 22 2c 20 7a 31 2c 20 6e 50 61 64 2c  s%s|", z1, nPad,
27fb0 20 22 22 2c 20 7a 32 29 3b 0a 20 20 7d 0a 20 20   "", z2);.  }.  
27fc0 6c 73 6d 46 72 65 65 28 70 45 6e 76 2c 20 7a 31  lsmFree(pEnv, z1
27fd0 29 3b 0a 20 20 6c 73 6d 46 72 65 65 28 70 45 6e  );.  lsmFree(pEn
27fe0 76 2c 20 7a 32 29 3b 0a 0a 20 20 72 65 74 75 72  v, z2);..  retur
27ff0 6e 20 7a 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  n z;.}..static i
28000 6e 74 20 66 69 6c 65 54 6f 53 74 72 69 6e 67 28  nt fileToString(
28010 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20  .  lsm_db *pDb, 
28020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28030 20 20 20 2f 2a 20 46 6f 72 20 78 4d 61 6c 6c 6f     /* For xMallo
28040 63 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  c() */.  char *a
28050 42 75 66 2c 20 0a 20 20 69 6e 74 20 6e 42 75 66  Buf, .  int nBuf
28060 2c 20 0a 20 20 69 6e 74 20 6e 4d 69 6e 2c 0a 20  , .  int nMin,. 
28070 20 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 0a 29   Segment *pSeg.)
28080 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  {.  int i = 0;. 
28090 20 69 66 28 20 70 53 65 67 20 29 7b 0a 20 20 20   if( pSeg ){.   
280a0 20 63 68 61 72 20 2a 7a 53 65 67 3b 0a 0a 20 20   char *zSeg;..  
280b0 20 20 7a 53 65 67 20 3d 20 73 65 67 54 6f 53 74    zSeg = segToSt
280c0 72 69 6e 67 28 70 44 62 2d 3e 70 45 6e 76 2c 20  ring(pDb->pEnv, 
280d0 70 53 65 67 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  pSeg, nMin);.   
280e0 20 73 6e 70 72 69 6e 74 66 28 26 61 42 75 66 5b   snprintf(&aBuf[
280f0 69 5d 2c 20 6e 42 75 66 2d 69 2c 20 22 25 73 22  i], nBuf-i, "%s"
28100 2c 20 7a 53 65 67 29 3b 0a 20 20 20 20 69 20 2b  , zSeg);.    i +
28110 3d 20 73 74 72 6c 65 6e 28 26 61 42 75 66 5b 69  = strlen(&aBuf[i
28120 5d 29 3b 0a 20 20 20 20 6c 73 6d 46 72 65 65 28  ]);.    lsmFree(
28130 70 44 62 2d 3e 70 45 6e 76 2c 20 7a 53 65 67 29  pDb->pEnv, zSeg)
28140 3b 0a 0a 23 69 66 64 65 66 20 4c 53 4d 5f 4c 4f  ;..#ifdef LSM_LO
28150 47 5f 46 52 45 45 4c 49 53 54 0a 20 20 20 20 6c  G_FREELIST.    l
28160 73 6d 49 6e 66 6f 41 72 72 61 79 53 74 72 75 63  smInfoArrayStruc
28170 74 75 72 65 28 70 44 62 2c 20 31 2c 20 70 53 65  ture(pDb, 1, pSe
28180 67 2d 3e 69 46 69 72 73 74 2c 20 26 7a 53 65 67  g->iFirst, &zSeg
28190 29 3b 0a 20 20 20 20 73 6e 70 72 69 6e 74 66 28  );.    snprintf(
281a0 26 61 42 75 66 5b 69 5d 2c 20 6e 42 75 66 2d 31  &aBuf[i], nBuf-1
281b0 2c 20 22 20 20 20 20 28 25 73 29 22 2c 20 7a 53  , "    (%s)", zS
281c0 65 67 29 3b 0a 20 20 20 20 69 20 2b 3d 20 73 74  eg);.    i += st
281d0 72 6c 65 6e 28 26 61 42 75 66 5b 69 5d 29 3b 0a  rlen(&aBuf[i]);.
281e0 20 20 20 20 6c 73 6d 46 72 65 65 28 70 44 62 2d      lsmFree(pDb-
281f0 3e 70 45 6e 76 2c 20 7a 53 65 67 29 3b 0a 23 65  >pEnv, zSeg);.#e
28200 6e 64 69 66 0a 20 20 20 20 61 42 75 66 5b 6e 42  ndif.    aBuf[nB
28210 75 66 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  uf] = 0;.  }else
28220 7b 0a 20 20 20 20 61 42 75 66 5b 30 5d 20 3d 20  {.    aBuf[0] = 
28230 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  '\0';.  }..  ret
28240 75 72 6e 20 69 3b 0a 7d 0a 0a 76 6f 69 64 20 73  urn i;.}..void s
28250 6f 72 74 65 64 44 75 6d 70 50 61 67 65 28 6c 73  ortedDumpPage(ls
28260 6d 5f 64 62 20 2a 70 44 62 2c 20 53 65 67 6d 65  m_db *pDb, Segme
28270 6e 74 20 2a 70 52 75 6e 2c 20 50 61 67 65 20 2a  nt *pRun, Page *
28280 70 50 67 2c 20 69 6e 74 20 62 56 61 6c 73 29 7b  pPg, int bVals){
28290 0a 20 20 42 6c 6f 62 20 62 6c 6f 62 20 3d 20 7b  .  Blob blob = {
282a0 30 2c 20 30 2c 20 30 7d 3b 20 20 20 20 20 20 20  0, 0, 0};       
282b0 20 20 2f 2a 20 42 6c 6f 62 20 75 73 65 64 20 66    /* Blob used f
282c0 6f 72 20 6b 65 79 73 20 2a 2f 0a 20 20 4c 73 6d  or keys */.  Lsm
282d0 53 74 72 69 6e 67 20 73 3b 0a 20 20 69 6e 74 20  String s;.  int 
282e0 69 3b 0a 0a 20 20 69 6e 74 20 6e 52 65 63 3b 0a  i;..  int nRec;.
282f0 20 20 69 6e 74 20 69 50 74 72 3b 0a 20 20 69 6e    int iPtr;.  in
28300 74 20 66 6c 61 67 73 3b 0a 20 20 75 38 20 2a 61  t flags;.  u8 *a
28310 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 44 61 74  Data;.  int nDat
28320 61 3b 0a 0a 20 20 61 44 61 74 61 20 3d 20 66 73  a;..  aData = fs
28330 50 61 67 65 44 61 74 61 28 70 50 67 2c 20 26 6e  PageData(pPg, &n
28340 44 61 74 61 29 3b 0a 0a 20 20 6e 52 65 63 20 3d  Data);..  nRec =
28350 20 70 61 67 65 47 65 74 4e 52 65 63 28 61 44 61   pageGetNRec(aDa
28360 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 69 50  ta, nData);.  iP
28370 74 72 20 3d 20 28 69 6e 74 29 70 61 67 65 47 65  tr = (int)pageGe
28380 74 50 74 72 28 61 44 61 74 61 2c 20 6e 44 61 74  tPtr(aData, nDat
28390 61 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20 70 61  a);.  flags = pa
283a0 67 65 47 65 74 46 6c 61 67 73 28 61 44 61 74 61  geGetFlags(aData
283b0 2c 20 6e 44 61 74 61 29 3b 0a 0a 20 20 6c 73 6d  , nData);..  lsm
283c0 53 74 72 69 6e 67 49 6e 69 74 28 26 73 2c 20 70  StringInit(&s, p
283d0 44 62 2d 3e 70 45 6e 76 29 3b 0a 20 20 6c 73 6d  Db->pEnv);.  lsm
283e0 53 74 72 69 6e 67 41 70 70 65 6e 64 66 28 26 73  StringAppendf(&s
283f0 2c 22 6e 43 65 6c 6c 3d 25 64 20 69 50 74 72 3d  ,"nCell=%d iPtr=
28400 25 64 20 66 6c 61 67 73 3d 25 64 20 7b 22 2c 20  %d flags=%d {", 
28410 6e 52 65 63 2c 20 69 50 74 72 2c 20 66 6c 61 67  nRec, iPtr, flag
28420 73 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26  s);.  if( flags&
28430 53 45 47 4d 45 4e 54 5f 42 54 52 45 45 5f 46 4c  SEGMENT_BTREE_FL
28440 41 47 20 29 20 69 50 74 72 20 3d 20 30 3b 0a 0a  AG ) iPtr = 0;..
28450 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
28460 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  c; i++){.    Pag
28470 65 20 2a 70 52 65 66 20 3d 20 30 3b 20 20 20 20  e *pRef = 0;    
28480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
28490 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 52  inter to page iR
284a0 65 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ef */.    int iC
284b0 68 61 72 3b 0a 20 20 20 20 75 38 20 2a 61 4b 65  har;.    u8 *aKe
284c0 79 3b 20 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b  y; int nKey = 0;
284d0 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 2a 2f         /* Key */
284e0 0a 20 20 20 20 75 38 20 2a 61 56 61 6c 20 3d 20  .    u8 *aVal = 
284f0 30 3b 20 69 6e 74 20 6e 56 61 6c 20 3d 20 30 3b  0; int nVal = 0;
28500 20 20 20 2f 2a 20 56 61 6c 75 65 20 2a 2f 0a 20     /* Value */. 
28510 20 20 20 69 6e 74 20 69 54 6f 70 69 63 3b 0a 20     int iTopic;. 
28520 20 20 20 75 38 20 2a 61 43 65 6c 6c 3b 0a 20 20     u8 *aCell;.  
28530 20 20 69 6e 74 20 69 50 67 50 74 72 3b 0a 20 20    int iPgPtr;.  
28540 20 20 69 6e 74 20 65 54 79 70 65 3b 0a 0a 20 20    int eType;..  
28550 20 20 61 43 65 6c 6c 20 3d 20 70 61 67 65 47 65    aCell = pageGe
28560 74 43 65 6c 6c 28 61 44 61 74 61 2c 20 6e 44 61  tCell(aData, nDa
28570 74 61 2c 20 69 29 3b 0a 20 20 20 20 65 54 79 70  ta, i);.    eTyp
28580 65 20 3d 20 2a 61 43 65 6c 6c 2b 2b 3b 0a 20 20  e = *aCell++;.  
28590 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
285a0 20 26 20 53 45 47 4d 45 4e 54 5f 42 54 52 45 45   & SEGMENT_BTREE
285b0 5f 46 4c 41 47 29 20 7c 7c 20 65 54 79 70 65 21  _FLAG) || eType!
285c0 3d 30 20 29 3b 0a 20 20 20 20 61 43 65 6c 6c 20  =0 );.    aCell 
285d0 2b 3d 20 6c 73 6d 56 61 72 69 6e 74 47 65 74 33  += lsmVarintGet3
285e0 32 28 61 43 65 6c 6c 2c 20 26 69 50 67 50 74 72  2(aCell, &iPgPtr
285f0 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70  );..    if( eTyp
28600 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 50 67  e==0 ){.      Pg
28610 6e 6f 20 69 52 65 66 3b 20 20 20 20 20 20 20 20  no iRef;        
28620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
28630 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
28640 72 65 6e 63 65 64 20 70 61 67 65 20 2a 2f 0a 20  renced page */. 
28650 20 20 20 20 20 61 43 65 6c 6c 20 2b 3d 20 6c 73       aCell += ls
28660 6d 56 61 72 69 6e 74 47 65 74 36 34 28 61 43 65  mVarintGet64(aCe
28670 6c 6c 2c 20 26 69 52 65 66 29 3b 0a 20 20 20 20  ll, &iRef);.    
28680 20 20 6c 73 6d 46 73 44 62 50 61 67 65 47 65 74    lsmFsDbPageGet
28690 28 70 44 62 2d 3e 70 46 53 2c 20 70 52 75 6e 2c  (pDb->pFS, pRun,
286a0 20 69 52 65 66 2c 20 26 70 52 65 66 29 3b 0a 20   iRef, &pRef);. 
286b0 20 20 20 20 20 61 4b 65 79 20 3d 20 70 61 67 65       aKey = page
286c0 47 65 74 4b 65 79 28 70 52 75 6e 2c 20 70 52 65  GetKey(pRun, pRe
286d0 66 2c 20 30 2c 20 26 69 54 6f 70 69 63 2c 20 26  f, 0, &iTopic, &
286e0 6e 4b 65 79 2c 20 26 62 6c 6f 62 29 3b 0a 20 20  nKey, &blob);.  
286f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
28700 43 65 6c 6c 20 2b 3d 20 6c 73 6d 56 61 72 69 6e  Cell += lsmVarin
28710 74 47 65 74 33 32 28 61 43 65 6c 6c 2c 20 26 6e  tGet32(aCell, &n
28720 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
28730 72 74 49 73 57 72 69 74 65 28 65 54 79 70 65 29  rtIsWrite(eType)
28740 20 29 20 61 43 65 6c 6c 20 2b 3d 20 6c 73 6d 56   ) aCell += lsmV
28750 61 72 69 6e 74 47 65 74 33 32 28 61 43 65 6c 6c  arintGet32(aCell
28760 2c 20 26 6e 56 61 6c 29 3b 0a 20 20 20 20 20 20  , &nVal);.      
28770 73 6f 72 74 65 64 52 65 61 64 44 61 74 61 28 30  sortedReadData(0
28780 2c 20 70 50 67 2c 20 28 61 43 65 6c 6c 2d 61 44  , pPg, (aCell-aD
28790 61 74 61 29 2c 20 6e 4b 65 79 2b 6e 56 61 6c 2c  ata), nKey+nVal,
287a0 20 28 76 6f 69 64 20 2a 2a 29 26 61 4b 65 79 2c   (void **)&aKey,
287b0 20 26 62 6c 6f 62 29 3b 0a 20 20 20 20 20 20 61   &blob);.      a
287c0 56 61 6c 20 3d 20 26 61 4b 65 79 5b 6e 4b 65 79  Val = &aKey[nKey
287d0 5d 3b 0a 20 20 20 20 20 20 69 54 6f 70 69 63 20  ];.      iTopic 
287e0 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 7d 0a 0a  = eType;.    }..
287f0 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70      lsmStringApp
28800 65 6e 64 66 28 26 73 2c 20 22 25 73 25 32 58 3a  endf(&s, "%s%2X:
28810 22 2c 20 28 69 3d 3d 30 3f 22 22 3a 22 20 22 29  ", (i==0?"":" ")
28820 2c 20 69 54 6f 70 69 63 29 3b 0a 20 20 20 20 66  , iTopic);.    f
28830 6f 72 28 69 43 68 61 72 3d 30 3b 20 69 43 68 61  or(iChar=0; iCha
28840 72 3c 6e 4b 65 79 3b 20 69 43 68 61 72 2b 2b 29  r<nKey; iChar++)
28850 7b 0a 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e  {.      lsmStrin
28860 67 41 70 70 65 6e 64 66 28 26 73 2c 20 22 25 63  gAppendf(&s, "%c
28870 22 2c 20 69 73 61 6c 6e 75 6d 28 61 4b 65 79 5b  ", isalnum(aKey[
28880 69 43 68 61 72 5d 29 20 3f 20 61 4b 65 79 5b 69  iChar]) ? aKey[i
28890 43 68 61 72 5d 20 3a 20 27 2e 27 29 3b 0a 20 20  Char] : '.');.  
288a0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 56 61 6c    }.    if( nVal
288b0 3e 30 20 26 26 20 62 56 61 6c 73 20 29 7b 0a 20  >0 && bVals ){. 
288c0 20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70       lsmStringAp
288d0 70 65 6e 64 66 28 26 73 2c 20 22 23 23 22 29 3b  pendf(&s, "##");
288e0 0a 20 20 20 20 20 20 66 6f 72 28 69 43 68 61 72  .      for(iChar
288f0 3d 30 3b 20 69 43 68 61 72 3c 6e 56 61 6c 3b 20  =0; iChar<nVal; 
28900 69 43 68 61 72 2b 2b 29 7b 0a 20 20 20 20 20 20  iChar++){.      
28910 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70 65 6e    lsmStringAppen
28920 64 66 28 26 73 2c 20 22 25 63 22 2c 20 69 73 61  df(&s, "%c", isa
28930 6c 6e 75 6d 28 61 56 61 6c 5b 69 43 68 61 72 5d  lnum(aVal[iChar]
28940 29 20 3f 20 61 56 61 6c 5b 69 43 68 61 72 5d 20  ) ? aVal[iChar] 
28950 3a 20 27 2e 27 29 3b 0a 20 20 20 20 20 20 7d 0a  : '.');.      }.
28960 20 20 20 20 7d 0a 0a 20 20 20 20 6c 73 6d 53 74      }..    lsmSt
28970 72 69 6e 67 41 70 70 65 6e 64 66 28 26 73 2c 20  ringAppendf(&s, 
28980 22 20 25 64 22 2c 20 69 50 67 50 74 72 2b 69 50  " %d", iPgPtr+iP
28990 74 72 29 3b 0a 20 20 20 20 6c 73 6d 46 73 50 61  tr);.    lsmFsPa
289a0 67 65 52 65 6c 65 61 73 65 28 70 52 65 66 29 3b  geRelease(pRef);
289b0 0a 20 20 7d 0a 20 20 6c 73 6d 53 74 72 69 6e 67  .  }.  lsmString
289c0 41 70 70 65 6e 64 28 26 73 2c 20 22 7d 22 2c 20  Append(&s, "}", 
289d0 31 29 3b 0a 0a 20 20 6c 73 6d 4c 6f 67 4d 65 73  1);..  lsmLogMes
289e0 73 61 67 65 28 70 44 62 2c 20 4c 53 4d 5f 4f 4b  sage(pDb, LSM_OK
289f0 2c 20 22 20 20 20 20 20 20 50 61 67 65 20 25 64  , "      Page %d
28a00 3a 20 25 73 22 2c 20 6c 73 6d 46 73 50 61 67 65  : %s", lsmFsPage
28a10 4e 75 6d 62 65 72 28 70 50 67 29 2c 20 73 2e 7a  Number(pPg), s.z
28a20 29 3b 0a 20 20 6c 73 6d 53 74 72 69 6e 67 43 6c  );.  lsmStringCl
28a30 65 61 72 28 26 73 29 3b 0a 0a 20 20 73 6f 72 74  ear(&s);..  sort
28a40 65 64 42 6c 6f 62 46 72 65 65 28 26 62 6c 6f 62  edBlobFree(&blob
28a50 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
28a60 64 20 69 6e 66 6f 43 65 6c 6c 44 75 6d 70 28 0a  d infoCellDump(.
28a70 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 20    lsm_db *pDb,  
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a90 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
28aa0 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67 6d 65 6e  ndle */.  Segmen
28ab0 74 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20  t *pSeg,        
28ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
28ad0 6d 65 6e 74 20 70 61 67 65 20 62 65 6c 6f 6e 67  ment page belong
28ae0 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 62 49  s to */.  int bI
28af0 6e 64 69 72 65 63 74 2c 20 20 20 20 20 20 20 20  ndirect,        
28b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
28b10 65 20 74 6f 20 66 6f 6c 6c 6f 77 20 69 6e 64 69  e to follow indi
28b20 72 65 63 74 20 72 65 66 73 20 2a 2f 0a 20 20 50  rect refs */.  P
28b30 61 67 65 20 2a 70 50 67 2c 0a 20 20 69 6e 74 20  age *pPg,.  int 
28b40 69 43 65 6c 6c 2c 0a 20 20 69 6e 74 20 2a 70 65  iCell,.  int *pe
28b50 54 79 70 65 2c 0a 20 20 69 6e 74 20 2a 70 69 50  Type,.  int *piP
28b60 67 50 74 72 2c 0a 20 20 75 38 20 2a 2a 70 61 4b  gPtr,.  u8 **paK
28b70 65 79 2c 20 69 6e 74 20 2a 70 6e 4b 65 79 2c 0a  ey, int *pnKey,.
28b80 20 20 75 38 20 2a 2a 70 61 56 61 6c 2c 20 69 6e    u8 **paVal, in
28b90 74 20 2a 70 6e 56 61 6c 2c 0a 20 20 42 6c 6f 62  t *pnVal,.  Blob
28ba0 20 2a 70 42 6c 6f 62 0a 29 7b 0a 20 20 75 38 20   *pBlob.){.  u8 
28bb0 2a 61 44 61 74 61 3b 20 69 6e 74 20 6e 44 61 74  *aData; int nDat
28bc0 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
28bd0 50 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  Page data */.  u
28be0 38 20 2a 61 4b 65 79 3b 20 69 6e 74 20 6e 4b 65  8 *aKey; int nKe
28bf0 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  y = 0;         /
28c00 2a 20 4b 65 79 20 2a 2f 0a 20 20 75 38 20 2a 61  * Key */.  u8 *a
28c10 56 61 6c 20 3d 20 30 3b 20 69 6e 74 20 6e 56 61  Val = 0; int nVa
28c20 6c 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 56 61  l = 0;     /* Va
28c30 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  lue */.  int eTy
28c40 70 65 3b 0a 20 20 69 6e 74 20 69 50 67 50 74 72  pe;.  int iPgPtr
28c50 3b 0a 20 20 50 61 67 65 20 2a 70 52 65 66 20 3d  ;.  Page *pRef =
28c60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
28c70 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
28c80 6f 20 70 61 67 65 20 69 52 65 66 20 2a 2f 0a 20  o page iRef */. 
28c90 20 75 38 20 2a 61 43 65 6c 6c 3b 0a 0a 20 20 61   u8 *aCell;..  a
28ca0 44 61 74 61 20 3d 20 66 73 50 61 67 65 44 61 74  Data = fsPageDat
28cb0 61 28 70 50 67 2c 20 26 6e 44 61 74 61 29 3b 0a  a(pPg, &nData);.
28cc0 0a 20 20 61 43 65 6c 6c 20 3d 20 70 61 67 65 47  .  aCell = pageG
28cd0 65 74 43 65 6c 6c 28 61 44 61 74 61 2c 20 6e 44  etCell(aData, nD
28ce0 61 74 61 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 65  ata, iCell);.  e
28cf0 54 79 70 65 20 3d 20 2a 61 43 65 6c 6c 2b 2b 3b  Type = *aCell++;
28d00 0a 20 20 61 43 65 6c 6c 20 2b 3d 20 6c 73 6d 56  .  aCell += lsmV
28d10 61 72 69 6e 74 47 65 74 33 32 28 61 43 65 6c 6c  arintGet32(aCell
28d20 2c 20 26 69 50 67 50 74 72 29 3b 0a 0a 20 20 69  , &iPgPtr);..  i
28d30 66 28 20 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20  f( eType==0 ){. 
28d40 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20     int dummy;.  
28d50 20 20 50 67 6e 6f 20 69 52 65 66 3b 20 20 20 20    Pgno iRef;    
28d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28d70 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
28d80 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 20  referenced page 
28d90 2a 2f 0a 20 20 20 20 61 43 65 6c 6c 20 2b 3d 20  */.    aCell += 
28da0 6c 73 6d 56 61 72 69 6e 74 47 65 74 36 34 28 61  lsmVarintGet64(a
28db0 43 65 6c 6c 2c 20 26 69 52 65 66 29 3b 0a 20 20  Cell, &iRef);.  
28dc0 20 20 69 66 28 20 62 49 6e 64 69 72 65 63 74 20    if( bIndirect 
28dd0 29 7b 0a 20 20 20 20 20 20 6c 73 6d 46 73 44 62  ){.      lsmFsDb
28de0 50 61 67 65 47 65 74 28 70 44 62 2d 3e 70 46 53  PageGet(pDb->pFS
28df0 2c 20 70 53 65 67 2c 20 69 52 65 66 2c 20 26 70  , pSeg, iRef, &p
28e00 52 65 66 29 3b 0a 20 20 20 20 20 20 70 61 67 65  Ref);.      page
28e10 47 65 74 4b 65 79 43 6f 70 79 28 70 44 62 2d 3e  GetKeyCopy(pDb->
28e20 70 45 6e 76 2c 20 70 53 65 67 2c 20 70 52 65 66  pEnv, pSeg, pRef
28e30 2c 20 30 2c 20 26 64 75 6d 6d 79 2c 20 70 42 6c  , 0, &dummy, pBl
28e40 6f 62 29 3b 0a 20 20 20 20 20 20 61 4b 65 79 20  ob);.      aKey 
28e50 3d 20 28 75 38 20 2a 29 70 42 6c 6f 62 2d 3e 70  = (u8 *)pBlob->p
28e60 44 61 74 61 3b 0a 20 20 20 20 20 20 6e 4b 65 79  Data;.      nKey
28e70 20 3d 20 70 42 6c 6f 62 2d 3e 6e 44 61 74 61 3b   = pBlob->nData;
28e80 0a 20 20 20 20 20 20 6c 73 6d 46 73 50 61 67 65  .      lsmFsPage
28e90 52 65 6c 65 61 73 65 28 70 52 65 66 29 3b 0a 20  Release(pRef);. 
28ea0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28eb0 61 4b 65 79 20 3d 20 28 75 38 20 2a 29 22 3c 69  aKey = (u8 *)"<i
28ec0 6e 64 69 72 65 63 74 3e 22 3b 0a 20 20 20 20 20  ndirect>";.     
28ed0 20 6e 4b 65 79 20 3d 20 31 31 3b 0a 20 20 20 20   nKey = 11;.    
28ee0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
28ef0 43 65 6c 6c 20 2b 3d 20 6c 73 6d 56 61 72 69 6e  Cell += lsmVarin
28f00 74 47 65 74 33 32 28 61 43 65 6c 6c 2c 20 26 6e  tGet32(aCell, &n
28f10 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 72 74  Key);.    if( rt
28f20 49 73 57 72 69 74 65 28 65 54 79 70 65 29 20 29  IsWrite(eType) )
28f30 20 61 43 65 6c 6c 20 2b 3d 20 6c 73 6d 56 61 72   aCell += lsmVar
28f40 69 6e 74 47 65 74 33 32 28 61 43 65 6c 6c 2c 20  intGet32(aCell, 
28f50 26 6e 56 61 6c 29 3b 0a 20 20 20 20 73 6f 72 74  &nVal);.    sort
28f60 65 64 52 65 61 64 44 61 74 61 28 70 53 65 67 2c  edReadData(pSeg,
28f70 20 70 50 67 2c 20 28 61 43 65 6c 6c 2d 61 44 61   pPg, (aCell-aDa
28f80 74 61 29 2c 20 6e 4b 65 79 2b 6e 56 61 6c 2c 20  ta), nKey+nVal, 
28f90 28 76 6f 69 64 20 2a 2a 29 26 61 4b 65 79 2c 20  (void **)&aKey, 
28fa0 70 42 6c 6f 62 29 3b 0a 20 20 20 20 61 56 61 6c  pBlob);.    aVal
28fb0 20 3d 20 26 61 4b 65 79 5b 6e 4b 65 79 5d 3b 0a   = &aKey[nKey];.
28fc0 20 20 7d 0a 0a 20 20 69 66 28 20 70 65 54 79 70    }..  if( peTyp
28fd0 65 20 29 20 2a 70 65 54 79 70 65 20 3d 20 65 54  e ) *peType = eT
28fe0 79 70 65 3b 0a 20 20 69 66 28 20 70 69 50 67 50  ype;.  if( piPgP
28ff0 74 72 20 29 20 2a 70 69 50 67 50 74 72 20 3d 20  tr ) *piPgPtr = 
29000 69 50 67 50 74 72 3b 0a 20 20 69 66 28 20 70 61  iPgPtr;.  if( pa
29010 4b 65 79 20 29 20 2a 70 61 4b 65 79 20 3d 20 61  Key ) *paKey = a
29020 4b 65 79 3b 0a 20 20 69 66 28 20 70 61 56 61 6c  Key;.  if( paVal
29030 20 29 20 2a 70 61 56 61 6c 20 3d 20 61 56 61 6c   ) *paVal = aVal
29040 3b 0a 20 20 69 66 28 20 70 6e 4b 65 79 20 29 20  ;.  if( pnKey ) 
29050 2a 70 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b 0a 20  *pnKey = nKey;. 
29060 20 69 66 28 20 70 6e 56 61 6c 20 29 20 2a 70 6e   if( pnVal ) *pn
29070 56 61 6c 20 3d 20 6e 56 61 6c 3b 0a 7d 0a 0a 73  Val = nVal;.}..s
29080 74 61 74 69 63 20 69 6e 74 20 69 6e 66 6f 41 70  tatic int infoAp
29090 70 65 6e 64 42 6c 6f 62 28 4c 73 6d 53 74 72 69  pendBlob(LsmStri
290a0 6e 67 20 2a 70 53 74 72 2c 20 69 6e 74 20 62 48  ng *pStr, int bH
290b0 65 78 2c 20 75 38 20 2a 7a 2c 20 69 6e 74 20 6e  ex, u8 *z, int n
290c0 29 7b 0a 20 20 69 6e 74 20 69 43 68 61 72 3b 0a  ){.  int iChar;.
290d0 20 20 66 6f 72 28 69 43 68 61 72 3d 30 3b 20 69    for(iChar=0; i
290e0 43 68 61 72 3c 6e 3b 20 69 43 68 61 72 2b 2b 29  Char<n; iChar++)
290f0 7b 0a 20 20 20 20 69 66 28 20 62 48 65 78 20 29  {.    if( bHex )
29100 7b 0a 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e  {.      lsmStrin
29110 67 41 70 70 65 6e 64 66 28 70 53 74 72 2c 20 22  gAppendf(pStr, "
29120 25 30 32 58 22 2c 20 7a 5b 69 43 68 61 72 5d 29  %02X", z[iChar])
29130 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29140 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70 65     lsmStringAppe
29150 6e 64 66 28 70 53 74 72 2c 20 22 25 63 22 2c 20  ndf(pStr, "%c", 
29160 69 73 61 6c 6e 75 6d 28 7a 5b 69 43 68 61 72 5d  isalnum(z[iChar]
29170 29 20 3f 7a 5b 69 43 68 61 72 5d 20 3a 20 27 2e  ) ?z[iChar] : '.
29180 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ');.    }.  }.  
29190 72 65 74 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d  return LSM_OK;.}
291a0 0a 0a 23 64 65 66 69 6e 65 20 49 4e 46 4f 5f 50  ..#define INFO_P
291b0 41 47 45 5f 44 55 4d 50 5f 44 41 54 41 20 20 20  AGE_DUMP_DATA   
291c0 20 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 49    0x01.#define I
291d0 4e 46 4f 5f 50 41 47 45 5f 44 55 4d 50 5f 56 41  NFO_PAGE_DUMP_VA
291e0 4c 55 45 53 20 20 20 30 78 30 32 0a 23 64 65 66  LUES   0x02.#def
291f0 69 6e 65 20 49 4e 46 4f 5f 50 41 47 45 5f 44 55  ine INFO_PAGE_DU
29200 4d 50 5f 48 45 58 20 20 20 20 20 20 30 78 30 34  MP_HEX      0x04
29210 0a 23 64 65 66 69 6e 65 20 49 4e 46 4f 5f 50 41  .#define INFO_PA
29220 47 45 5f 44 55 4d 50 5f 49 4e 44 49 52 45 43 54  GE_DUMP_INDIRECT
29230 20 30 78 30 38 0a 0a 73 74 61 74 69 63 20 69 6e   0x08..static in
29240 74 20 69 6e 66 6f 50 61 67 65 44 75 6d 70 28 0a  t infoPageDump(.
29250 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62 2c 20 20    lsm_db *pDb,  
29260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29270 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
29280 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ndle */.  Pgno i
29290 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
292a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
292b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
292c0 20 74 6f 20 64 75 6d 70 20 2a 2f 0a 20 20 69 6e   to dump */.  in
292d0 74 20 66 6c 61 67 73 2c 0a 20 20 63 68 61 72 20  t flags,.  char 
292e0 2a 2a 70 7a 4f 75 74 20 20 20 20 20 20 20 20 20  **pzOut         
292f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
29300 54 3a 20 6c 73 6d 4d 61 6c 6c 6f 63 27 64 20 73  T: lsmMalloc'd s
29310 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
29320 74 20 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20  t rc = LSM_OK;  
29330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29340 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
29350 20 20 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b    Page *pPg = 0;
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29370 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
29380 70 61 67 65 20 69 50 67 20 2a 2f 0a 20 20 69 6e  page iPg */.  in
29390 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
293a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
293b0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
293c0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 65  /.  const int pe
293d0 72 4c 69 6e 65 20 3d 20 31 36 3b 20 20 20 20 20  rLine = 16;     
293e0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 70 65 72      /* Bytes per
293f0 20 6c 69 6e 65 20 69 6e 20 74 68 65 20 72 61 77   line in the raw
29400 20 68 65 78 20 64 75 6d 70 20 2a 2f 0a 20 20 53   hex dump */.  S
29410 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 30  egment *pSeg = 0
29420 3b 0a 20 20 53 6e 61 70 73 68 6f 74 20 2a 70 53  ;.  Snapshot *pS
29430 6e 61 70 3b 0a 0a 20 20 69 6e 74 20 62 56 61 6c  nap;..  int bVal
29440 75 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 49  ues = (flags & I
29450 4e 46 4f 5f 50 41 47 45 5f 44 55 4d 50 5f 56 41  NFO_PAGE_DUMP_VA
29460 4c 55 45 53 29 3b 0a 20 20 69 6e 74 20 62 48 65  LUES);.  int bHe
29470 78 20 3d 20 28 66 6c 61 67 73 20 26 20 49 4e 46  x = (flags & INF
29480 4f 5f 50 41 47 45 5f 44 55 4d 50 5f 48 45 58 29  O_PAGE_DUMP_HEX)
29490 3b 0a 20 20 69 6e 74 20 62 44 61 74 61 20 3d 20  ;.  int bData = 
294a0 28 66 6c 61 67 73 20 26 20 49 4e 46 4f 5f 50 41  (flags & INFO_PA
294b0 47 45 5f 44 55 4d 50 5f 44 41 54 41 29 3b 0a 20  GE_DUMP_DATA);. 
294c0 20 69 6e 74 20 62 49 6e 64 69 72 65 63 74 20 3d   int bIndirect =
294d0 20 28 66 6c 61 67 73 20 26 20 49 4e 46 4f 5f 50   (flags & INFO_P
294e0 41 47 45 5f 44 55 4d 50 5f 49 4e 44 49 52 45 43  AGE_DUMP_INDIREC
294f0 54 29 3b 0a 0a 20 20 2a 70 7a 4f 75 74 20 3d 20  T);..  *pzOut = 
29500 30 3b 0a 20 20 69 66 28 20 69 50 67 3d 3d 30 20  0;.  if( iPg==0 
29510 29 20 72 65 74 75 72 6e 20 4c 53 4d 5f 45 52 52  ) return LSM_ERR
29520 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OR;..  assert( p
29530 44 62 2d 3e 70 43 6c 69 65 6e 74 20 7c 7c 20 70  Db->pClient || p
29540 44 62 2d 3e 70 57 6f 72 6b 65 72 20 29 3b 0a 20  Db->pWorker );. 
29550 20 70 53 6e 61 70 20 3d 20 70 44 62 2d 3e 70 43   pSnap = pDb->pC
29560 6c 69 65 6e 74 3b 0a 20 20 69 66 28 20 70 53 6e  lient;.  if( pSn
29570 61 70 3d 3d 30 20 29 20 70 53 6e 61 70 20 3d 20  ap==0 ) pSnap = 
29580 70 44 62 2d 3e 70 57 6f 72 6b 65 72 3b 0a 20 20  pDb->pWorker;.  
29590 69 66 28 20 70 53 6e 61 70 2d 3e 72 65 64 69 72  if( pSnap->redir
295a0 65 63 74 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 4c  ect.n>0 ){.    L
295b0 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20  evel *pLvl;.    
295c0 69 6e 74 20 62 55 73 65 20 3d 20 30 3b 0a 20 20  int bUse = 0;.  
295d0 20 20 66 6f 72 28 70 4c 76 6c 3d 70 53 6e 61 70    for(pLvl=pSnap
295e0 2d 3e 70 4c 65 76 65 6c 3b 20 70 4c 76 6c 2d 3e  ->pLevel; pLvl->
295f0 70 4e 65 78 74 3b 20 70 4c 76 6c 3d 70 4c 76 6c  pNext; pLvl=pLvl
29600 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 70 53  ->pNext);.    pS
29610 65 67 20 3d 20 28 70 4c 76 6c 2d 3e 6e 52 69 67  eg = (pLvl->nRig
29620 68 74 3d 3d 30 20 3f 20 26 70 4c 76 6c 2d 3e 6c  ht==0 ? &pLvl->l
29630 68 73 20 3a 20 26 70 4c 76 6c 2d 3e 61 52 68 73  hs : &pLvl->aRhs
29640 5b 70 4c 76 6c 2d 3e 6e 52 69 67 68 74 2d 31 5d  [pLvl->nRight-1]
29650 29 3b 0a 20 20 20 20 72 63 20 3d 20 6c 73 6d 46  );.    rc = lsmF
29660 73 53 65 67 6d 65 6e 74 43 6f 6e 74 61 69 6e 73  sSegmentContains
29670 50 67 28 70 44 62 2d 3e 70 46 53 2c 20 70 53 65  Pg(pDb->pFS, pSe
29680 67 2c 20 69 50 67 2c 20 26 62 55 73 65 29 3b 0a  g, iPg, &bUse);.
29690 20 20 20 20 69 66 28 20 62 55 73 65 3d 3d 30 20      if( bUse==0 
296a0 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20  ){.      pSeg = 
296b0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
296c0 2f 2a 20 69 50 67 20 69 73 20 61 20 72 65 61 6c  /* iPg is a real
296d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6e 6f   page number (no
296e0 74 20 73 75 62 6a 65 63 74 20 74 6f 20 72 65 64  t subject to red
296f0 69 72 65 63 74 69 6f 6e 29 2e 20 53 6f 20 69 74  irection). So it
29700 20 69 73 20 73 61 66 65 20 0a 20 20 2a 2a 20 74   is safe .  ** t
29710 6f 20 70 61 73 73 20 61 20 4e 55 4c 4c 20 69 6e  o pass a NULL in
29720 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 73 65   place of the se
29730 67 6d 65 6e 74 20 70 6f 69 6e 74 65 72 20 61 73  gment pointer as
29740 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
29750 6d 65 6e 74 0a 20 20 2a 2a 20 74 6f 20 6c 73 6d  ment.  ** to lsm
29760 46 73 44 62 50 61 67 65 47 65 74 28 29 20 68 65  FsDbPageGet() he
29770 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  re.  */.  if( rc
29780 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
29790 72 63 20 3d 20 6c 73 6d 46 73 44 62 50 61 67 65  rc = lsmFsDbPage
297a0 47 65 74 28 70 44 62 2d 3e 70 46 53 2c 20 30 2c  Get(pDb->pFS, 0,
297b0 20 69 50 67 2c 20 26 70 50 67 29 3b 0a 20 20 7d   iPg, &pPg);.  }
297c0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53 4d 5f  ..  if( rc==LSM_
297d0 4f 4b 20 29 7b 0a 20 20 20 20 42 6c 6f 62 20 62  OK ){.    Blob b
297e0 6c 6f 62 20 3d 20 7b 30 2c 20 30 2c 20 30 2c 20  lob = {0, 0, 0, 
297f0 30 7d 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79  0};.    int nKey
29800 57 69 64 74 68 20 3d 20 30 3b 0a 20 20 20 20 4c  Width = 0;.    L
29810 73 6d 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  smString str;.  
29820 20 20 69 6e 74 20 6e 52 65 63 3b 0a 20 20 20 20    int nRec;.    
29830 69 6e 74 20 69 50 74 72 3b 0a 20 20 20 20 69 6e  int iPtr;.    in
29840 74 20 66 6c 61 67 73 32 3b 0a 20 20 20 20 69 6e  t flags2;.    in
29850 74 20 69 43 65 6c 6c 3b 0a 20 20 20 20 75 38 20  t iCell;.    u8 
29860 2a 61 44 61 74 61 3b 20 69 6e 74 20 6e 44 61 74  *aData; int nDat
29870 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  a;         /* Pa
29880 67 65 20 64 61 74 61 20 61 6e 64 20 73 69 7a 65  ge data and size
29890 20 74 68 65 72 65 6f 66 20 2a 2f 0a 0a 20 20 20   thereof */..   
298a0 20 61 44 61 74 61 20 3d 20 66 73 50 61 67 65 44   aData = fsPageD
298b0 61 74 61 28 70 50 67 2c 20 26 6e 44 61 74 61 29  ata(pPg, &nData)
298c0 3b 0a 20 20 20 20 6e 52 65 63 20 3d 20 70 61 67  ;.    nRec = pag
298d0 65 47 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20  eGetNRec(aData, 
298e0 6e 44 61 74 61 29 3b 0a 20 20 20 20 69 50 74 72  nData);.    iPtr
298f0 20 3d 20 28 69 6e 74 29 70 61 67 65 47 65 74 50   = (int)pageGetP
29900 74 72 28 61 44 61 74 61 2c 20 6e 44 61 74 61 29  tr(aData, nData)
29910 3b 0a 20 20 20 20 66 6c 61 67 73 32 20 3d 20 70  ;.    flags2 = p
29920 61 67 65 47 65 74 46 6c 61 67 73 28 61 44 61 74  ageGetFlags(aDat
29930 61 2c 20 6e 44 61 74 61 29 3b 0a 0a 20 20 20 20  a, nData);..    
29940 6c 73 6d 53 74 72 69 6e 67 49 6e 69 74 28 26 73  lsmStringInit(&s
29950 74 72 2c 20 70 44 62 2d 3e 70 45 6e 76 29 3b 0a  tr, pDb->pEnv);.
29960 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70      lsmStringApp
29970 65 6e 64 66 28 26 73 74 72 2c 20 22 50 61 67 65  endf(&str, "Page
29980 20 3a 20 25 6c 6c 64 20 20 28 25 64 20 62 79 74   : %lld  (%d byt
29990 65 73 29 5c 6e 22 2c 20 69 50 67 2c 20 6e 44 61  es)\n", iPg, nDa
299a0 74 61 29 3b 0a 20 20 20 20 6c 73 6d 53 74 72 69  ta);.    lsmStri
299b0 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c 20  ngAppendf(&str, 
299c0 22 6e 52 65 63 20 3a 20 25 64 5c 6e 22 2c 20 6e  "nRec : %d\n", n
299d0 52 65 63 29 3b 0a 20 20 20 20 6c 73 6d 53 74 72  Rec);.    lsmStr
299e0 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c  ingAppendf(&str,
299f0 20 22 69 50 74 72 20 3a 20 25 64 5c 6e 22 2c 20   "iPtr : %d\n", 
29a00 69 50 74 72 29 3b 0a 20 20 20 20 6c 73 6d 53 74  iPtr);.    lsmSt
29a10 72 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72  ringAppendf(&str
29a20 2c 20 22 66 6c 61 67 73 3a 20 25 30 34 78 5c 6e  , "flags: %04x\n
29a30 22 2c 20 66 6c 61 67 73 32 29 3b 0a 20 20 20 20  ", flags2);.    
29a40 6c 73 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66  lsmStringAppendf
29a50 28 26 73 74 72 2c 20 22 5c 6e 22 29 3b 0a 0a 20  (&str, "\n");.. 
29a60 20 20 20 66 6f 72 28 69 43 65 6c 6c 3d 30 3b 20     for(iCell=0; 
29a70 69 43 65 6c 6c 3c 6e 52 65 63 3b 20 69 43 65 6c  iCell<nRec; iCel
29a80 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  l++){.      int 
29a90 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 66 6f  nKey;.      info
29aa0 43 65 6c 6c 44 75 6d 70 28 0a 20 20 20 20 20 20  CellDump(.      
29ab0 20 20 20 20 70 44 62 2c 20 70 53 65 67 2c 20 62      pDb, pSeg, b
29ac0 49 6e 64 69 72 65 63 74 2c 20 70 50 67 2c 20 69  Indirect, pPg, i
29ad0 43 65 6c 6c 2c 20 30 2c 20 30 2c 20 30 2c 20 26  Cell, 0, 0, 0, &
29ae0 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 26 62 6c 6f  nKey, 0, 0, &blo
29af0 62 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  b.      );.     
29b00 20 69 66 28 20 6e 4b 65 79 3e 6e 4b 65 79 57 69   if( nKey>nKeyWi
29b10 64 74 68 20 29 20 6e 4b 65 79 57 69 64 74 68 20  dth ) nKeyWidth 
29b20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  = nKey;.    }.  
29b30 20 20 69 66 28 20 62 48 65 78 20 29 20 6e 4b 65    if( bHex ) nKe
29b40 79 57 69 64 74 68 20 3d 20 6e 4b 65 79 57 69 64  yWidth = nKeyWid
29b50 74 68 20 2a 20 32 3b 0a 0a 20 20 20 20 66 6f 72  th * 2;..    for
29b60 28 69 43 65 6c 6c 3d 30 3b 20 69 43 65 6c 6c 3c  (iCell=0; iCell<
29b70 6e 52 65 63 3b 20 69 43 65 6c 6c 2b 2b 29 7b 0a  nRec; iCell++){.
29b80 20 20 20 20 20 20 75 38 20 2a 61 4b 65 79 3b 20        u8 *aKey; 
29b90 69 6e 74 20 6e 4b 65 79 20 3d 20 30 3b 20 20 20  int nKey = 0;   
29ba0 20 20 20 20 2f 2a 20 4b 65 79 20 2a 2f 0a 20 20      /* Key */.  
29bb0 20 20 20 20 75 38 20 2a 61 56 61 6c 3b 20 69 6e      u8 *aVal; in
29bc0 74 20 6e 56 61 6c 20 3d 20 30 3b 20 20 20 20 20  t nVal = 0;     
29bd0 20 20 2f 2a 20 56 61 6c 75 65 20 2a 2f 0a 20 20    /* Value */.  
29be0 20 20 20 20 69 6e 74 20 69 50 67 50 74 72 3b 0a      int iPgPtr;.
29bf0 20 20 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b        int eType;
29c00 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 41 62 73  .      Pgno iAbs
29c10 50 74 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20  Ptr;.      char 
29c20 7a 46 6c 61 67 73 5b 38 5d 3b 0a 0a 20 20 20 20  zFlags[8];..    
29c30 20 20 69 6e 66 6f 43 65 6c 6c 44 75 6d 70 28 70    infoCellDump(p
29c40 44 62 2c 20 70 53 65 67 2c 20 62 49 6e 64 69 72  Db, pSeg, bIndir
29c50 65 63 74 2c 20 70 50 67 2c 20 69 43 65 6c 6c 2c  ect, pPg, iCell,
29c60 20 26 65 54 79 70 65 2c 20 26 69 50 67 50 74 72   &eType, &iPgPtr
29c70 2c 0a 20 20 20 20 20 20 20 20 20 20 26 61 4b 65  ,.          &aKe
29c80 79 2c 20 26 6e 4b 65 79 2c 20 26 61 56 61 6c 2c  y, &nKey, &aVal,
29c90 20 26 6e 56 61 6c 2c 20 26 62 6c 6f 62 0a 20 20   &nVal, &blob.  
29ca0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 41 62      );.      iAb
29cb0 73 50 74 72 20 3d 20 69 50 67 50 74 72 20 2b 20  sPtr = iPgPtr + 
29cc0 28 28 66 6c 61 67 73 32 20 26 20 53 45 47 4d 45  ((flags2 & SEGME
29cd0 4e 54 5f 42 54 52 45 45 5f 46 4c 41 47 29 20 3f  NT_BTREE_FLAG) ?
29ce0 20 30 20 3a 20 69 50 74 72 29 3b 0a 0a 20 20 20   0 : iPtr);..   
29cf0 20 20 20 6c 73 6d 46 6c 61 67 73 54 6f 53 74 72     lsmFlagsToStr
29d00 69 6e 67 28 65 54 79 70 65 2c 20 7a 46 6c 61 67  ing(eType, zFlag
29d10 73 29 3b 0a 20 20 20 20 20 20 6c 73 6d 53 74 72  s);.      lsmStr
29d20 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c  ingAppendf(&str,
29d30 20 22 25 73 20 25 64 20 28 25 73 29 20 22 2c 20   "%s %d (%s) ", 
29d40 0a 20 20 20 20 20 20 20 20 20 20 7a 46 6c 61 67  .          zFlag
29d50 73 2c 20 69 41 62 73 50 74 72 2c 20 28 72 74 54  s, iAbsPtr, (rtT
29d60 6f 70 69 63 28 65 54 79 70 65 29 20 3f 20 22 73  opic(eType) ? "s
29d70 79 73 22 20 3a 20 22 75 73 72 22 29 0a 20 20 20  ys" : "usr").   
29d80 20 20 20 29 3b 0a 20 20 20 20 20 20 69 6e 66 6f     );.      info
29d90 41 70 70 65 6e 64 42 6c 6f 62 28 26 73 74 72 2c  AppendBlob(&str,
29da0 20 62 48 65 78 2c 20 61 4b 65 79 2c 20 6e 4b 65   bHex, aKey, nKe
29db0 79 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 6e  y); .      if( n
29dc0 56 61 6c 3e 30 20 26 26 20 62 56 61 6c 75 65 73  Val>0 && bValues
29dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 73 6d 53   ){.        lsmS
29de0 74 72 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74  tringAppendf(&st
29df0 72 2c 20 22 25 2a 73 22 2c 20 6e 4b 65 79 57 69  r, "%*s", nKeyWi
29e00 64 74 68 20 2d 20 28 6e 4b 65 79 2a 28 31 2b 62  dth - (nKey*(1+b
29e10 48 65 78 29 29 2c 20 22 22 29 3b 0a 20 20 20 20  Hex)), "");.    
29e20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70      lsmStringApp
29e30 65 6e 64 66 28 26 73 74 72 2c 20 22 20 22 29 3b  endf(&str, " ");
29e40 0a 20 20 20 20 20 20 20 20 69 6e 66 6f 41 70 70  .        infoApp
29e50 65 6e 64 42 6c 6f 62 28 26 73 74 72 2c 20 62 48  endBlob(&str, bH
29e60 65 78 2c 20 61 56 61 6c 2c 20 6e 56 61 6c 29 3b  ex, aVal, nVal);
29e70 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
29e80 69 66 28 20 72 74 54 6f 70 69 63 28 65 54 79 70  if( rtTopic(eTyp
29e90 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  e) ){.        in
29ea0 74 20 69 42 6c 6b 20 3d 20 28 69 6e 74 29 7e 6c  t iBlk = (int)~l
29eb0 73 6d 47 65 74 55 33 32 28 61 4b 65 79 29 3b 0a  smGetU32(aKey);.
29ec0 20 20 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e          lsmStrin
29ed0 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22  gAppendf(&str, "
29ee0 20 20 28 62 6c 6f 63 6b 3d 25 64 22 2c 20 69 42    (block=%d", iB
29ef0 6c 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  lk);.        if(
29f00 20 6e 56 61 6c 3e 30 20 29 7b 0a 20 20 20 20 20   nVal>0 ){.     
29f10 20 20 20 20 20 69 36 34 20 69 53 6e 61 70 20 3d       i64 iSnap =
29f20 20 6c 73 6d 47 65 74 55 36 34 28 61 56 61 6c 29   lsmGetU64(aVal)
29f30 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 73 6d 53  ;.          lsmS
29f40 74 72 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74  tringAppendf(&st
29f50 72 2c 20 22 20 73 6e 61 70 73 68 6f 74 3d 25 6c  r, " snapshot=%l
29f60 6c 64 22 2c 20 69 53 6e 61 70 29 3b 0a 20 20 20  ld", iSnap);.   
29f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
29f80 73 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66 28  smStringAppendf(
29f90 26 73 74 72 2c 20 22 29 22 29 3b 0a 20 20 20 20  &str, ")");.    
29fa0 20 20 7d 0a 20 20 20 20 20 20 6c 73 6d 53 74 72    }.      lsmStr
29fb0 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c  ingAppendf(&str,
29fc0 20 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20   "\n");.    }.. 
29fd0 20 20 20 69 66 28 20 62 44 61 74 61 20 29 7b 0a     if( bData ){.
29fe0 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41        lsmStringA
29ff0 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22 5c 6e  ppendf(&str, "\n
2a000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a010 2d 2d 2d 22 20 0a 20 20 20 20 20 20 20 20 20 20  ---" .          
2a020 22 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 2d 2d 2d 2d  ----------------
2a050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
2a060 22 29 3b 0a 20 20 20 20 20 20 6c 73 6d 53 74 72  ");.      lsmStr
2a070 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c  ingAppendf(&str,
2a080 20 22 50 61 67 65 20 25 64 5c 6e 22 2c 0a 20 20   "Page %d\n",.  
2a090 20 20 20 20 20 20 20 20 69 50 67 2c 20 28 69 50          iPg, (iP
2a0a0 67 2d 31 29 2a 6e 44 61 74 61 2c 20 69 50 67 2a  g-1)*nData, iPg*
2a0b0 6e 44 61 74 61 20 2d 20 31 29 3b 0a 20 20 20 20  nData - 1);.    
2a0c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 61    for(i=0; i<nDa
2a0d0 74 61 3b 20 69 20 2b 3d 20 70 65 72 4c 69 6e 65  ta; i += perLine
2a0e0 29 7b 0a 20 20 20 20 20 20 20 20 6c 73 6d 53 74  ){.        lsmSt
2a0f0 72 69 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72  ringAppendf(&str
2a100 2c 20 22 25 30 34 78 3a 20 22 2c 20 69 29 3b 0a  , "%04x: ", i);.
2a110 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
2a120 20 6a 3c 70 65 72 4c 69 6e 65 3b 20 6a 2b 2b 29   j<perLine; j++)
2a130 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2a140 69 2b 6a 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20  i+j>nData ){.   
2a150 20 20 20 20 20 20 20 20 20 6c 73 6d 53 74 72 69           lsmStri
2a160 6e 67 41 70 70 65 6e 64 66 28 26 73 74 72 2c 20  ngAppendf(&str, 
2a170 22 20 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "   ");.        
2a180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a190 20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70       lsmStringAp
2a1a0 70 65 6e 64 66 28 26 73 74 72 2c 20 22 25 30 32  pendf(&str, "%02
2a1b0 78 20 22 2c 20 61 44 61 74 61 5b 69 2b 6a 5d 29  x ", aData[i+j])
2a1c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2a1d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a1e0 6c 73 6d 53 74 72 69 6e 67 41 70 70 65 6e 64 66  lsmStringAppendf
2a1f0 28 26 73 74 72 2c 20 22 20 20 22 29 3b 0a 20 20  (&str, "  ");.  
2a200 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2a210 3c 70 65 72 4c 69 6e 65 3b 20 6a 2b 2b 29 7b 0a  <perLine; j++){.
2a220 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b            if( i+
2a230 6a 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20  j>nData ){.     
2a240 20 20 20 20 20 20 20 6c 73 6d 53 74 72 69 6e 67         lsmString
2a250 41 70 70 65 6e 64 66 28 26 73 74 72 2c 20 22 20  Appendf(&str, " 
2a260 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ");.          }e
2a270 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2a280 20 6c 73 6d 53 74 72 69 6e 67 41 70 70 65 6e 64   lsmStringAppend
2a290 66 28 26 73 74 72 2c 22 25 63 22 2c 20 69 73 70  f(&str,"%c", isp
2a2a0 72 69 6e 74 28 61 44 61 74 61 5b 69 2b 6a 5d 29  rint(aData[i+j])
2a2b0 20 3f 20 61 44 61 74 61 5b 69 2b 6a 5d 20 3a 20   ? aData[i+j] : 
2a2c0 27 2e 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '.');.          
2a2d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2a2e0 20 20 20 20 6c 73 6d 53 74 72 69 6e 67 41 70 70      lsmStringApp
2a2f0 65 6e 64 66 28 26 73 74 72 2c 22 5c 6e 22 29 3b  endf(&str,"\n");
2a300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2a310 20 20 20 20 2a 70 7a 4f 75 74 20 3d 20 73 74 72      *pzOut = str
2a320 2e 7a 3b 0a 20 20 20 20 73 6f 72 74 65 64 42 6c  .z;.    sortedBl
2a330 6f 62 46 72 65 65 28 26 62 6c 6f 62 29 3b 0a 20  obFree(&blob);. 
2a340 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65     lsmFsPageRele
2a350 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ase(pPg);.  }.. 
2a360 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69   return rc;.}..i
2a370 6e 74 20 6c 73 6d 49 6e 66 6f 50 61 67 65 44 75  nt lsmInfoPageDu
2a380 6d 70 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44  mp(.  lsm_db *pD
2a390 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
2a3a0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
2a3b0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67  e handle */.  Pg
2a3c0 6e 6f 20 69 50 67 2c 20 20 20 20 20 20 20 20 20  no iPg,         
2a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a3e0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
2a3f0 70 61 67 65 20 74 6f 20 64 75 6d 70 20 2a 2f 0a  page to dump */.
2a400 20 20 69 6e 74 20 62 48 65 78 2c 20 20 20 20 20    int bHex,     
2a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a420 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 75 74    /* True to out
2a430 70 75 74 20 6b 65 79 2f 76 61 6c 75 65 20 69 6e  put key/value in
2a440 20 68 65 78 20 66 6f 72 6d 20 2a 2f 0a 20 20 63   hex form */.  c
2a450 68 61 72 20 2a 2a 70 7a 4f 75 74 20 20 20 20 20  har **pzOut     
2a460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a470 2a 20 4f 55 54 3a 20 6c 73 6d 4d 61 6c 6c 6f 63  * OUT: lsmMalloc
2a480 27 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a  'd string */.){.
2a490 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 49 4e    int flags = IN
2a4a0 46 4f 5f 50 41 47 45 5f 44 55 4d 50 5f 44 41 54  FO_PAGE_DUMP_DAT
2a4b0 41 20 7c 20 49 4e 46 4f 5f 50 41 47 45 5f 44 55  A | INFO_PAGE_DU
2a4c0 4d 50 5f 56 41 4c 55 45 53 3b 0a 20 20 69 66 28  MP_VALUES;.  if(
2a4d0 20 62 48 65 78 20 29 20 66 6c 61 67 73 20 7c 3d   bHex ) flags |=
2a4e0 20 49 4e 46 4f 5f 50 41 47 45 5f 44 55 4d 50 5f   INFO_PAGE_DUMP_
2a4f0 48 45 58 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e  HEX;.  return in
2a500 66 6f 50 61 67 65 44 75 6d 70 28 70 44 62 2c 20  foPageDump(pDb, 
2a510 69 50 67 2c 20 66 6c 61 67 73 2c 20 70 7a 4f 75  iPg, flags, pzOu
2a520 74 29 3b 0a 7d 0a 0a 76 6f 69 64 20 73 6f 72 74  t);.}..void sort
2a530 65 64 44 75 6d 70 53 65 67 6d 65 6e 74 28 6c 73  edDumpSegment(ls
2a540 6d 5f 64 62 20 2a 70 44 62 2c 20 53 65 67 6d 65  m_db *pDb, Segme
2a550 6e 74 20 2a 70 52 75 6e 2c 20 69 6e 74 20 62 56  nt *pRun, int bV
2a560 61 6c 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  als){.  assert( 
2a570 70 44 62 2d 3e 78 4c 6f 67 20 29 3b 0a 20 20 69  pDb->xLog );.  i
2a580 66 28 20 70 52 75 6e 20 26 26 20 70 52 75 6e 2d  f( pRun && pRun-
2a590 3e 69 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69  >iFirst ){.    i
2a5a0 6e 74 20 66 6c 61 67 73 20 3d 20 28 62 56 61 6c  nt flags = (bVal
2a5b0 73 20 3f 20 49 4e 46 4f 5f 50 41 47 45 5f 44 55  s ? INFO_PAGE_DU
2a5c0 4d 50 5f 56 41 4c 55 45 53 20 3a 20 30 29 3b 0a  MP_VALUES : 0);.
2a5d0 20 20 20 20 63 68 61 72 20 2a 7a 53 65 67 3b 0a      char *zSeg;.
2a5e0 20 20 20 20 50 61 67 65 20 2a 70 50 67 3b 0a 0a      Page *pPg;..
2a5f0 20 20 20 20 7a 53 65 67 20 3d 20 73 65 67 54 6f      zSeg = segTo
2a600 53 74 72 69 6e 67 28 70 44 62 2d 3e 70 45 6e 76  String(pDb->pEnv
2a610 2c 20 70 52 75 6e 2c 20 30 29 3b 0a 20 20 20 20  , pRun, 0);.    
2a620 6c 73 6d 4c 6f 67 4d 65 73 73 61 67 65 28 70 44  lsmLogMessage(pD
2a630 62 2c 20 4c 53 4d 5f 4f 4b 2c 20 22 53 65 67 6d  b, LSM_OK, "Segm
2a640 65 6e 74 3a 20 25 73 22 2c 20 7a 53 65 67 29 3b  ent: %s", zSeg);
2a650 0a 20 20 20 20 6c 73 6d 46 72 65 65 28 70 44 62  .    lsmFree(pDb
2a660 2d 3e 70 45 6e 76 2c 20 7a 53 65 67 29 3b 0a 0a  ->pEnv, zSeg);..
2a670 20 20 20 20 6c 73 6d 46 73 44 62 50 61 67 65 47      lsmFsDbPageG
2a680 65 74 28 70 44 62 2d 3e 70 46 53 2c 20 70 52 75  et(pDb->pFS, pRu
2a690 6e 2c 20 70 52 75 6e 2d 3e 69 46 69 72 73 74 2c  n, pRun->iFirst,
2a6a0 20 26 70 50 67 29 3b 0a 20 20 20 20 77 68 69 6c   &pPg);.    whil
2a6b0 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  e( pPg ){.      
2a6c0 50 61 67 65 20 2a 70 4e 65 78 74 3b 0a 20 20 20  Page *pNext;.   
2a6d0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a     char *z = 0;.
2a6e0 20 20 20 20 20 20 69 6e 66 6f 50 61 67 65 44 75        infoPageDu
2a6f0 6d 70 28 70 44 62 2c 20 6c 73 6d 46 73 50 61 67  mp(pDb, lsmFsPag
2a700 65 4e 75 6d 62 65 72 28 70 50 67 29 2c 20 66 6c  eNumber(pPg), fl
2a710 61 67 73 2c 20 26 7a 29 3b 0a 20 20 20 20 20 20  ags, &z);.      
2a720 6c 73 6d 4c 6f 67 4d 65 73 73 61 67 65 28 70 44  lsmLogMessage(pD
2a730 62 2c 20 4c 53 4d 5f 4f 4b 2c 20 22 25 73 22 2c  b, LSM_OK, "%s",
2a740 20 7a 29 3b 0a 20 20 20 20 20 20 6c 73 6d 46 72   z);.      lsmFr
2a750 65 65 28 70 44 62 2d 3e 70 45 6e 76 2c 20 7a 29  ee(pDb->pEnv, z)
2a760 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 73 6f  ;.#if 0.      so
2a770 72 74 65 64 44 75 6d 70 50 61 67 65 28 70 44 62  rtedDumpPage(pDb
2a780 2c 20 70 52 75 6e 2c 20 70 50 67 2c 20 62 56 61  , pRun, pPg, bVa
2a790 6c 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ls);.#endif.    
2a7a0 20 20 6c 73 6d 46 73 44 62 50 61 67 65 4e 65 78    lsmFsDbPageNex
2a7b0 74 28 70 52 75 6e 2c 20 70 50 67 2c 20 31 2c 20  t(pRun, pPg, 1, 
2a7c0 26 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 6c  &pNext);.      l
2a7d0 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73 65 28  smFsPageRelease(
2a7e0 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 67 20  pPg);.      pPg 
2a7f0 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  = pNext;.    }. 
2a800 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
2a810 6b 65 20 74 68 65 20 6c 6f 67 20 63 61 6c 6c 62  ke the log callb
2a820 61 63 6b 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65  ack zero or more
2a830 20 74 69 6d 65 73 20 77 69 74 68 20 6d 65 73 73   times with mess
2a840 61 67 65 73 20 74 68 61 74 20 64 65 73 63 72 69  ages that descri
2a850 62 65 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  be.** the curren
2a860 74 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  t database struc
2a870 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 6c 73  ture..*/.void ls
2a880 6d 53 6f 72 74 65 64 44 75 6d 70 53 74 72 75 63  mSortedDumpStruc
2a890 74 75 72 65 28 0a 20 20 6c 73 6d 5f 64 62 20 2a  ture(.  lsm_db *
2a8a0 70 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  pDb,            
2a8b0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
2a8c0 61 73 65 20 68 61 6e 64 6c 65 20 28 75 73 65 64  ase handle (used
2a8d0 20 66 6f 72 20 78 4c 6f 67 20 63 61 6c 6c 62 61   for xLog callba
2a8e0 63 6b 29 20 2a 2f 0a 20 20 53 6e 61 70 73 68 6f  ck) */.  Snapsho
2a8f0 74 20 2a 70 53 6e 61 70 2c 20 20 20 20 20 20 20  t *pSnap,       
2a900 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6e 61 70           /* Snap
2a910 73 68 6f 74 20 74 6f 20 64 75 6d 70 20 2a 2f 0a  shot to dump */.
2a920 20 20 69 6e 74 20 62 4b 65 79 73 2c 20 20 20 20    int bKeys,    
2a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a940 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
2a950 6b 65 79 73 20 66 72 6f 6d 20 65 61 63 68 20 73  keys from each s
2a960 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
2a970 62 56 61 6c 73 2c 20 20 20 20 20 20 20 20 20 20  bVals,          
2a980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2a990 75 74 70 75 74 20 74 68 65 20 76 61 6c 75 65 73  utput the values
2a9a0 20 66 72 6f 6d 20 65 61 63 68 20 73 65 67 6d 65   from each segme
2a9b0 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nt */.  const ch
2a9c0 61 72 20 2a 7a 57 68 79 20 20 20 20 20 20 20 20  ar *zWhy        
2a9d0 20 20 20 20 20 20 20 20 2f 2a 20 43 61 70 74 69          /* Capti
2a9e0 6f 6e 20 74 6f 20 70 72 69 6e 74 20 6e 65 61 72  on to print near
2a9f0 20 74 6f 70 20 6f 66 20 64 75 6d 70 20 2a 2f 0a   top of dump */.
2aa00 29 7b 0a 20 20 53 6e 61 70 73 68 6f 74 20 2a 70  ){.  Snapshot *p
2aa10 44 75 6d 70 20 3d 20 70 53 6e 61 70 3b 0a 20 20  Dump = pSnap;.  
2aa20 4c 65 76 65 6c 20 2a 70 54 6f 70 4c 65 76 65 6c  Level *pTopLevel
2aa30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 72 65 65 20  ;.  char *zFree 
2aa40 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
2aa50 70 53 6e 61 70 20 29 3b 0a 20 20 70 54 6f 70 4c  pSnap );.  pTopL
2aa60 65 76 65 6c 20 3d 20 6c 73 6d 44 62 53 6e 61 70  evel = lsmDbSnap
2aa70 73 68 6f 74 4c 65 76 65 6c 28 70 44 75 6d 70 29  shotLevel(pDump)
2aa80 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 78 4c 6f  ;.  if( pDb->xLo
2aa90 67 20 26 26 20 70 54 6f 70 4c 65 76 65 6c 20 29  g && pTopLevel )
2aaa0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74  {.    static int
2aab0 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 20 20   nCall = 0;.    
2aac0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
2aad0 20 20 20 69 6e 74 20 69 4c 65 76 65 6c 20 3d 20     int iLevel = 
2aae0 30 3b 0a 0a 20 20 20 20 6e 43 61 6c 6c 2b 2b 3b  0;..    nCall++;
2aaf0 0a 20 20 20 20 6c 73 6d 4c 6f 67 4d 65 73 73 61  .    lsmLogMessa
2ab00 67 65 28 70 44 62 2c 20 4c 53 4d 5f 4f 4b 2c 20  ge(pDb, LSM_OK, 
2ab10 22 44 61 74 61 62 61 73 65 20 73 74 72 75 63 74  "Database struct
2ab20 75 72 65 20 25 64 20 28 25 73 29 22 2c 20 6e 43  ure %d (%s)", nC
2ab30 61 6c 6c 2c 20 7a 57 68 79 29 3b 0a 0a 23 69 66  all, zWhy);..#if
2ab40 20 30 0a 20 20 20 20 69 66 28 20 6e 43 61 6c 6c   0.    if( nCall
2ab50 3d 3d 31 30 33 31 20 7c 7c 20 6e 43 61 6c 6c 3d  ==1031 || nCall=
2ab60 3d 31 30 33 32 20 29 20 62 4b 65 79 73 3d 31 3b  =1032 ) bKeys=1;
2ab70 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72  .#endif..    for
2ab80 28 70 4c 65 76 65 6c 3d 70 54 6f 70 4c 65 76 65  (pLevel=pTopLeve
2ab90 6c 3b 20 70 4c 65 76 65 6c 3b 20 70 4c 65 76 65  l; pLevel; pLeve
2aba0 6c 3d 70 4c 65 76 65 6c 2d 3e 70 4e 65 78 74 29  l=pLevel->pNext)
2abb0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c 65  {.      char zLe
2abc0 66 74 5b 31 30 32 34 5d 3b 0a 20 20 20 20 20 20  ft[1024];.      
2abd0 63 68 61 72 20 7a 52 69 67 68 74 5b 31 30 32 34  char zRight[1024
2abe0 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d  ];.      int i =
2abf0 20 30 3b 0a 0a 20 20 20 20 20 20 53 65 67 6d 65   0;..      Segme
2ac00 6e 74 20 2a 61 4c 65 66 74 5b 32 34 5d 3b 20 20  nt *aLeft[24];  
2ac10 0a 20 20 20 20 20 20 53 65 67 6d 65 6e 74 20 2a  .      Segment *
2ac20 61 52 69 67 68 74 5b 32 34 5d 3b 0a 0a 20 20 20  aRight[24];..   
2ac30 20 20 20 69 6e 74 20 6e 4c 65 66 74 20 3d 20 30     int nLeft = 0
2ac40 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 52 69 67  ;.      int nRig
2ac50 68 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 53  ht = 0;..      S
2ac60 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
2ac70 70 4c 65 76 65 6c 2d 3e 6c 68 73 3b 0a 20 20 20  pLevel->lhs;.   
2ac80 20 20 20 61 4c 65 66 74 5b 6e 4c 65 66 74 2b 2b     aLeft[nLeft++
2ac90 5d 20 3d 20 70 53 65 67 3b 0a 0a 20 20 20 20 20  ] = pSeg;..     
2aca0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 65 76   for(i=0; i<pLev
2acb0 65 6c 2d 3e 6e 52 69 67 68 74 3b 20 69 2b 2b 29  el->nRight; i++)
2acc0 7b 0a 20 20 20 20 20 20 20 20 61 52 69 67 68 74  {.        aRight
2acd0 5b 6e 52 69 67 68 74 2b 2b 5d 20 3d 20 26 70 4c  [nRight++] = &pL
2ace0 65 76 65 6c 2d 3e 61 52 68 73 5b 69 5d 3b 0a 20  evel->aRhs[i];. 
2acf0 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 4c       }..#ifdef L
2ad00 53 4d 5f 4c 4f 47 5f 46 52 45 45 4c 49 53 54 0a  SM_LOG_FREELIST.
2ad10 20 20 20 20 20 20 69 66 28 20 6e 52 69 67 68 74        if( nRight
2ad20 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d   ){.        memm
2ad30 6f 76 65 28 26 61 52 69 67 68 74 5b 31 5d 2c 20  ove(&aRight[1], 
2ad40 61 52 69 67 68 74 2c 20 73 69 7a 65 6f 66 28 61  aRight, sizeof(a
2ad50 52 69 67 68 74 5b 30 5d 29 2a 6e 52 69 67 68 74  Right[0])*nRight
2ad60 29 3b 0a 20 20 20 20 20 20 20 20 61 52 69 67 68  );.        aRigh
2ad70 74 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  t[0] = 0;.      
2ad80 20 20 6e 52 69 67 68 74 2b 2b 3b 0a 20 20 20 20    nRight++;.    
2ad90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
2ada0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 65    for(i=0; i<nLe
2adb0 66 74 20 7c 7c 20 69 3c 6e 52 69 67 68 74 3b 20  ft || i<nRight; 
2adc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
2add0 74 20 69 50 61 64 20 3d 20 30 3b 0a 20 20 20 20  t iPad = 0;.    
2ade0 20 20 20 20 63 68 61 72 20 7a 4c 65 76 65 6c 5b      char zLevel[
2adf0 33 32 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4c 65  32];.        zLe
2ae00 66 74 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ft[0] = '\0';.  
2ae10 20 20 20 20 20 20 7a 52 69 67 68 74 5b 30 5d 20        zRight[0] 
2ae20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 20 20 20  = '\0';..       
2ae30 20 69 66 28 20 69 3c 6e 4c 65 66 74 20 29 7b 20   if( i<nLeft ){ 
2ae40 0a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 54  .          fileT
2ae50 6f 53 74 72 69 6e 67 28 70 44 62 2c 20 7a 4c 65  oString(pDb, zLe
2ae60 66 74 2c 20 73 69 7a 65 6f 66 28 7a 4c 65 66 74  ft, sizeof(zLeft
2ae70 29 2c 20 32 34 2c 20 61 4c 65 66 74 5b 69 5d 29  ), 24, aLeft[i])
2ae80 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
2ae90 20 20 20 20 20 69 66 28 20 69 3c 6e 52 69 67 68       if( i<nRigh
2aea0 74 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  t ){ .          
2aeb0 66 69 6c 65 54 6f 53 74 72 69 6e 67 28 70 44 62  fileToString(pDb
2aec0 2c 20 7a 52 69 67 68 74 2c 20 73 69 7a 65 6f 66  , zRight, sizeof
2aed0 28 7a 52 69 67 68 74 29 2c 20 32 34 2c 20 61 52  (zRight), 24, aR
2aee0 69 67 68 74 5b 69 5d 29 3b 20 0a 20 20 20 20 20  ight[i]); .     
2aef0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
2af00 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( i==0 ){.      
2af10 20 20 20 20 73 6e 70 72 69 6e 74 66 28 7a 4c 65      snprintf(zLe
2af20 76 65 6c 2c 20 73 69 7a 65 6f 66 28 7a 4c 65 76  vel, sizeof(zLev
2af30 65 6c 29 2c 20 22 4c 25 64 3a 20 28 61 67 65 3d  el), "L%d: (age=
2af40 25 64 29 20 28 66 6c 61 67 73 3d 25 2e 34 78 29  %d) (flags=%.4x)
2af50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2af60 20 69 4c 65 76 65 6c 2c 20 28 69 6e 74 29 70 4c   iLevel, (int)pL
2af70 65 76 65 6c 2d 3e 69 41 67 65 2c 20 28 69 6e 74  evel->iAge, (int
2af80 29 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 0a 20  )pLevel->flags. 
2af90 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
2afa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2afb0 20 20 20 20 20 7a 4c 65 76 65 6c 5b 30 5d 20 3d       zLevel[0] =
2afc0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d   '\0';.        }
2afd0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 52  ..        if( nR
2afe0 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
2aff0 20 20 20 20 20 69 50 61 64 20 3d 20 31 30 3b 0a       iPad = 10;.
2b000 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2b010 20 20 20 6c 73 6d 4c 6f 67 4d 65 73 73 61 67 65     lsmLogMessage
2b020 28 70 44 62 2c 20 4c 53 4d 5f 4f 4b 2c 20 22 25  (pDb, LSM_OK, "%
2b030 20 32 35 73 20 25 20 2a 73 25 20 2d 33 35 73 20   25s % *s% -35s 
2b040 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  %s", .          
2b050 20 20 7a 4c 65 76 65 6c 2c 20 69 50 61 64 2c 20    zLevel, iPad, 
2b060 22 22 2c 20 7a 4c 65 66 74 2c 20 7a 52 69 67 68  "", zLeft, zRigh
2b070 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  t.        );.   
2b080 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 4c 65 76     }..      iLev
2b090 65 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  el++;.    }..   
2b0a0 20 69 66 28 20 62 4b 65 79 73 20 29 7b 0a 20 20   if( bKeys ){.  
2b0b0 20 20 20 20 66 6f 72 28 70 4c 65 76 65 6c 3d 70      for(pLevel=p
2b0c0 54 6f 70 4c 65 76 65 6c 3b 20 70 4c 65 76 65 6c  TopLevel; pLevel
2b0d0 3b 20 70 4c 65 76 65 6c 3d 70 4c 65 76 65 6c 2d  ; pLevel=pLevel-
2b0e0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
2b0f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
2b100 73 6f 72 74 65 64 44 75 6d 70 53 65 67 6d 65 6e  sortedDumpSegmen
2b110 74 28 70 44 62 2c 20 26 70 4c 65 76 65 6c 2d 3e  t(pDb, &pLevel->
2b120 6c 68 73 2c 20 62 56 61 6c 73 29 3b 0a 20 20 20  lhs, bVals);.   
2b130 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2b140 70 4c 65 76 65 6c 2d 3e 6e 52 69 67 68 74 3b 20  pLevel->nRight; 
2b150 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2b160 73 6f 72 74 65 64 44 75 6d 70 53 65 67 6d 65 6e  sortedDumpSegmen
2b170 74 28 70 44 62 2c 20 26 70 4c 65 76 65 6c 2d 3e  t(pDb, &pLevel->
2b180 61 52 68 73 5b 69 5d 2c 20 62 56 61 6c 73 29 3b  aRhs[i], bVals);
2b190 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b1a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2b1b0 6c 73 6d 49 6e 66 6f 46 72 65 65 6c 69 73 74 28  lsmInfoFreelist(
2b1c0 70 44 62 2c 20 26 7a 46 72 65 65 29 3b 0a 20 20  pDb, &zFree);.  
2b1d0 6c 73 6d 4c 6f 67 4d 65 73 73 61 67 65 28 70 44  lsmLogMessage(pD
2b1e0 62 2c 20 4c 53 4d 5f 4f 4b 2c 20 22 46 72 65 65  b, LSM_OK, "Free
2b1f0 6c 69 73 74 3a 20 25 73 22 2c 20 7a 46 72 65 65  list: %s", zFree
2b200 29 3b 0a 20 20 6c 73 6d 46 72 65 65 28 70 44 62  );.  lsmFree(pDb
2b210 2d 3e 70 45 6e 76 2c 20 7a 46 72 65 65 29 3b 0a  ->pEnv, zFree);.
2b220 0a 20 20 61 73 73 65 72 74 28 20 6c 73 6d 46 73  .  assert( lsmFs
2b230 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 70  IntegrityCheck(p
2b240 44 62 29 20 29 3b 0a 7d 0a 0a 76 6f 69 64 20 6c  Db) );.}..void l
2b250 73 6d 53 6f 72 74 65 64 46 72 65 65 4c 65 76 65  smSortedFreeLeve
2b260 6c 28 6c 73 6d 5f 65 6e 76 20 2a 70 45 6e 76 2c  l(lsm_env *pEnv,
2b270 20 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 29 7b   Level *pLevel){
2b280 0a 20 20 4c 65 76 65 6c 20 2a 70 4e 65 78 74 3b  .  Level *pNext;
2b290 0a 20 20 4c 65 76 65 6c 20 2a 70 3b 0a 0a 20 20  .  Level *p;..  
2b2a0 66 6f 72 28 70 3d 70 4c 65 76 65 6c 3b 20 70 3b  for(p=pLevel; p;
2b2b0 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
2b2c0 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
2b2d0 0a 20 20 20 20 73 6f 72 74 65 64 46 72 65 65 4c  .    sortedFreeL
2b2e0 65 76 65 6c 28 70 45 6e 76 2c 20 70 29 3b 0a 20  evel(pEnv, p);. 
2b2f0 20 7d 0a 7d 0a 0a 76 6f 69 64 20 6c 73 6d 53 6f   }.}..void lsmSo
2b300 72 74 65 64 53 61 76 65 54 72 65 65 43 75 72 73  rtedSaveTreeCurs
2b310 6f 72 73 28 6c 73 6d 5f 64 62 20 2a 70 44 62 29  ors(lsm_db *pDb)
2b320 7b 0a 20 20 4d 75 6c 74 69 43 75 72 73 6f 72 20  {.  MultiCursor 
2b330 2a 70 43 73 72 3b 0a 20 20 66 6f 72 28 70 43 73  *pCsr;.  for(pCs
2b340 72 3d 70 44 62 2d 3e 70 43 73 72 3b 20 70 43 73  r=pDb->pCsr; pCs
2b350 72 3b 20 70 43 73 72 3d 70 43 73 72 2d 3e 70 4e  r; pCsr=pCsr->pN
2b360 65 78 74 29 7b 0a 20 20 20 20 6c 73 6d 54 72 65  ext){.    lsmTre
2b370 65 43 75 72 73 6f 72 53 61 76 65 28 70 43 73 72  eCursorSave(pCsr
2b380 2d 3e 61 70 54 72 65 65 43 73 72 5b 30 5d 29 3b  ->apTreeCsr[0]);
2b390 0a 20 20 20 20 6c 73 6d 54 72 65 65 43 75 72 73  .    lsmTreeCurs
2b3a0 6f 72 53 61 76 65 28 70 43 73 72 2d 3e 61 70 54  orSave(pCsr->apT
2b3b0 72 65 65 43 73 72 5b 31 5d 29 3b 0a 20 20 7d 0a  reeCsr[1]);.  }.
2b3c0 7d 0a 0a 76 6f 69 64 20 6c 73 6d 53 6f 72 74 65  }..void lsmSorte
2b3d0 64 45 78 70 61 6e 64 42 74 72 65 65 50 61 67 65  dExpandBtreePage
2b3e0 28 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  (Page *pPg, int 
2b3f0 6e 4f 72 69 67 29 7b 0a 20 20 75 38 20 2a 61 44  nOrig){.  u8 *aD
2b400 61 74 61 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61  ata;.  int nData
2b410 3b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 0a  ;.  int nEntry;.
2b420 20 20 69 6e 74 20 69 48 64 72 3b 0a 0a 20 20 61    int iHdr;..  a
2b430 44 61 74 61 20 3d 20 6c 73 6d 46 73 50 61 67 65  Data = lsmFsPage
2b440 44 61 74 61 28 70 50 67 2c 20 26 6e 44 61 74 61  Data(pPg, &nData
2b450 29 3b 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 61  );.  nEntry = pa
2b460 67 65 47 65 74 4e 52 65 63 28 61 44 61 74 61 2c  geGetNRec(aData,
2b470 20 6e 4f 72 69 67 29 3b 0a 20 20 69 48 64 72 20   nOrig);.  iHdr 
2b480 3d 20 53 45 47 4d 45 4e 54 5f 45 4f 46 28 6e 4f  = SEGMENT_EOF(nO
2b490 72 69 67 2c 20 6e 45 6e 74 72 79 29 3b 0a 20 20  rig, nEntry);.  
2b4a0 6d 65 6d 6d 6f 76 65 28 26 61 44 61 74 61 5b 69  memmove(&aData[i
2b4b0 48 64 72 20 2b 20 28 6e 44 61 74 61 2d 6e 4f 72  Hdr + (nData-nOr
2b4c0 69 67 29 5d 2c 20 26 61 44 61 74 61 5b 69 48 64  ig)], &aData[iHd
2b4d0 72 5d 2c 20 6e 4f 72 69 67 2d 69 48 64 72 29 3b  r], nOrig-iHdr);
2b4e0 0a 7d 0a 0a 23 69 66 64 65 66 20 4c 53 4d 5f 44  .}..#ifdef LSM_D
2b4f0 45 42 55 47 5f 45 58 50 45 4e 53 49 56 45 0a 73  EBUG_EXPENSIVE.s
2b500 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
2b510 74 52 75 6e 49 6e 4f 72 64 65 72 28 6c 73 6d 5f  tRunInOrder(lsm_
2b520 64 62 20 2a 70 44 62 2c 20 53 65 67 6d 65 6e 74  db *pDb, Segment
2b530 20 2a 70 53 65 67 29 7b 0a 20 20 50 61 67 65 20   *pSeg){.  Page 
2b540 2a 70 50 67 20 3d 20 30 3b 0a 20 20 42 6c 6f 62  *pPg = 0;.  Blob
2b550 20 62 6c 6f 62 31 20 3d 20 7b 30 2c 20 30 2c 20   blob1 = {0, 0, 
2b560 30 2c 20 30 7d 3b 0a 20 20 42 6c 6f 62 20 62 6c  0, 0};.  Blob bl
2b570 6f 62 32 20 3d 20 7b 30 2c 20 30 2c 20 30 2c 20  ob2 = {0, 0, 0, 
2b580 30 7d 3b 0a 0a 20 20 6c 73 6d 46 73 44 62 50 61  0};..  lsmFsDbPa
2b590 67 65 47 65 74 28 70 44 62 2d 3e 70 46 53 2c 20  geGet(pDb->pFS, 
2b5a0 70 53 65 67 2c 20 70 53 65 67 2d 3e 69 46 69 72  pSeg, pSeg->iFir
2b5b0 73 74 2c 20 26 70 50 67 29 3b 0a 20 20 77 68 69  st, &pPg);.  whi
2b5c0 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20 75  le( pPg ){.    u
2b5d0 38 20 2a 61 44 61 74 61 3b 20 69 6e 74 20 6e 44  8 *aData; int nD
2b5e0 61 74 61 3b 0a 20 20 20 20 50 61 67 65 20 2a 70  ata;.    Page *p
2b5f0 4e 65 78 74 3b 0a 0a 20 20 20 20 61 44 61 74 61  Next;..    aData
2b600 20 3d 20 6c 73 6d 46 73 50 61 67 65 44 61 74 61   = lsmFsPageData
2b610 28 70 50 67 2c 20 26 6e 44 61 74 61 29 3b 0a 20  (pPg, &nData);. 
2b620 20 20 20 69 66 28 20 30 3d 3d 28 70 61 67 65 47     if( 0==(pageG
2b630 65 74 46 6c 61 67 73 28 61 44 61 74 61 2c 20 6e  etFlags(aData, n
2b640 44 61 74 61 29 20 26 20 53 45 47 4d 45 4e 54 5f  Data) & SEGMENT_
2b650 42 54 52 45 45 5f 46 4c 41 47 29 20 29 7b 0a 20  BTREE_FLAG) ){. 
2b660 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2b670 20 20 69 6e 74 20 6e 52 65 63 20 3d 20 70 61 67    int nRec = pag
2b680 65 47 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20  eGetNRec(aData, 
2b690 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 66 6f  nData);.      fo
2b6a0 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69  r(i=0; i<nRec; i
2b6b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
2b6c0 20 69 54 6f 70 69 63 31 2c 20 69 54 6f 70 69 63   iTopic1, iTopic
2b6d0 32 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 47  2;.        pageG
2b6e0 65 74 4b 65 79 43 6f 70 79 28 70 44 62 2d 3e 70  etKeyCopy(pDb->p
2b6f0 45 6e 76 2c 20 70 53 65 67 2c 20 70 50 67 2c 20  Env, pSeg, pPg, 
2b700 69 2c 20 26 69 54 6f 70 69 63 31 2c 20 26 62 6c  i, &iTopic1, &bl
2b710 6f 62 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  ob1);..        i
2b720 66 28 20 69 3d 3d 30 20 26 26 20 62 6c 6f 62 32  f( i==0 && blob2
2b730 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  .nData ){.      
2b740 20 20 20 20 61 73 73 65 72 74 28 20 73 6f 72 74      assert( sort
2b750 65 64 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  edKeyCompare(.  
2b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
2b770 62 2d 3e 78 43 6d 70 2c 20 69 54 6f 70 69 63 32  b->xCmp, iTopic2
2b780 2c 20 62 6c 6f 62 32 2e 70 44 61 74 61 2c 20 62  , blob2.pData, b
2b790 6c 6f 62 32 2e 6e 44 61 74 61 2c 0a 20 20 20 20  lob2.nData,.    
2b7a0 20 20 20 20 20 20 20 20 20 20 20 20 69 54 6f 70              iTop
2b7b0 69 63 31 2c 20 62 6c 6f 62 31 2e 70 44 61 74 61  ic1, blob1.pData
2b7c0 2c 20 62 6c 6f 62 31 2e 6e 44 61 74 61 0a 20 20  , blob1.nData.  
2b7d0 20 20 20 20 20 20 20 20 29 3c 30 20 29 3b 0a 20          )<0 );. 
2b7e0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2b7f0 20 20 69 66 28 20 69 3c 28 6e 52 65 63 2d 31 29    if( i<(nRec-1)
2b800 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
2b810 67 65 47 65 74 4b 65 79 43 6f 70 79 28 70 44 62  geGetKeyCopy(pDb
2b820 2d 3e 70 45 6e 76 2c 20 70 53 65 67 2c 20 70 50  ->pEnv, pSeg, pP
2b830 67 2c 20 69 2b 31 2c 20 26 69 54 6f 70 69 63 32  g, i+1, &iTopic2
2b840 2c 20 26 62 6c 6f 62 32 29 3b 0a 20 20 20 20 20  , &blob2);.     
2b850 20 20 20 20 20 61 73 73 65 72 74 28 20 73 6f 72       assert( sor
2b860 74 65 64 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  tedKeyCompare(. 
2b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2b880 44 62 2d 3e 78 43 6d 70 2c 20 69 54 6f 70 69 63  Db->xCmp, iTopic
2b890 31 2c 20 62 6c 6f 62 31 2e 70 44 61 74 61 2c 20  1, blob1.pData, 
2b8a0 62 6c 6f 62 31 2e 6e 44 61 74 61 2c 0a 20 20 20  blob1.nData,.   
2b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 54 6f               iTo
2b8c0 70 69 63 32 2c 20 62 6c 6f 62 32 2e 70 44 61 74  pic2, blob2.pDat
2b8d0 61 2c 20 62 6c 6f 62 32 2e 6e 44 61 74 61 0a 20  a, blob2.nData. 
2b8e0 20 20 20 20 20 20 20 20 20 29 3c 30 20 29 3b 0a           )<0 );.
2b8f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b900 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c 73 6d  }.    }..    lsm
2b910 46 73 44 62 50 61 67 65 4e 65 78 74 28 70 53 65  FsDbPageNext(pSe
2b920 67 2c 20 70 50 67 2c 20 31 2c 20 26 70 4e 65 78  g, pPg, 1, &pNex
2b930 74 29 3b 0a 20 20 20 20 6c 73 6d 46 73 50 61 67  t);.    lsmFsPag
2b940 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
2b950 20 20 20 70 50 67 20 3d 20 70 4e 65 78 74 3b 0a     pPg = pNext;.
2b960 20 20 7d 0a 0a 20 20 73 6f 72 74 65 64 42 6c 6f    }..  sortedBlo
2b970 62 46 72 65 65 28 26 62 6c 6f 62 31 29 3b 0a 20  bFree(&blob1);. 
2b980 20 73 6f 72 74 65 64 42 6c 6f 62 46 72 65 65 28   sortedBlobFree(
2b990 26 62 6c 6f 62 32 29 3b 0a 7d 0a 23 65 6e 64 69  &blob2);.}.#endi
2b9a0 66 0a 0a 23 69 66 64 65 66 20 4c 53 4d 5f 44 45  f..#ifdef LSM_DE
2b9b0 42 55 47 5f 45 58 50 45 4e 53 49 56 45 0a 2f 2a  BUG_EXPENSIVE./*
2b9c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2b9d0 6e 20 69 73 20 6f 6e 6c 79 20 69 6e 63 6c 75 64  n is only includ
2b9e0 65 64 20 69 6e 20 74 68 65 20 62 75 69 6c 64 20  ed in the build 
2b9f0 69 66 20 4c 53 4d 5f 44 45 42 55 47 5f 45 58 50  if LSM_DEBUG_EXP
2ba00 45 4e 53 49 56 45 20 69 73 20 0a 2a 2a 20 64 65  ENSIVE is .** de
2ba10 66 69 6e 65 64 2e 20 49 74 73 20 6f 6e 6c 79 20  fined. Its only 
2ba20 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20 65 76  purpose is to ev
2ba30 61 6c 75 61 74 65 20 76 61 72 69 6f 75 73 20 61  aluate various a
2ba40 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
2ba50 74 73 20 74 6f 20 0a 2a 2a 20 76 65 72 69 66 79  ts to .** verify
2ba60 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
2ba70 73 65 20 69 73 20 77 65 6c 6c 20 66 6f 72 6d 65  se is well forme
2ba80 64 20 69 6e 20 63 65 72 74 61 69 6e 20 72 65 73  d in certain res
2ba90 70 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72  pects..**.** Mor
2baa0 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
2bab0 69 74 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  it checks that t
2bac0 68 65 20 61 72 72 61 79 20 70 4f 6e 65 20 63 6f  he array pOne co
2bad0 6e 74 61 69 6e 73 20 74 68 65 20 72 65 71 75 69  ntains the requi
2bae0 72 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 73  red .** pointers
2baf0 20 74 6f 20 70 54 77 6f 2e 20 41 72 72 61 79 20   to pTwo. Array 
2bb00 70 54 77 6f 20 6d 75 73 74 20 62 65 20 61 20 6d  pTwo must be a m
2bb10 61 69 6e 20 61 72 72 61 79 2e 20 70 4f 6e 65 20  ain array. pOne 
2bb20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
2bb30 0a 2a 2a 20 73 65 70 61 72 61 74 6f 72 73 20 61  .** separators a
2bb40 72 72 61 79 20 6f 72 20 61 6e 6f 74 68 65 72 20  rray or another 
2bb50 6d 61 69 6e 20 61 72 72 61 79 2e 20 49 66 20 70  main array. If p
2bb60 4f 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  One does not con
2bb70 74 61 69 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72  tain the .** cor
2bb80 72 65 63 74 20 73 65 74 20 6f 66 20 70 6f 69 6e  rect set of poin
2bb90 74 65 72 73 2c 20 61 6e 20 61 73 73 65 72 74 28  ters, an assert(
2bba0 29 20 73 74 61 74 65 6d 65 6e 74 20 66 61 69 6c  ) statement fail
2bbb0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2bbc0 20 61 73 73 65 72 74 50 6f 69 6e 74 65 72 73 4f   assertPointersO
2bbd0 6b 28 0a 20 20 6c 73 6d 5f 64 62 20 2a 70 44 62  k(.  lsm_db *pDb
2bbe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bbf0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2bc00 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 53 65 67   handle */.  Seg
2bc10 6d 65 6e 74 20 2a 70 4f 6e 65 2c 20 20 20 20 20  ment *pOne,     
2bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bc30 53 65 67 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69  Segment containi
2bc40 6e 67 20 70 6f 69 6e 74 65 72 73 20 2a 2f 0a 20  ng pointers */. 
2bc50 20 53 65 67 6d 65 6e 74 20 2a 70 54 77 6f 2c 20   Segment *pTwo, 
2bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc70 20 2f 2a 20 53 65 67 6d 65 6e 74 20 63 6f 6e 74   /* Segment cont
2bc80 61 69 6e 69 6e 67 20 70 6f 69 6e 74 65 72 20 74  aining pointer t
2bc90 61 72 67 65 74 73 20 2a 2f 0a 20 20 69 6e 74 20  argets */.  int 
2bca0 62 52 68 73 20 20 20 20 20 20 20 20 20 20 20 20  bRhs            
2bcb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2bcc0 72 75 65 20 69 66 20 70 54 77 6f 20 6d 61 79 20  rue if pTwo may 
2bcd0 68 61 76 65 20 62 65 65 6e 20 47 6f 62 62 6c 65  have been Gobble
2bce0 28 29 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ()d */.){.  int 
2bcf0 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20  rc = LSM_OK;    
2bd00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2bd10 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 53  rror code */.  S
2bd20 65 67 6d 65 6e 74 50 74 72 20 70 74 72 31 3b 20  egmentPtr ptr1; 
2bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bd40 2a 20 49 74 65 72 61 74 65 73 20 74 68 72 6f 75  * Iterates throu
2bd50 67 68 20 70 4f 6e 65 20 2a 2f 0a 20 20 53 65 67  gh pOne */.  Seg
2bd60 6d 65 6e 74 50 74 72 20 70 74 72 32 3b 20 20 20  mentPtr ptr2;   
2bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bd80 49 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68  Iterates through
2bd90 20 70 54 77 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20   pTwo */.  Pgno 
2bda0 69 50 72 65 76 3b 0a 0a 20 20 61 73 73 65 72 74  iPrev;..  assert
2bdb0 28 20 70 4f 6e 65 20 26 26 20 70 54 77 6f 20 29  ( pOne && pTwo )
2bdc0 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 70 74 72  ;..  memset(&ptr
2bdd0 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 74 72  1, 0, sizeof(ptr
2bde0 31 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  1));.  memset(&p
2bdf0 74 72 32 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  tr2, 0, sizeof(p
2be00 74 72 31 29 29 3b 0a 20 20 70 74 72 31 2e 70 53  tr1));.  ptr1.pS
2be10 65 67 20 3d 20 70 4f 6e 65 3b 0a 20 20 70 74 72  eg = pOne;.  ptr
2be20 32 2e 70 53 65 67 20 3d 20 70 54 77 6f 3b 0a 20  2.pSeg = pTwo;. 
2be30 20 73 65 67 6d 65 6e 74 50 74 72 45 6e 64 50 61   segmentPtrEndPa
2be40 67 65 28 70 44 62 2d 3e 70 46 53 2c 20 26 70 74  ge(pDb->pFS, &pt
2be50 72 31 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 73  r1, 0, &rc);.  s
2be60 65 67 6d 65 6e 74 50 74 72 45 6e 64 50 61 67 65  egmentPtrEndPage
2be70 28 70 44 62 2d 3e 70 46 53 2c 20 26 70 74 72 32  (pDb->pFS, &ptr2
2be80 2c 20 30 2c 20 26 72 63 29 3b 0a 0a 20 20 2f 2a  , 0, &rc);..  /*
2be90 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2bea0 66 6f 6f 74 65 72 20 70 6f 69 6e 74 65 72 20 6f  footer pointer o
2beb0 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
2bec0 20 6f 66 20 70 4f 6e 65 20 70 6f 69 6e 74 73 20   of pOne points 
2bed0 74 6f 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  to.  ** the firs
2bee0 74 20 70 61 67 65 20 6f 66 20 70 54 77 6f 2e 20  t page of pTwo. 
2bef0 2a 2f 0a 20 20 69 50 72 65 76 20 3d 20 70 54 77  */.  iPrev = pTw
2bf00 6f 2d 3e 69 46 69 72 73 74 3b 0a 20 20 69 66 28  o->iFirst;.  if(
2bf10 20 70 74 72 31 2e 69 50 74 72 21 3d 69 50 72 65   ptr1.iPtr!=iPre
2bf20 76 20 26 26 20 21 62 52 68 73 20 29 7b 0a 20 20  v && !bRhs ){.  
2bf30 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
2bf40 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 4c 53   }..  if( rc==LS
2bf50 4d 5f 4f 4b 20 26 26 20 70 74 72 31 2e 6e 43 65  M_OK && ptr1.nCe
2bf60 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  ll>0 ){.    rc =
2bf70 20 73 65 67 6d 65 6e 74 50 74 72 4c 6f 61 64 43   segmentPtrLoadC
2bf80 65 6c 6c 28 26 70 74 72 31 2c 20 30 29 3b 0a 20  ell(&ptr1, 0);. 
2bf90 20 7d 0a 20 20 20 20 20 20 0a 20 20 77 68 69 6c   }.      .  whil
2bfa0 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 26 26  e( rc==LSM_OK &&
2bfb0 20 70 74 72 32 2e 70 50 67 20 29 7b 0a 20 20 20   ptr2.pPg ){.   
2bfc0 20 50 67 6e 6f 20 69 54 68 69 73 3b 0a 0a 20 20   Pgno iThis;..  
2bfd0 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20    /* Advance to 
2bfe0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6f 66  the next page of
2bff0 20 73 65 67 6d 65 6e 74 20 70 54 77 6f 20 74 68   segment pTwo th
2c000 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  at contains at l
2c010 65 61 73 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20  east.    ** one 
2c020 63 65 6c 6c 2e 20 42 72 65 61 6b 20 6f 75 74 20  cell. Break out 
2c030 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
2c040 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63  he iterator reac
2c050 68 65 73 20 45 4f 46 2e 20 20 2a 2f 0a 20 20 20  hes EOF.  */.   
2c060 20 64 6f 7b 0a 20 20 20 20 20 20 72 63 20 3d 20   do{.      rc = 
2c070 73 65 67 6d 65 6e 74 50 74 72 4e 65 78 74 50 61  segmentPtrNextPa
2c080 67 65 28 26 70 74 72 32 2c 20 31 29 3b 0a 20 20  ge(&ptr2, 1);.  
2c090 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2c0a0 4c 53 4d 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 77  LSM_OK );.    }w
2c0b0 68 69 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b  hile( rc==LSM_OK
2c0c0 20 26 26 20 70 74 72 32 2e 70 50 67 20 26 26 20   && ptr2.pPg && 
2c0d0 70 74 72 32 2e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ptr2.nCell==0 );
2c0e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 4c 53 4d  .    if( rc!=LSM
2c0f0 5f 4f 4b 20 7c 7c 20 70 74 72 32 2e 70 50 67 3d  _OK || ptr2.pPg=
2c100 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2c110 69 54 68 69 73 20 3d 20 6c 73 6d 46 73 50 61 67  iThis = lsmFsPag
2c120 65 4e 75 6d 62 65 72 28 70 74 72 32 2e 70 50 67  eNumber(ptr2.pPg
2c130 29 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 74 72  );..    if( (ptr
2c140 32 2e 66 6c 61 67 73 20 26 20 28 50 47 46 54 52  2.flags & (PGFTR
2c150 5f 53 4b 49 50 5f 54 48 49 53 5f 46 4c 41 47 7c  _SKIP_THIS_FLAG|
2c160 53 45 47 4d 45 4e 54 5f 42 54 52 45 45 5f 46 4c  SEGMENT_BTREE_FL
2c170 41 47 29 29 3d 3d 30 20 29 7b 0a 0a 20 20 20 20  AG))==0 ){..    
2c180 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 66 69    /* Load the fi
2c190 72 73 74 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  rst cell in the 
2c1a0 61 72 72 61 79 20 70 54 77 6f 20 70 61 67 65 2e  array pTwo page.
2c1b0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
2c1c0 65 67 6d 65 6e 74 50 74 72 4c 6f 61 64 43 65 6c  egmentPtrLoadCel
2c1d0 6c 28 26 70 74 72 32 2c 20 30 29 3b 0a 0a 20 20  l(&ptr2, 0);..  
2c1e0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 66      /* Iterate f
2c1f0 6f 72 77 61 72 64 73 20 74 68 72 6f 75 67 68 20  orwards through 
2c200 70 4f 6e 65 2c 20 73 65 61 72 63 68 69 6e 67 20  pOne, searching 
2c210 66 6f 72 20 61 20 6b 65 79 20 74 68 61 74 20 6d  for a key that m
2c220 61 74 63 68 65 73 20 74 68 65 0a 20 20 20 20 20  atches the.     
2c230 20 2a 2a 20 6b 65 79 20 70 74 72 32 2e 70 4b 65   ** key ptr2.pKe
2c240 79 2f 6e 4b 65 79 2e 20 54 68 69 73 20 6b 65 79  y/nKey. This key
2c250 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 20 70   should have a p
2c260 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
2c270 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ge that.      **
2c280 20 70 74 72 32 20 63 75 72 72 65 6e 74 6c 79 20   ptr2 currently 
2c290 70 6f 69 6e 74 73 20 74 6f 2e 20 2a 2f 0a 20 20  points to. */.  
2c2a0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 4c      while( rc==L
2c2b0 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  SM_OK ){.       
2c2c0 20 69 6e 74 20 72 65 73 20 3d 20 72 74 54 6f 70   int res = rtTop
2c2d0 69 63 28 70 74 72 31 2e 65 54 79 70 65 29 20 2d  ic(ptr1.eType) -
2c2e0 20 72 74 54 6f 70 69 63 28 70 74 72 32 2e 65 54   rtTopic(ptr2.eT
2c2f0 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ype);.        if
2c300 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
2c310 20 20 20 20 20 20 72 65 73 20 3d 20 70 44 62 2d        res = pDb-
2c320 3e 78 43 6d 70 28 70 74 72 31 2e 70 4b 65 79 2c  >xCmp(ptr1.pKey,
2c330 20 70 74 72 31 2e 6e 4b 65 79 2c 20 70 74 72 32   ptr1.nKey, ptr2
2c340 2e 70 4b 65 79 2c 20 70 74 72 32 2e 6e 4b 65 79  .pKey, ptr2.nKey
2c350 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
2c360 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20        if( res<0 
2c370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
2c380 65 72 74 28 20 62 52 68 73 20 7c 7c 20 70 74 72  ert( bRhs || ptr
2c390 31 2e 69 50 74 72 2b 70 74 72 31 2e 69 50 67 50  1.iPtr+ptr1.iPgP
2c3a0 74 72 3d 3d 69 50 72 65 76 20 29 3b 0a 20 20 20  tr==iPrev );.   
2c3b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
2c3c0 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  es>0 ){.        
2c3d0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20    assert( 0 );. 
2c3e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c3f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c400 70 74 72 31 2e 69 50 74 72 2b 70 74 72 31 2e 69  ptr1.iPtr+ptr1.i
2c410 50 67 50 74 72 3d 3d 69 54 68 69 73 20 29 3b 0a  PgPtr==iThis );.
2c420 20 20 20 20 20 20 20 20 20 20 69 50 72 65 76 20            iPrev 
2c430 3d 20 69 54 68 69 73 3b 0a 20 20 20 20 20 20 20  = iThis;.       
2c440 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2c450 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
2c460 3d 20 73 65 67 6d 65 6e 74 50 74 72 41 64 76 61  = segmentPtrAdva
2c470 6e 63 65 28 30 2c 20 26 70 74 72 31 2c 20 30 29  nce(0, &ptr1, 0)
2c480 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 74  ;.        if( pt
2c490 72 31 2e 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  r1.pPg==0 ){.   
2c4a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30         assert( 0
2c4b0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
2c4c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2c4d0 0a 20 20 73 65 67 6d 65 6e 74 50 74 72 52 65 73  .  segmentPtrRes
2c4e0 65 74 28 26 70 74 72 31 2c 20 30 29 3b 0a 20 20  et(&ptr1, 0);.  
2c4f0 73 65 67 6d 65 6e 74 50 74 72 52 65 73 65 74 28  segmentPtrReset(
2c500 26 70 74 72 32 2c 20 30 29 3b 0a 20 20 72 65 74  &ptr2, 0);.  ret
2c510 75 72 6e 20 4c 53 4d 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn LSM_OK;.}../
2c520 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2c530 6f 6e 20 69 73 20 6f 6e 6c 79 20 69 6e 63 6c 75  on is only inclu
2c540 64 65 64 20 69 6e 20 74 68 65 20 62 75 69 6c 64  ded in the build
2c550 20 69 66 20 4c 53 4d 5f 44 45 42 55 47 5f 45 58   if LSM_DEBUG_EX
2c560 50 45 4e 53 49 56 45 20 69 73 20 0a 2a 2a 20 64  PENSIVE is .** d
2c570 65 66 69 6e 65 64 2e 20 49 74 73 20 6f 6e 6c 79  efined. Its only
2c580 20 70 75 72 70 6f 73 65 20 69 73 20 74 6f 20 65   purpose is to e
2c590 76 61 6c 75 61 74 65 20 76 61 72 69 6f 75 73 20  valuate various 
2c5a0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
2c5b0 6e 74 73 20 74 6f 20 0a 2a 2a 20 76 65 72 69 66  nts to .** verif
2c5c0 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  y that the datab
2c5d0 61 73 65 20 69 73 20 77 65 6c 6c 20 66 6f 72 6d  ase is well form
2c5e0 65 64 20 69 6e 20 63 65 72 74 61 69 6e 20 72 65  ed in certain re
2c5f0 73 70 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  spects..**.** Mo
2c600 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c  re specifically,
2c610 20 69 74 20 63 68 65 63 6b 73 20 74 68 61 74 20   it checks that 
2c620 74 68 65 20 62 2d 74 72 65 65 20 65 6d 62 65 64  the b-tree embed
2c630 64 65 64 20 69 6e 20 61 72 72 61 79 20 70 52 75  ded in array pRu
2c640 6e 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68  n.** contains th
2c650 65 20 63 6f 72 72 65 63 74 20 6b 65 79 73 2e 20  e correct keys. 
2c660 49 66 20 6e 6f 74 2c 20 61 6e 20 61 73 73 65 72  If not, an asser
2c670 74 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  t() fails..*/.st
2c680 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 42  atic int assertB
2c690 74 72 65 65 4f 6b 28 0a 20 20 6c 73 6d 5f 64 62  treeOk(.  lsm_db
2c6a0 20 2a 70 44 62 2c 0a 20 20 53 65 67 6d 65 6e 74   *pDb,.  Segment
2c6b0 20 2a 70 53 65 67 0a 29 7b 0a 20 20 69 6e 74 20   *pSeg.){.  int 
2c6c0 72 63 20 3d 20 4c 53 4d 5f 4f 4b 3b 20 20 20 20  rc = LSM_OK;    
2c6d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2c6e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2c6f0 69 66 28 20 70 53 65 67 2d 3e 69 52 6f 6f 74 20  if( pSeg->iRoot 
2c700 29 7b 0a 20 20 20 20 42 6c 6f 62 20 62 6c 6f 62  ){.    Blob blob
2c710 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 20 20   = {0, 0, 0};   
2c720 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75       /* Buffer u
2c730 73 65 64 20 74 6f 20 63 61 63 68 65 20 6f 76 65  sed to cache ove
2c740 72 66 6c 6f 77 20 6b 65 79 73 20 2a 2f 0a 20 20  rflow keys */.  
2c750 20 20 46 69 6c 65 53 79 73 74 65 6d 20 2a 70 46    FileSystem *pF
2c760 53 20 3d 20 70 44 62 2d 3e 70 46 53 3b 20 20 20  S = pDb->pFS;   
2c770 2f 2a 20 46 69 6c 65 20 73 79 73 74 65 6d 20 74  /* File system t
2c780 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
2c790 20 20 20 50 61 67 65 20 2a 70 50 67 20 3d 20 30     Page *pPg = 0
2c7a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c7b0 20 2f 2a 20 4d 61 69 6e 20 72 75 6e 20 70 61 67   /* Main run pag
2c7c0 65 20 2a 2f 0a 20 20 20 20 42 74 72 65 65 43 75  e */.    BtreeCu
2c7d0 72 73 6f 72 20 2a 70 43 73 72 20 3d 20 30 3b 20  rsor *pCsr = 0; 
2c7e0 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
2c7f0 63 75 72 73 6f 72 20 2a 2f 0a 0a 20 20 20 20 72  cursor */..    r
2c800 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 4e  c = btreeCursorN
2c810 65 77 28 70 44 62 2c 20 70 53 65 67 2c 20 26 70  ew(pDb, pSeg, &p
2c820 43 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Csr);.    if( rc
2c830 3d 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20  ==LSM_OK ){.    
2c840 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
2c850 6f 72 46 69 72 73 74 28 70 43 73 72 29 3b 0a 20  orFirst(pCsr);. 
2c860 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2c870 3d 4c 53 4d 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  =LSM_OK ){.     
2c880 20 72 63 20 3d 20 6c 73 6d 46 73 44 62 50 61 67   rc = lsmFsDbPag
2c890 65 47 65 74 28 70 46 53 2c 20 70 53 65 67 2c 20  eGet(pFS, pSeg, 
2c8a0 70 53 65 67 2d 3e 69 46 69 72 73 74 2c 20 26 70  pSeg->iFirst, &p
2c8b0 50 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Pg);.    }..    
2c8c0 77 68 69 6c 65 28 20 72 63 3d 3d 4c 53 4d 5f 4f  while( rc==LSM_O
2c8d0 4b 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 20  K ){.      Page 
2c8e0 2a 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 75 38  *pNext;.      u8
2c8f0 20 2a 61 44 61 74 61 3b 0a 20 20 20 20 20 20 69   *aData;.      i
2c900 6e 74 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20  nt nData;.      
2c910 69 6e 74 20 66 6c 61 67 73 3b 0a 0a 20 20 20 20  int flags;..    
2c920 20 20 72 63 20 3d 20 6c 73 6d 46 73 44 62 50 61    rc = lsmFsDbPa
2c930 67 65 4e 65 78 74 28 70 53 65 67 2c 20 70 50 67  geNext(pSeg, pPg
2c940 2c 20 31 2c 20 26 70 4e 65 78 74 29 3b 0a 20 20  , 1, &pNext);.  
2c950 20 20 20 20 6c 73 6d 46 73 50 61 67 65 52 65 6c      lsmFsPageRel
2c960 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 20  ease(pPg);.     
2c970 20 70 50 67 20 3d 20 70 4e 65 78 74 3b 0a 20 20   pPg = pNext;.  
2c980 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
2c990 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 44   break;.      aD
2c9a0 61 74 61 20 3d 20 66 73 50 61 67 65 44 61 74 61  ata = fsPageData
2c9b0 28 70 50 67 2c 20 26 6e 44 61 74 61 29 3b 0a 20  (pPg, &nData);. 
2c9c0 20 20 20 20 20 66 6c 61 67 73 20 3d 20 70 61 67       flags = pag
2c9d0 65 47 65 74 46 6c 61 67 73 28 61 44 61 74 61 2c  eGetFlags(aData,
2c9e0 20 6e 44 61 74 61 29 3b 0a 20 20 20 20 20 20 69   nData);.      i
2c9f0 66 28 20 72 63 3d 3d 4c 53 4d 5f 4f 4b 20 0a 20  f( rc==LSM_OK . 
2ca00 20 20 20 20 20 20 26 26 20 30 3d 3d 28 28 53 45        && 0==((SE
2ca10 47 4d 45 4e 54 5f 42 54 52 45 45 5f 46 4c 41 47  GMENT_BTREE_FLAG
2ca20 7c 50 47 46 54 52 5f 53 4b 49 50 5f 54 48 49 53  |PGFTR_SKIP_THIS
2ca30 5f 46 4c 41 47 29 20 26 20 66 6c 61 67 73 29 0a  _FLAG) & flags).
2ca40 20 20 20 20 20 20 20 26 26 20 30 21 3d 70 61 67         && 0!=pag
2ca50 65 47 65 74 4e 52 65 63 28 61 44 61 74 61 2c 20  eGetNRec(aData, 
2ca60 6e 44 61 74 61 29 0a 20 20 20 20 20 20 29 7b 0a  nData).      ){.
2ca70 20 20 20 20 20 20 20 20 75 38 20 2a 70 4b 65 79          u8 *pKey
2ca80 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4b  ;.        int nK
2ca90 65 79 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ey;.        int 
2caa0 69 54 6f 70 69 63 3b 0a 20 20 20 20 20 20 20 20  iTopic;.        
2cab0 70 4b 65 79 20 3d 20 70 61 67 65 47 65 74 4b 65  pKey = pageGetKe
2cac0 79 28 70 53 65 67 2c 20 70 50 67 2c 20 30 2c 20  y(pSeg, pPg, 0, 
2cad0 26 69 54 6f 70 69 63 2c 20 26 6e 4b 65 79 2c 20  &iTopic, &nKey, 
2cae0 26 62 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20  &blob);.        
2caf0 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 70 43  assert( nKey==pC
2cb00 73 72 2d 3e 6e 4b 65 79 20 26 26 20 30 3d 3d 6d  sr->nKey && 0==m
2cb10 65 6d 63 6d 70 28 70 4b 65 79 2c 20 70 43 73 72  emcmp(pKey, pCsr
2cb20 2d 3e 70 4b 65 79 2c 20 6e 4b 65 79 29 20 29 3b  ->pKey, nKey) );
2cb30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2cb40 20 6c 73 6d 46 73 50 61 67 65 4e 75 6d 62 65 72   lsmFsPageNumber
2cb50 28 70 50 67 29 3d 3d 70 43 73 72 2d 3e 69 50 74  (pPg)==pCsr->iPt
2cb60 72 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r );.        rc 
2cb70 3d 20 62 74 72 65 65 43 75 72 73 6f 72 4e 65 78  = btreeCursorNex
2cb80 74 28 70 43 73 72 29 3b 0a 20 20 20 20 20 20 7d  t(pCsr);.      }
2cb90 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2cba0 74 28 20 72 63 21 3d 4c 53 4d 5f 4f 4b 20 7c 7c  t( rc!=LSM_OK ||
2cbb0 20 70 43 73 72 2d 3e 70 4b 65 79 3d 3d 30 20 29   pCsr->pKey==0 )
2cbc0 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 67 20 29  ;..    if( pPg )
2cbd0 20 6c 73 6d 46 73 50 61 67 65 52 65 6c 65 61 73   lsmFsPageReleas
2cbe0 65 28 70 50 67 29 3b 0a 0a 20 20 20 20 62 74 72  e(pPg);..    btr
2cbf0 65 65 43 75 72 73 6f 72 46 72 65 65 28 70 43 73  eeCursorFree(pCs
2cc00 72 29 3b 0a 20 20 20 20 73 6f 72 74 65 64 42 6c  r);.    sortedBl
2cc10 6f 62 46 72 65 65 28 26 62 6c 6f 62 29 3b 0a 20  obFree(&blob);. 
2cc20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2cc30 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64  .}.#endif /* ifd
2cc40 65 66 20 4c 53 4d 5f 44 45 42 55 47 5f 45 58 50  ef LSM_DEBUG_EXP
2cc50 45 4e 53 49 56 45 20 2a 2f 0a                    ENSIVE */.