# Set up some point keys, point tombstones x, range tombstones o--o,
# and intents []. The initial state is:
#
# 7                         [g7]
# 6
# 5          o-------------------------------o
# 4
# 3  o---------------------------------------o
# 2                  x
# 1              d1  e1  f1  g1      1   1
#    a   b   c   d   e   f   g   h   i   j   k
run stats ok
put k=d ts=1 v=d1
put k=e ts=1 v=e1
del k=e ts=2
put k=f ts=1 v=f1
put k=g ts=1 v=g1
increment k=i ts=1
increment k=j ts=1
del_range_ts k=a end=k ts=3
del_range_ts k=c end=k ts=5
with t=A ts=7
  txn_begin
  put k=g v=7
----
>> put k=d ts=1 v=d1
stats: key_count=+1 key_bytes=+14 val_count=+1 val_bytes=+7 live_count=+1 live_bytes=+21
>> put k=e ts=1 v=e1
stats: key_count=+1 key_bytes=+14 val_count=+1 val_bytes=+7 live_count=+1 live_bytes=+21
>> del k=e ts=2
del: "e": found key true
stats: key_bytes=+12 val_count=+1 live_count=-1 live_bytes=-21 gc_bytes_age=+3234
>> put k=f ts=1 v=f1
stats: key_count=+1 key_bytes=+14 val_count=+1 val_bytes=+7 live_count=+1 live_bytes=+21
>> put k=g ts=1 v=g1
stats: key_count=+1 key_bytes=+14 val_count=+1 val_bytes=+7 live_count=+1 live_bytes=+21
>> increment k=i ts=1
inc: current value = 1
stats: key_count=+1 key_bytes=+14 val_count=+1 val_bytes=+6 live_count=+1 live_bytes=+20
>> increment k=j ts=1
inc: current value = 1
stats: key_count=+1 key_bytes=+14 val_count=+1 val_bytes=+6 live_count=+1 live_bytes=+20
>> del_range_ts k=a end=k ts=3
stats: range_key_count=+1 range_key_bytes=+13 range_val_count=+1 live_count=-5 live_bytes=-103 gc_bytes_age=+11252
>> del_range_ts k=c end=k ts=5
stats: range_key_count=+1 range_key_bytes=+22 range_val_count=+2 gc_bytes_age=+2108
>> put k=g v=7 t=A ts=7
put: lock acquisition = {g id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0 Replicated Intent []}
stats: key_bytes=+12 val_count=+1 val_bytes=+54 live_count=+1 live_bytes=+68 gc_bytes_age=-194 intent_count=+1 intent_bytes=+18 lock_count=+1 lock_age=+93
>> at end:
txn: "A" meta={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} lock=true stat=PENDING rts=7.000000000,0 wto=false gul=0,0
rangekey: {a-c}/[3.000000000,0=/<empty>]
rangekey: {c-k}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
data: "d"/1.000000000,0 -> /BYTES/d1
data: "e"/2.000000000,0 -> /<empty>
data: "e"/1.000000000,0 -> /BYTES/e1
data: "f"/1.000000000,0 -> /BYTES/f1
meta: "g"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "g"/7.000000000,0 -> /BYTES/7
data: "g"/1.000000000,0 -> /BYTES/g1
data: "i"/1.000000000,0 -> /INT/1
data: "j"/1.000000000,0 -> /INT/1
stats: key_count=6 key_bytes=108 val_count=8 val_bytes=94 range_key_count=2 range_key_bytes=35 range_val_count=3 live_count=1 live_bytes=68 gc_bytes_age=16400 intent_count=1 intent_bytes=18 lock_count=1 lock_age=93

