@@ -270,6 +270,73 @@ func FromHex(in string) []byte {
270270 return out
271271}
272272
273+ func TestLastDup (t * testing.T ) {
274+ env := setup (t )
275+
276+ var dbi DBI
277+ err := env .Update (func (txn * Txn ) (err error ) {
278+ dbi , err = txn .OpenDBI ("testdb" , Create | DupSort , nil , nil )
279+ if err != nil {
280+ return err
281+ }
282+
283+ err = txn .Put (dbi , []byte ("key1" ), []byte ("value1.1" ), 0 )
284+ if err != nil {
285+ return err
286+ }
287+ err = txn .Put (dbi , []byte ("key3" ), []byte ("value3.1" ), 0 )
288+ if err != nil {
289+ return err
290+ }
291+ err = txn .Put (dbi , []byte ("key1" ), []byte ("value1.3" ), 0 )
292+ if err != nil {
293+ return err
294+ }
295+ err = txn .Put (dbi , []byte ("key3" ), []byte ("value3.3" ), 0 )
296+ if err != nil {
297+ return err
298+ }
299+
300+ return nil
301+ })
302+ if err != nil {
303+ t .Fatal (err )
304+ }
305+
306+ err = env .View (func (txn * Txn ) error {
307+ txn .RawRead = true
308+ c , err := txn .OpenCursor (dbi )
309+ if err != nil {
310+ return err
311+ }
312+ defer c .Close ()
313+
314+ i := 0
315+ for k , _ , err := c .Get (nil , nil , First ); k != nil ; k , _ , err = c .Get (nil , nil , NextNoDup ) {
316+ if err != nil {
317+ return err
318+ }
319+ i ++
320+ _ , v , err := c .Get (nil , nil , LastDup )
321+ if err != nil {
322+ return err
323+ }
324+ if i == 1 && string (v ) != "value1.3" {
325+ t .Fail ()
326+ }
327+ if i == 2 && string (v ) != "value3.3" {
328+ t .Fail ()
329+ }
330+ }
331+
332+ return nil
333+ })
334+ if err != nil {
335+ t .Fatal (err )
336+ }
337+
338+ }
339+
273340func TestDupCmpExcludeSuffix32 (t * testing.T ) {
274341 hash32Bytes := FromHex ("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" )
275342 env := setup (t )
@@ -360,7 +427,7 @@ func TestDupCmpExcludeSuffix32(t *testing.T) {
360427 if ! bytes .Equal (v , append ([]byte {0 }, hash32Bytes ... )) {
361428 t .Errorf ("unexpected order: %x (not %x)" , v , append ([]byte {0 }, hash32Bytes ... ))
362429 }
363- _ , v , err = cur .Get (nil , nil , NextDup )
430+ _ , v , err = cur .Get (nil , nil , LastDup )
364431 if err != nil {
365432 return err
366433 }
0 commit comments