# Tests MVCC export.
#
# Sets up the following dataset, where x is MVCC point tombstone, o-o is MVCC
# range tombstone, [] is intent.  We include some local timestamps, which should
# not be exported.
#
#  7 [a7]        [d7]                    [j7]    [l7]        [o7]
#  6                      f6
#  5          o---------------o               k5
#  4  x   x       d4      f4  g4  x
#  3      o-------o   e3  o-------oh3                 o---o
#  2  a2                  f2  g2
#  1  o---------------------------------------o
#     a   b   c   d   e   f   g   h   i   j   k   l   m   n   o

run ok
del_range_ts k=a end=k ts=1
put k=a ts=2 v=a2
del k=a ts=4
del_range_ts k=b end=d ts=3
del k=b ts=4
put k=d ts=4 v=d4
put k=e ts=3 v=e3 localTs=2
put k=f ts=2 v=f2
put k=g ts=2 v=g2
del_range_ts k=f end=h ts=3
put k=f ts=4 v=f4
put k=g ts=4 v=g4
del_range_ts k=c end=g ts=5 localTs=4
put k=f ts=6 v=f6
put k=h ts=3 v=h3
del k=h ts=4
put k=k ts=5 v=k5 localTs=4
del_range_ts k=m end=n ts=3 localTs=2
with t=A
  txn_begin ts=7
  put k=a v=a7
  put k=d v=d7
  put k=j v=j7
  put k=l v=l7
  put k=o v=n7
----
del: "a": found key true
del: "b": found key false
del: "h": found key true
put: lock acquisition = {a id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0 Replicated Intent []}
put: lock acquisition = {d id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0 Replicated Intent []}
put: lock acquisition = {j id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0 Replicated Intent []}
put: lock acquisition = {l id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0 Replicated Intent []}
put: lock acquisition = {o id=00000001 key=/Min iso=Serializable pri=0.00000000 epo=0 ts=7.000000000,0 min=0,0 seq=0 Replicated Intent []}
>> 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-b}/[1.000000000,0=/<empty>]
rangekey: {b-c}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
rangekey: {c-d}/[5.000000000,0={localTs=4.000000000,0}/<empty> 3.000000000,0=/<empty> 1.000000000,0=/<empty>]
rangekey: {d-f}/[5.000000000,0={localTs=4.000000000,0}/<empty> 1.000000000,0=/<empty>]
rangekey: {f-g}/[5.000000000,0={localTs=4.000000000,0}/<empty> 3.000000000,0=/<empty> 1.000000000,0=/<empty>]
rangekey: {g-h}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
rangekey: {h-k}/[1.000000000,0=/<empty>]
rangekey: {m-n}/[3.000000000,0={localTs=2.000000000,0}/<empty>]
meta: "a"/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=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "a"/7.000000000,0 -> /BYTES/a7
data: "a"/4.000000000,0 -> /<empty>
data: "a"/2.000000000,0 -> /BYTES/a2
data: "b"/4.000000000,0 -> /<empty>
meta: "d"/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=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "d"/7.000000000,0 -> /BYTES/d7
data: "d"/4.000000000,0 -> /BYTES/d4
data: "e"/3.000000000,0 -> {localTs=2.000000000,0}/BYTES/e3
data: "f"/6.000000000,0 -> /BYTES/f6
data: "f"/4.000000000,0 -> /BYTES/f4
data: "f"/2.000000000,0 -> /BYTES/f2
data: "g"/4.000000000,0 -> /BYTES/g4
data: "g"/2.000000000,0 -> /BYTES/g2
data: "h"/4.000000000,0 -> /<empty>
data: "h"/3.000000000,0 -> /BYTES/h3
meta: "j"/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=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "j"/7.000000000,0 -> /BYTES/j7
data: "k"/5.000000000,0 -> {localTs=4.000000000,0}/BYTES/k5
meta: "l"/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=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "l"/7.000000000,0 -> /BYTES/l7
meta: "o"/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=7 mergeTs=<nil> txnDidNotUpdateMeta=true
data: "o"/7.000000000,0 -> /BYTES/n7

# Exporting across intents will error.
run error
export k=a end=z
----
error: (*kvpb.LockConflictError:) conflicting locks on "a", "d", "j", "l", "o"