# Inline value or tombstone below range tombstone should error.
run stats error
put k=b ts=0 v=b0
----
>> put k=b ts=0 v=b0
stats: no change
>> at end:
rangekey: {a-c}/[3.000000000,0=/<empty>]
rangekey: {c-k}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
data: "d"/1.000000000,0 -> /BYTES/d1
data: "e"/2.000000000,0 -> /<empty>
data: "e"/1.000000000,0 -> /BYTES/e1
data: "f"/1.000000000,0 -> /BYTES/f1
meta: "g"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "g"/7.000000000,0 -> /BYTES/7
data: "g"/1.000000000,0 -> /BYTES/g1
data: "i"/1.000000000,0 -> /INT/1
data: "j"/1.000000000,0 -> /INT/1
stats: key_count=6 key_bytes=108 val_count=8 val_bytes=94 range_key_count=2 range_key_bytes=35 range_val_count=3 live_count=1 live_bytes=68 gc_bytes_age=16400 intent_count=1 intent_bytes=18 lock_count=1 lock_age=93
error: (*withstack.withStack:) "b"/0,0: put is inline=true, but existing value is inline=false

run stats error
del k=b ts=0
----
>> del k=b ts=0
stats: no change
>> at end:
rangekey: {a-c}/[3.000000000,0=/<empty>]
rangekey: {c-k}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
data: "d"/1.000000000,0 -> /BYTES/d1
data: "e"/2.000000000,0 -> /<empty>
data: "e"/1.000000000,0 -> /BYTES/e1
data: "f"/1.000000000,0 -> /BYTES/f1
meta: "g"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "g"/7.000000000,0 -> /BYTES/7
data: "g"/1.000000000,0 -> /BYTES/g1
data: "i"/1.000000000,0 -> /INT/1
data: "j"/1.000000000,0 -> /INT/1
stats: key_count=6 key_bytes=108 val_count=8 val_bytes=94 range_key_count=2 range_key_bytes=35 range_val_count=3 live_count=1 live_bytes=68 gc_bytes_age=16400 intent_count=1 intent_bytes=18 lock_count=1 lock_age=93
error: (*withstack.withStack:) "b"/0,0: put is inline=true, but existing value is inline=false

# DeleteRange at ts=5 should error with WriteTooOldError.
run stats error
del_range k=a end=f ts=5
----
>> del_range k=a end=f ts=5
stats: no change
>> at end:
rangekey: {a-c}/[3.000000000,0=/<empty>]
rangekey: {c-k}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
data: "d"/1.000000000,0 -> /BYTES/d1
data: "e"/2.000000000,0 -> /<empty>
data: "e"/1.000000000,0 -> /BYTES/e1
data: "f"/1.000000000,0 -> /BYTES/f1
meta: "g"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "g"/7.000000000,0 -> /BYTES/7
data: "g"/1.000000000,0 -> /BYTES/g1
data: "i"/1.000000000,0 -> /INT/1
data: "j"/1.000000000,0 -> /INT/1
stats: key_count=6 key_bytes=108 val_count=8 val_bytes=94 range_key_count=2 range_key_bytes=35 range_val_count=3 live_count=1 live_bytes=68 gc_bytes_age=16400 intent_count=1 intent_bytes=18 lock_count=1 lock_age=93
error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "c" at timestamp 5.000000000,0 too old; must write at or above 5.000000000,1

# Point key below range tombstones should error.
run stats error
put k=c ts=3 v=c3
----
>> put k=c ts=3 v=c3
stats: no change
>> at end:
rangekey: {a-c}/[3.000000000,0=/<empty>]
rangekey: {c-k}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
data: "d"/1.000000000,0 -> /BYTES/d1
data: "e"/2.000000000,0 -> /<empty>
data: "e"/1.000000000,0 -> /BYTES/e1
data: "f"/1.000000000,0 -> /BYTES/f1
meta: "g"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "g"/7.000000000,0 -> /BYTES/7
data: "g"/1.000000000,0 -> /BYTES/g1
data: "i"/1.000000000,0 -> /INT/1
data: "j"/1.000000000,0 -> /INT/1
stats: key_count=6 key_bytes=108 val_count=8 val_bytes=94 range_key_count=2 range_key_bytes=35 range_val_count=3 live_count=1 live_bytes=68 gc_bytes_age=16400 intent_count=1 intent_bytes=18 lock_count=1 lock_age=93
error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "c" at timestamp 3.000000000,0 too old; must write at or above 5.000000000,1

run stats error
put k=d ts=3 v=d3
----
>> put k=d ts=3 v=d3
stats: no change
>> at end:
rangekey: {a-c}/[3.000000000,0=/<empty>]
rangekey: {c-k}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
data: "d"/1.000000000,0 -> /BYTES/d1
data: "e"/2.000000000,0 -> /<empty>
data: "e"/1.000000000,0 -> /BYTES/e1
data: "f"/1.000000000,0 -> /BYTES/f1
meta: "g"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "g"/7.000000000,0 -> /BYTES/7
data: "g"/1.000000000,0 -> /BYTES/g1
data: "i"/1.000000000,0 -> /INT/1
data: "j"/1.000000000,0 -> /INT/1
stats: key_count=6 key_bytes=108 val_count=8 val_bytes=94 range_key_count=2 range_key_bytes=35 range_val_count=3 live_count=1 live_bytes=68 gc_bytes_age=16400 intent_count=1 intent_bytes=18 lock_count=1 lock_age=93
error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "d" at timestamp 3.000000000,0 too old; must write at or above 5.000000000,1

run stats error
put k=e ts=3 v=e3
----
>> put k=e ts=3 v=e3
stats: no change
>> at end:
rangekey: {a-c}/[3.000000000,0=/<empty>]
rangekey: {c-k}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
data: "d"/1.000000000,0 -> /BYTES/d1
data: "e"/2.000000000,0 -> /<empty>
data: "e"/1.000000000,0 -> /BYTES/e1
data: "f"/1.000000000,0 -> /BYTES/f1
meta: "g"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "g"/7.000000000,0 -> /BYTES/7
data: "g"/1.000000000,0 -> /BYTES/g1
data: "i"/1.000000000,0 -> /INT/1
data: "j"/1.000000000,0 -> /INT/1
stats: key_count=6 key_bytes=108 val_count=8 val_bytes=94 range_key_count=2 range_key_bytes=35 range_val_count=3 live_count=1 live_bytes=68 gc_bytes_age=16400 intent_count=1 intent_bytes=18 lock_count=1 lock_age=93
error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "e" at timestamp 3.000000000,0 too old; must write at or above 5.000000000,1

# CPuts expecting a value covered by a range tombstone should error.
run stats error
cput k=f ts=7 v=f7 cond=f1
----
>> cput k=f ts=7 v=f7 cond=f1
stats: no change
>> at end:
rangekey: {a-c}/[3.000000000,0=/<empty>]
rangekey: {c-k}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
data: "d"/1.000000000,0 -> /BYTES/d1
data: "e"/2.000000000,0 -> /<empty>
data: "e"/1.000000000,0 -> /BYTES/e1
data: "f"/1.000000000,0 -> /BYTES/f1
meta: "g"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "g"/7.000000000,0 -> /BYTES/7
data: "g"/1.000000000,0 -> /BYTES/g1
data: "i"/1.000000000,0 -> /INT/1
data: "j"/1.000000000,0 -> /INT/1
stats: key_count=6 key_bytes=108 val_count=8 val_bytes=94 range_key_count=2 range_key_bytes=35 range_val_count=3 live_count=1 live_bytes=68 gc_bytes_age=16400 intent_count=1 intent_bytes=18 lock_count=1 lock_age=93
error: (*kvpb.ConditionFailedError:) unexpected value: timestamp:<wall_time:5000000000 > 

# A CPut replay of an intent expecting a value covered by a range tombstone
# should error because of the range tombstone covering it.
run stats error
with t=A ts=7
  cput k=g v=g7 cond=g1