run error
export k=a end=z maxLockConflicts=1
----
error: (*kvpb.LockConflictError:) conflicting locks on "a"

run error
export k=a end=z maxLockConflicts=100
----
error: (*kvpb.LockConflictError:) conflicting locks on "a", "d", "j", "l", "o"

run error
export k=a end=z maxLockConflicts=3
----
error: (*kvpb.LockConflictError:) conflicting locks on "a", "d", "j"

# Each intent here has the size of 3 bytes.
run error
export k=a end=z targetLockConflictBytes=10
----
error: (*kvpb.LockConflictError:) conflicting locks on "a", "d", "j", "l"

# Export the entire dataset below the intents, with full revision history.
run ok
export k=a end=z ts=6 allRevisions
----
export: data_size:165 
export: {a-b}/[1.000000000,0=/<empty>]
export: "a"/4.000000000,0 -> /<empty>
export: "a"/2.000000000,0 -> /BYTES/a2
export: {b-c}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "b"/4.000000000,0 -> /<empty>
export: {c-d}/[5.000000000,0=/<empty> 3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: {d-f}/[5.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "d"/4.000000000,0 -> /BYTES/d4
export: "e"/3.000000000,0 -> /BYTES/e3
export: {f-g}/[5.000000000,0=/<empty> 3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "f"/6.000000000,0 -> /BYTES/f6
export: "f"/4.000000000,0 -> /BYTES/f4
export: "f"/2.000000000,0 -> /BYTES/f2
export: {g-h}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "g"/4.000000000,0 -> /BYTES/g4
export: "g"/2.000000000,0 -> /BYTES/g2
export: {h-k}/[1.000000000,0=/<empty>]
export: "h"/4.000000000,0 -> /<empty>
export: "h"/3.000000000,0 -> /BYTES/h3
export: "k"/5.000000000,0 -> /BYTES/k5
export: {m-n}/[3.000000000,0=/<empty>]

# Export the full revision history, at increasing end time and then at
# increasing start time.
run ok
export k=a end=z ts=1 allRevisions
----
export: data_size:14 
export: {a-k}/[1.000000000,0=/<empty>]

run ok
export k=a end=z ts=2 allRevisions
----
export: data_size:38 
export: {a-k}/[1.000000000,0=/<empty>]
export: "a"/2.000000000,0 -> /BYTES/a2
export: "f"/2.000000000,0 -> /BYTES/f2
export: "g"/2.000000000,0 -> /BYTES/g2

run ok
export k=a end=z ts=3 allRevisions
----
export: data_size:77 
export: {a-b}/[1.000000000,0=/<empty>]
export: "a"/2.000000000,0 -> /BYTES/a2
export: {b-d}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: {d-f}/[1.000000000,0=/<empty>]
export: "e"/3.000000000,0 -> /BYTES/e3
export: {f-h}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "f"/2.000000000,0 -> /BYTES/f2
export: "g"/2.000000000,0 -> /BYTES/g2
export: {h-k}/[1.000000000,0=/<empty>]
export: "h"/3.000000000,0 -> /BYTES/h3
export: {m-n}/[3.000000000,0=/<empty>]

run ok
export k=a end=z ts=4 allRevisions
----
export: data_size:104 
export: {a-b}/[1.000000000,0=/<empty>]
export: "a"/4.000000000,0 -> /<empty>
export: "a"/2.000000000,0 -> /BYTES/a2
export: {b-d}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "b"/4.000000000,0 -> /<empty>
export: {d-f}/[1.000000000,0=/<empty>]
export: "d"/4.000000000,0 -> /BYTES/d4
export: "e"/3.000000000,0 -> /BYTES/e3
export: {f-h}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "f"/4.000000000,0 -> /BYTES/f4
export: "f"/2.000000000,0 -> /BYTES/f2
export: "g"/4.000000000,0 -> /BYTES/g4
export: "g"/2.000000000,0 -> /BYTES/g2
export: {h-k}/[1.000000000,0=/<empty>]
export: "h"/4.000000000,0 -> /<empty>
export: "h"/3.000000000,0 -> /BYTES/h3
export: {m-n}/[3.000000000,0=/<empty>]

run ok
export k=a end=z ts=5 allRevisions
----
export: data_size:157 
export: {a-b}/[1.000000000,0=/<empty>]
export: "a"/4.000000000,0 -> /<empty>
export: "a"/2.000000000,0 -> /BYTES/a2
export: {b-c}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "b"/4.000000000,0 -> /<empty>
export: {c-d}/[5.000000000,0=/<empty> 3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: {d-f}/[5.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "d"/4.000000000,0 -> /BYTES/d4
export: "e"/3.000000000,0 -> /BYTES/e3
export: {f-g}/[5.000000000,0=/<empty> 3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "f"/4.000000000,0 -> /BYTES/f4
export: "f"/2.000000000,0 -> /BYTES/f2
export: {g-h}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "g"/4.000000000,0 -> /BYTES/g4
export: "g"/2.000000000,0 -> /BYTES/g2
export: {h-k}/[1.000000000,0=/<empty>]
export: "h"/4.000000000,0 -> /<empty>
export: "h"/3.000000000,0 -> /BYTES/h3
export: "k"/5.000000000,0 -> /BYTES/k5
export: {m-n}/[3.000000000,0=/<empty>]

run ok
export k=a end=z ts=6 allRevisions
----
export: data_size:165 
export: {a-b}/[1.000000000,0=/<empty>]
export: "a"/4.000000000,0 -> /<empty>
export: "a"/2.000000000,0 -> /BYTES/a2
export: {b-c}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "b"/4.000000000,0 -> /<empty>
export: {c-d}/[5.000000000,0=/<empty> 3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: {d-f}/[5.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "d"/4.000000000,0 -> /BYTES/d4
export: "e"/3.000000000,0 -> /BYTES/e3
export: {f-g}/[5.000000000,0=/<empty> 3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "f"/6.000000000,0 -> /BYTES/f6
export: "f"/4.000000000,0 -> /BYTES/f4
export: "f"/2.000000000,0 -> /BYTES/f2
export: {g-h}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "g"/4.000000000,0 -> /BYTES/g4
export: "g"/2.000000000,0 -> /BYTES/g2
export: {h-k}/[1.000000000,0=/<empty>]
export: "h"/4.000000000,0 -> /<empty>
export: "h"/3.000000000,0 -> /BYTES/h3
export: "k"/5.000000000,0 -> /BYTES/k5
export: {m-n}/[3.000000000,0=/<empty>]

run ok
export k=a end=z startTs=1 ts=6 allRevisions
----
export: data_size:151 
export: "a"/4.000000000,0 -> /<empty>
export: "a"/2.000000000,0 -> /BYTES/a2
export: {b-c}/[3.000000000,0=/<empty>]
export: "b"/4.000000000,0 -> /<empty>
export: {c-d}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
export: {d-f}/[5.000000000,0=/<empty>]
export: "d"/4.000000000,0 -> /BYTES/d4
export: "e"/3.000000000,0 -> /BYTES/e3
export: {f-g}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
export: "f"/6.000000000,0 -> /BYTES/f6
export: "f"/4.000000000,0 -> /BYTES/f4
export: "f"/2.000000000,0 -> /BYTES/f2
export: {g-h}/[3.000000000,0=/<empty>]
export: "g"/4.000000000,0 -> /BYTES/g4
export: "g"/2.000000000,0 -> /BYTES/g2
export: "h"/4.000000000,0 -> /<empty>
export: "h"/3.000000000,0 -> /BYTES/h3
export: "k"/5.000000000,0 -> /BYTES/k5
export: {m-n}/[3.000000000,0=/<empty>]

run ok
export k=a end=z startTs=2 ts=6 allRevisions
----
export: data_size:127 
export: "a"/4.000000000,0 -> /<empty>
export: {b-c}/[3.000000000,0=/<empty>]
export: "b"/4.000000000,0 -> /<empty>
export: {c-d}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
export: {d-f}/[5.000000000,0=/<empty>]
export: "d"/4.000000000,0 -> /BYTES/d4
export: "e"/3.000000000,0 -> /BYTES/e3
export: {f-g}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
export: "f"/6.000000000,0 -> /BYTES/f6
export: "f"/4.000000000,0 -> /BYTES/f4
export: {g-h}/[3.000000000,0=/<empty>]
export: "g"/4.000000000,0 -> /BYTES/g4
export: "h"/4.000000000,0 -> /<empty>
export: "h"/3.000000000,0 -> /BYTES/h3
export: "k"/5.000000000,0 -> /BYTES/k5
export: {m-n}/[3.000000000,0=/<empty>]

run ok
export k=a end=z startTs=3 ts=6 allRevisions
----
export: data_size:88 
export: "a"/4.000000000,0 -> /<empty>
export: "b"/4.000000000,0 -> /<empty>
export: {c-g}/[5.000000000,0=/<empty>]
export: "d"/4.000000000,0 -> /BYTES/d4
export: "f"/6.000000000,0 -> /BYTES/f6
export: "f"/4.000000000,0 -> /BYTES/f4
export: "g"/4.000000000,0 -> /BYTES/g4
export: "h"/4.000000000,0 -> /<empty>
export: "k"/5.000000000,0 -> /BYTES/k5

run ok
export k=a end=z startTs=4 ts=6 allRevisions
----
export: data_size:61 
export: {c-g}/[5.000000000,0=/<empty>]
export: "f"/6.000000000,0 -> /BYTES/f6
export: "k"/5.000000000,0 -> /BYTES/k5

run ok
export k=a end=z startTs=5 ts=6 allRevisions
----
export: data_size:8 
export: "f"/6.000000000,0 -> /BYTES/f6

run ok
export k=a end=z startTs=6 ts=6 allRevisions
----
export: 

# Export without revision history at increasing end time, then at increasing
# start time.
run ok
export k=a end=z ts=1
----
export: 

run ok
export k=a end=z ts=2
----
export: data_size:24 
export: "a"/2.000000000,0 -> /BYTES/a2
export: "f"/2.000000000,0 -> /BYTES/f2
export: "g"/2.000000000,0 -> /BYTES/g2

run ok
export k=a end=z ts=3
----
export: data_size:24 
export: "a"/2.000000000,0 -> /BYTES/a2
export: "e"/3.000000000,0 -> /BYTES/e3
export: "h"/3.000000000,0 -> /BYTES/h3

run ok
export k=a end=z ts=4
----
export: data_size:32 
export: "d"/4.000000000,0 -> /BYTES/d4
export: "e"/3.000000000,0 -> /BYTES/e3
export: "f"/4.000000000,0 -> /BYTES/f4
export: "g"/4.000000000,0 -> /BYTES/g4

run ok
export k=a end=z ts=5
----
export: data_size:16 
export: "g"/4.000000000,0 -> /BYTES/g4
export: "k"/5.000000000,0 -> /BYTES/k5

run ok
export k=a end=z ts=6
----
export: data_size:24 
export: "f"/6.000000000,0 -> /BYTES/f6
export: "g"/4.000000000,0 -> /BYTES/g4
export: "k"/5.000000000,0 -> /BYTES/k5

run ok
export k=a end=z startTs=1 ts=6
----
export: data_size:91 
export: "a"/4.000000000,0 -> /<empty>
export: {b-c}/[3.000000000,0=/<empty>]
export: "b"/4.000000000,0 -> /<empty>
export: {c-g}/[5.000000000,0=/<empty>]
export: "f"/6.000000000,0 -> /BYTES/f6
export: {g-h}/[3.000000000,0=/<empty>]
export: "g"/4.000000000,0 -> /BYTES/g4
export: "h"/4.000000000,0 -> /<empty>
export: "k"/5.000000000,0 -> /BYTES/k5
export: {m-n}/[3.000000000,0=/<empty>]

run ok
export k=a end=z startTs=2 ts=6
----
export: data_size:91 
export: "a"/4.000000000,0 -> /<empty>
export: {b-c}/[3.000000000,0=/<empty>]
export: "b"/4.000000000,0 -> /<empty>
export: {c-g}/[5.000000000,0=/<empty>]
export: "f"/6.000000000,0 -> /BYTES/f6
export: {g-h}/[3.000000000,0=/<empty>]
export: "g"/4.000000000,0 -> /BYTES/g4
export: "h"/4.000000000,0 -> /<empty>
export: "k"/5.000000000,0 -> /BYTES/k5
export: {m-n}/[3.000000000,0=/<empty>]

run ok
export k=a end=z startTs=3 ts=6
----
export: data_size:72 
export: "a"/4.000000000,0 -> /<empty>
export: "b"/4.000000000,0 -> /<empty>
export: {c-g}/[5.000000000,0=/<empty>]
export: "f"/6.000000000,0 -> /BYTES/f6
export: "g"/4.000000000,0 -> /BYTES/g4
export: "h"/4.000000000,0 -> /<empty>
export: "k"/5.000000000,0 -> /BYTES/k5

run ok
export k=a end=z startTs=4 ts=6
----
export: data_size:61 
export: {c-g}/[5.000000000,0=/<empty>]
export: "f"/6.000000000,0 -> /BYTES/f6
export: "k"/5.000000000,0 -> /BYTES/k5

run ok
export k=a end=z startTs=5 ts=6
----
export: data_size:8 
export: "f"/6.000000000,0 -> /BYTES/f6

run ok
export k=a end=z startTs=6 ts=6
----
export: 

# Incremental export one timestamp at a time, with and without full revision
# history.
run ok
export k=a end=z startTs=0 ts=1 allRevisions
----
export: data_size:14 
export: {a-k}/[1.000000000,0=/<empty>]

run ok
export k=a end=z startTs=1 ts=2 allRevisions
----
export: data_size:24 
export: "a"/2.000000000,0 -> /BYTES/a2
export: "f"/2.000000000,0 -> /BYTES/f2
export: "g"/2.000000000,0 -> /BYTES/g2

run ok
export k=a end=z startTs=2 ts=3 allRevisions
----
export: data_size:39 
export: {b-d}/[3.000000000,0=/<empty>]
export: "e"/3.000000000,0 -> /BYTES/e3
export: {f-h}/[3.000000000,0=/<empty>]
export: "h"/3.000000000,0 -> /BYTES/h3
export: {m-n}/[3.000000000,0=/<empty>]

run ok
export k=a end=z startTs=3 ts=4 allRevisions
----
export: data_size:27 
export: "a"/4.000000000,0 -> /<empty>
export: "b"/4.000000000,0 -> /<empty>
export: "d"/4.000000000,0 -> /BYTES/d4
export: "f"/4.000000000,0 -> /BYTES/f4
export: "g"/4.000000000,0 -> /BYTES/g4
export: "h"/4.000000000,0 -> /<empty>

run ok
export k=a end=z startTs=4 ts=5 allRevisions
----
export: data_size:53 
export: {c-g}/[5.000000000,0=/<empty>]
export: "k"/5.000000000,0 -> /BYTES/k5

run ok
export k=a end=z startTs=5 ts=6 allRevisions
----
export: data_size:8 
export: "f"/6.000000000,0 -> /BYTES/f6

run ok
export k=a end=z startTs=0 ts=1
----
export: 

run ok
export k=a end=z startTs=1 ts=2
----
export: data_size:24 
export: "a"/2.000000000,0 -> /BYTES/a2
export: "f"/2.000000000,0 -> /BYTES/f2
export: "g"/2.000000000,0 -> /BYTES/g2

run ok
export k=a end=z startTs=2 ts=3
----
export: data_size:39 
export: {b-d}/[3.000000000,0=/<empty>]
export: "e"/3.000000000,0 -> /BYTES/e3
export: {f-h}/[3.000000000,0=/<empty>]
export: "h"/3.000000000,0 -> /BYTES/h3
export: {m-n}/[3.000000000,0=/<empty>]

run ok
export k=a end=z startTs=3 ts=4
----
export: data_size:27 
export: "a"/4.000000000,0 -> /<empty>
export: "b"/4.000000000,0 -> /<empty>
export: "d"/4.000000000,0 -> /BYTES/d4
export: "f"/4.000000000,0 -> /BYTES/f4
export: "g"/4.000000000,0 -> /BYTES/g4
export: "h"/4.000000000,0 -> /<empty>

run ok
export k=a end=z startTs=4 ts=5
----
export: data_size:53 
export: {c-g}/[5.000000000,0=/<empty>]
export: "k"/5.000000000,0 -> /BYTES/k5

run ok
export k=a end=z startTs=5 ts=6
----
export: data_size:8 
export: "f"/6.000000000,0 -> /BYTES/f6

# TargetSize returns a resume span, and allows overflow, both when exporting the
# whole revision history and the latest version. It is not affected by
# stopMidKey.
run ok
export k=a end=z ts=6 allRevisions targetSize=1
----
export: data_size:11  resume="b"/0,0
export: {a-b}/[1.000000000,0=/<empty>]
export: "a"/4.000000000,0 -> /<empty>
export: "a"/2.000000000,0 -> /BYTES/a2

run ok
export k=a end=z ts=6 allRevisions targetSize=1 stopMidKey
----
export: data_size:11  resume="b"/0,0
export: {a-b}/[1.000000000,0=/<empty>]
export: "a"/4.000000000,0 -> /<empty>
export: "a"/2.000000000,0 -> /BYTES/a2

run ok
export k=a end=z ts=6 targetSize=1
----
export: data_size:8  resume="g"/0,0
export: "f"/6.000000000,0 -> /BYTES/f6

run ok
export k=a end=z startTs=1 ts=6 targetSize=1
----
export: data_size:1  resume="b"/0,0
export: "a"/4.000000000,0 -> /<empty>

# MaxSize returns an error if exceeded without TargetSize.
#
# TODO(erikgrinaker): It probably doesn't make sense for this behavior to change
# based on whether TargetSize is set or not, but keeping the existing logic for
# now.
run error
export k=a end=z ts=6 allRevisions maxSize=1
----
error: (*storage.ExceedMaxSizeError:) export size (3 bytes) exceeds max size (1 bytes)

run error
export k=a end=z ts=6 allRevisions maxSize=10
----
error: (*storage.ExceedMaxSizeError:) export size (12 bytes) exceeds max size (10 bytes)

# MaxSize with TargetSize will bail out before exceeding MaxSize, but it
# depends on StopMidKey.
run error
export k=a end=z ts=6 allRevisions targetSize=1 maxSize=1
----
error: (*storage.ExceedMaxSizeError:) export size (3 bytes) exceeds max size (1 bytes)

run error
export k=a end=z ts=6 allRevisions targetSize=10 maxSize=10
----
error: (*storage.ExceedMaxSizeError:) export size (12 bytes) exceeds max size (10 bytes)

run ok
export k=a end=z ts=6 allRevisions targetSize=10 maxSize=10 stopMidKey
----
export: data_size:4  resume="a"/2.000000000,0
export: a{-\x00}/[1.000000000,0=/<empty>]
export: "a"/4.000000000,0 -> /<empty>

run ok
export k=a end=z ts=6 allRevisions targetSize=12 maxSize=12
----
export: data_size:11  resume="b"/0,0
export: {a-b}/[1.000000000,0=/<empty>]
export: "a"/4.000000000,0 -> /<empty>
export: "a"/2.000000000,0 -> /BYTES/a2

run error
export k=a end=z ts=6 allRevisions targetSize=17 maxSize=17
----
error: (*storage.ExceedMaxSizeError:) export size (18 bytes) exceeds max size (17 bytes)

# TargetSize and MaxSize without stopMidKey will keep going to the
# end of the key as long as MaxSize isn't exceeded.
run ok
export k=a end=z ts=6 allRevisions targetSize=4 maxSize=12
----
export: data_size:11  resume="b"/0,0
export: {a-b}/[1.000000000,0=/<empty>]
export: "a"/4.000000000,0 -> /<empty>
export: "a"/2.000000000,0 -> /BYTES/a2

# Hitting MaxSize right after including a range key with the same start key as
# the exceeding point key will emit a point-sized range key, unfortunately. This
# is also the case when we emit a covered point. However, it won't emit that
# range key if StopMidKey is disabled.
run ok
export k=a end=z ts=6 allRevisions targetSize=3 maxSize=3 stopMidKey
----
export: data_size:3  resume="a"/4.000000000,0
export: a{-\x00}/[1.000000000,0=/<empty>]

run ok
export k=a end=z ts=6 allRevisions targetSize=4 maxSize=4 stopMidKey
----
export: data_size:4  resume="a"/2.000000000,0
export: a{-\x00}/[1.000000000,0=/<empty>]
export: "a"/4.000000000,0 -> /<empty>

run ok
export k=a end=z ts=6 allRevisions targetSize=17 maxSize=17 stopMidKey
----
export: data_size:17  resume="b"/4.000000000,0
export: {a-b}/[1.000000000,0=/<empty>]
export: "a"/4.000000000,0 -> /<empty>
export: "a"/2.000000000,0 -> /BYTES/a2
export: b{-\x00}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]

run error
export k=a end=z ts=6 allRevisions targetSize=17 maxSize=17
----
error: (*storage.ExceedMaxSizeError:) export size (18 bytes) exceeds max size (17 bytes)

# Resuming from various bounds, with and without other options.
run ok
export k=b end=k ts=6 allRevisions
----
export: data_size:131 
export: {b-c}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "b"/4.000000000,0 -> /<empty>
export: {c-d}/[5.000000000,0=/<empty> 3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: {d-f}/[5.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "d"/4.000000000,0 -> /BYTES/d4
export: "e"/3.000000000,0 -> /BYTES/e3
export: {f-g}/[5.000000000,0=/<empty> 3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "f"/6.000000000,0 -> /BYTES/f6
export: "f"/4.000000000,0 -> /BYTES/f4
export: "f"/2.000000000,0 -> /BYTES/f2
export: {g-h}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "g"/4.000000000,0 -> /BYTES/g4
export: "g"/2.000000000,0 -> /BYTES/g2
export: {h-k}/[1.000000000,0=/<empty>]
export: "h"/4.000000000,0 -> /<empty>
export: "h"/3.000000000,0 -> /BYTES/h3

run ok
export k=bbb end=ggg startTs=2 ts=5 allRevisions
----
export: data_size:89 
export: {bbb-c}/[3.000000000,0=/<empty>]
export: {c-d}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
export: {d-f}/[5.000000000,0=/<empty>]
export: "d"/4.000000000,0 -> /BYTES/d4
export: "e"/3.000000000,0 -> /BYTES/e3
export: {f-g}/[5.000000000,0=/<empty> 3.000000000,0=/<empty>]
export: "f"/4.000000000,0 -> /BYTES/f4
export: g{-gg}/[3.000000000,0=/<empty>]
export: "g"/4.000000000,0 -> /BYTES/g4

run ok
export k=bbb end=ggg startTs=2 ts=5
----
export: data_size:61 
export: {bbb-c}/[3.000000000,0=/<empty>]
export: {c-g}/[5.000000000,0=/<empty>]
export: g{-gg}/[3.000000000,0=/<empty>]
export: "g"/4.000000000,0 -> /BYTES/g4

# Resuming from a specific key version.
run ok
export k=a kTs=4 end=c ts=6 allRevisions
----
export: data_size:16 
export: {a-b}/[1.000000000,0=/<empty>]
export: "a"/4.000000000,0 -> /<empty>
export: "a"/2.000000000,0 -> /BYTES/a2
export: {b-c}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "b"/4.000000000,0 -> /<empty>

run ok
export k=a kTs=3 end=c ts=6 allRevisions
----
export: data_size:15 
export: {a-b}/[1.000000000,0=/<empty>]
export: "a"/2.000000000,0 -> /BYTES/a2
export: {b-c}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "b"/4.000000000,0 -> /<empty>

run ok
export k=a kTs=2 end=c ts=6 allRevisions
----
export: data_size:15 
export: {a-b}/[1.000000000,0=/<empty>]
export: "a"/2.000000000,0 -> /BYTES/a2
export: {b-c}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "b"/4.000000000,0 -> /<empty>

run ok
export k=a kTs=1 end=c ts=6 allRevisions
----
export: data_size:7 
export: {a-b}/[1.000000000,0=/<empty>]
export: {b-c}/[3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "b"/4.000000000,0 -> /<empty>

run ok
export k=f kTs=4 end=g ts=6 allRevisions
----
export: data_size:35 
export: {f-g}/[5.000000000,0=/<empty> 3.000000000,0=/<empty> 1.000000000,0=/<empty>]
export: "f"/4.000000000,0 -> /BYTES/f4
export: "f"/2.000000000,0 -> /BYTES/f2

run ok
export k=f kTs=4 end=g startTs=2 ts=4 allRevisions
----
export: data_size:10 
export: {f-g}/[3.000000000,0=/<empty>]
export: "f"/4.000000000,0 -> /BYTES/f4

run ok
export k=f kTs=3 end=g startTs=2 ts=4 allRevisions
----
export: data_size:2 
export: {f-g}/[3.000000000,0=/<empty>]

# Resuming from a specific key version at or below startTS.
run ok
export k=a kTs=2 end=c startTs=2 ts=6
----
export: data_size:3 
export: {b-c}/[3.000000000,0=/<empty>]
export: "b"/4.000000000,0 -> /<empty>