----
>> cput k=g v=g7 cond=g1 t=A ts=7
stats: no change
>> at end:
rangekey: {a-c}/[3.000000000,0=/<empty>]
rangekey: {c-k}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
data: "d"/1.000000000,0 -> /BYTES/d1
data: "e"/2.000000000,0 -> /<empty>
data: "e"/1.000000000,0 -> /BYTES/e1
data: "f"/1.000000000,0 -> /BYTES/f1
meta: "g"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "g"/7.000000000,0 -> /BYTES/7
data: "g"/1.000000000,0 -> /BYTES/g1
data: "i"/1.000000000,0 -> /INT/1
data: "j"/1.000000000,0 -> /INT/1
stats: key_count=6 key_bytes=108 val_count=8 val_bytes=94 range_key_count=2 range_key_bytes=35 range_val_count=3 live_count=1 live_bytes=68 gc_bytes_age=16400 intent_count=1 intent_bytes=18 lock_count=1 lock_age=93
error: (*kvpb.ConditionFailedError:) unexpected value: timestamp:<wall_time:5000000000 > 

# A CPut replacing an existing but ignored intent expecting a value covered
# by a range tombstone should error because of the range tombstone covering it.
run stats error
with t=A ts=7
  txn_step
  txn_ignore_seqs seqs=0-1
  cput k=g v=g7 cond=g1
----
>> cput k=g v=g7 cond=g1 t=A ts=7
stats: no change
>> at end:
txn: "A" meta={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=1} lock=true stat=PENDING rts=7.000000000,0 wto=false gul=0,0 isn=1
rangekey: {a-c}/[3.000000000,0=/<empty>]
rangekey: {c-k}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
data: "d"/1.000000000,0 -> /BYTES/d1
data: "e"/2.000000000,0 -> /<empty>
data: "e"/1.000000000,0 -> /BYTES/e1
data: "f"/1.000000000,0 -> /BYTES/f1
meta: "g"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "g"/7.000000000,0 -> /BYTES/7
data: "g"/1.000000000,0 -> /BYTES/g1
data: "i"/1.000000000,0 -> /INT/1
data: "j"/1.000000000,0 -> /INT/1
stats: key_count=6 key_bytes=108 val_count=8 val_bytes=94 range_key_count=2 range_key_bytes=35 range_val_count=3 live_count=1 live_bytes=68 gc_bytes_age=16400 intent_count=1 intent_bytes=18 lock_count=1 lock_age=93
error: (*kvpb.ConditionFailedError:) unexpected value: timestamp:<wall_time:5000000000 > 

# An InitPut with failOnTombstones above a range tombstone should error.
run stats error
initput k=f ts=7 v=f7 failOnTombstones
----
>> initput k=f ts=7 v=f7 failOnTombstones
stats: no change
>> at end:
rangekey: {a-c}/[3.000000000,0=/<empty>]
rangekey: {c-k}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
data: "d"/1.000000000,0 -> /BYTES/d1
data: "e"/2.000000000,0 -> /<empty>
data: "e"/1.000000000,0 -> /BYTES/e1
data: "f"/1.000000000,0 -> /BYTES/f1
meta: "g"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "g"/7.000000000,0 -> /BYTES/7
data: "g"/1.000000000,0 -> /BYTES/g1
data: "i"/1.000000000,0 -> /INT/1
data: "j"/1.000000000,0 -> /INT/1
stats: key_count=6 key_bytes=108 val_count=8 val_bytes=94 range_key_count=2 range_key_bytes=35 range_val_count=3 live_count=1 live_bytes=68 gc_bytes_age=16400 intent_count=1 intent_bytes=18 lock_count=1 lock_age=93
error: (*kvpb.ConditionFailedError:) unexpected value: timestamp:<wall_time:5000000000 > 

# An InitPut with a different value as an existing key should succeed when there's
# a range tombstone covering the existing value.
run stats ok
initput k=f ts=7 v=f7
----
>> initput k=f ts=7 v=f7
stats: key_bytes=+12 val_count=+1 val_bytes=+7 live_count=+1 live_bytes=+21 gc_bytes_age=-194
>> at end:
rangekey: {a-c}/[3.000000000,0=/<empty>]
rangekey: {c-k}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
data: "d"/1.000000000,0 -> /BYTES/d1
data: "e"/2.000000000,0 -> /<empty>
data: "e"/1.000000000,0 -> /BYTES/e1
data: "f"/7.000000000,0 -> /BYTES/f7
data: "f"/1.000000000,0 -> /BYTES/f1
meta: "g"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "g"/7.000000000,0 -> /BYTES/7
data: "g"/1.000000000,0 -> /BYTES/g1
data: "i"/1.000000000,0 -> /INT/1
data: "j"/1.000000000,0 -> /INT/1
stats: key_count=6 key_bytes=120 val_count=9 val_bytes=101 range_key_count=2 range_key_bytes=35 range_val_count=3 live_count=2 live_bytes=89 gc_bytes_age=16206 intent_count=1 intent_bytes=18 lock_count=1 lock_age=93

# An increment below a range tombstone throw a WriteTooOldError.
run stats error
increment k=i ts=2
----
>> increment k=i ts=2
stats: no change
>> at end:
rangekey: {a-c}/[3.000000000,0=/<empty>]
rangekey: {c-k}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
data: "d"/1.000000000,0 -> /BYTES/d1
data: "e"/2.000000000,0 -> /<empty>
data: "e"/1.000000000,0 -> /BYTES/e1
data: "f"/7.000000000,0 -> /BYTES/f7
data: "f"/1.000000000,0 -> /BYTES/f1
meta: "g"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "g"/7.000000000,0 -> /BYTES/7
data: "g"/1.000000000,0 -> /BYTES/g1
data: "i"/1.000000000,0 -> /INT/1
data: "j"/1.000000000,0 -> /INT/1
stats: key_count=6 key_bytes=120 val_count=9 val_bytes=101 range_key_count=2 range_key_bytes=35 range_val_count=3 live_count=2 live_bytes=89 gc_bytes_age=16206 intent_count=1 intent_bytes=18 lock_count=1 lock_age=93
error: (*kvpb.WriteTooOldError:) WriteTooOldError: write for key "i" at timestamp 2.000000000,0 too old; must write at or above 5.000000000,1

# An increment above a range tombstone should reset to 1.
run stats ok
increment k=j ts=7
----
>> increment k=j ts=7
inc: current value = 1
stats: key_bytes=+12 val_count=+1 val_bytes=+6 live_count=+1 live_bytes=+20 gc_bytes_age=-194
>> at end:
rangekey: {a-c}/[3.000000000,0=/<empty>]
rangekey: {c-k}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
data: "d"/1.000000000,0 -> /BYTES/d1
data: "e"/2.000000000,0 -> /<empty>
data: "e"/1.000000000,0 -> /BYTES/e1
data: "f"/7.000000000,0 -> /BYTES/f7
data: "f"/1.000000000,0 -> /BYTES/f1
meta: "g"/0,0 -> txn={id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0} ts=7.000000000,0 del=false klen=12 vlen=6 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "g"/7.000000000,0 -> /BYTES/7
data: "g"/1.000000000,0 -> /BYTES/g1
data: "i"/1.000000000,0 -> /INT/1
data: "j"/7.000000000,0 -> /INT/1
data: "j"/1.000000000,0 -> /INT/1
stats: key_count=6 key_bytes=132 val_count=10 val_bytes=107 range_key_count=2 range_key_bytes=35 range_val_count=3 live_count=3 live_bytes=109 gc_bytes_age=16012 intent_count=1 intent_bytes=18 lock_count=1 lock_age=93
