@@ -571,64 +571,89 @@ func TestKeyValueStoreSuite(t *testing.T, newDB func() KeyValueStore) {
571571 database := newDB ()
572572 defer database .Close ()
573573
574- // Helper to add a range of keys
575- addRange := func (start , stop int ) {
576- for i := start ; i <= stop ; i ++ {
577- key := strconv .Itoa (i )
578- value := "value-" + key
579- err := database .Put ([]byte (key ), []byte (value ))
580- require .NoError (t , err , "Put operation failed for key %s" , key )
581- }
582- }
583-
584- // Helper to check if a range of keys exists
585- checkRange := func (start , stop int , expected bool ) {
586- for i := start ; i <= stop ; i ++ {
587- key := []byte (strconv .Itoa (i ))
588- has , err := database .Has (key )
589- require .NoError (t , err , "Has operation failed for key %s" , key )
590- if expected {
591- require .True (t , has , "key %s should exist" , key )
592- } else {
593- require .False (t , has , "key %s should not exist" , key )
594- }
595- }
596- }
597-
598- addRange (1 , 9 )
574+ addRange (t , database , 9 )
599575 require .NoError (t , database .DeleteRange ([]byte ("9" ), []byte ("1" ))) // no-op
600- checkRange (1 , 9 , true )
576+ checkRange (t , database , 1 , 9 , true )
601577 require .NoError (t , database .DeleteRange ([]byte ("5" ), []byte ("5" ))) // no-op, exclusive end
602- checkRange (1 , 9 , true )
578+ checkRange (t , database , 1 , 9 , true )
603579 require .NoError (t , database .DeleteRange ([]byte ("5" ), []byte ("50" ))) // delete only key 5
604- checkRange (1 , 4 , true )
605- checkRange (5 , 5 , false )
606- checkRange (6 , 9 , true )
580+ checkRange (t , database , 1 , 4 , true )
581+ checkRange (t , database , 5 , 5 , false )
582+ checkRange (t , database , 6 , 9 , true )
607583 require .NoError (t , database .DeleteRange ([]byte ("" ), []byte ("a" ))) // delete all
608- checkRange (1 , 9 , false )
584+ checkRange (t , database , 1 , 9 , false )
609585
610- addRange (1 , 999 )
586+ addRange (t , database , 999 )
611587 require .NoError (t , database .DeleteRange ([]byte ("12345" ), []byte ("54321" )))
612- checkRange (1 , 1 , true )
613- checkRange (2 , 5 , false )
614- checkRange (6 , 12 , true )
615- checkRange (13 , 54 , false )
616- checkRange (55 , 123 , true )
617- checkRange (124 , 543 , false )
618- checkRange (544 , 999 , true )
619-
620- addRange (1 , 999 )
588+ checkRange (t , database , 1 , 1 , true )
589+ checkRange (t , database , 2 , 5 , false )
590+ checkRange (t , database , 6 , 12 , true )
591+ checkRange (t , database , 13 , 54 , false )
592+ checkRange (t , database , 55 , 123 , true )
593+ checkRange (t , database , 124 , 543 , false )
594+ checkRange (t , database , 544 , 999 , true )
595+
596+ addRange (t , database , 999 )
621597 require .NoError (t , database .DeleteRange ([]byte ("3" ), []byte ("7" )))
622- checkRange (1 , 2 , true )
623- checkRange (3 , 6 , false )
624- checkRange (7 , 29 , true )
625- checkRange (30 , 69 , false )
626- checkRange (70 , 299 , true )
627- checkRange (300 , 699 , false )
628- checkRange (700 , 999 , true )
598+ checkRange (t , database , 1 , 2 , true )
599+ checkRange (t , database , 3 , 6 , false )
600+ checkRange (t , database , 7 , 29 , true )
601+ checkRange (t , database , 30 , 69 , false )
602+ checkRange (t , database , 70 , 299 , true )
603+ checkRange (t , database , 300 , 699 , false )
604+ checkRange (t , database , 700 , 999 , true )
629605
630606 require .NoError (t , database .DeleteRange ([]byte ("" ), []byte ("a" )))
631- checkRange (1 , 999 , false )
607+ checkRange (t , database , 1 , 999 , false )
608+ })
609+
610+ // Mirrors the DeleteRange subtest above but routes every DeleteRange
611+ // through a Batch + Write, pinning batch and direct paths to the same
612+ // behavior across backends.
613+ t .Run ("BatchDeleteRange" , func (t * testing.T ) {
614+ database := newDB ()
615+ defer database .Close ()
616+
617+ deleteRangeViaBatch := func (start , end []byte ) {
618+ batch := database .NewBatch ()
619+ require .NoError (t , batch .DeleteRange (start , end ))
620+ require .NoError (t , batch .Write ())
621+ }
622+
623+ addRange (t , database , 9 )
624+ deleteRangeViaBatch ([]byte ("9" ), []byte ("1" ))
625+ checkRange (t , database , 1 , 9 , true )
626+ deleteRangeViaBatch ([]byte ("5" ), []byte ("5" ))
627+ checkRange (t , database , 1 , 9 , true )
628+ deleteRangeViaBatch ([]byte ("5" ), []byte ("50" ))
629+ checkRange (t , database , 1 , 4 , true )
630+ checkRange (t , database , 5 , 5 , false )
631+ checkRange (t , database , 6 , 9 , true )
632+ deleteRangeViaBatch ([]byte ("" ), []byte ("a" ))
633+ checkRange (t , database , 1 , 9 , false )
634+
635+ addRange (t , database , 999 )
636+ deleteRangeViaBatch ([]byte ("12345" ), []byte ("54321" ))
637+ checkRange (t , database , 1 , 1 , true )
638+ checkRange (t , database , 2 , 5 , false )
639+ checkRange (t , database , 6 , 12 , true )
640+ checkRange (t , database , 13 , 54 , false )
641+ checkRange (t , database , 55 , 123 , true )
642+ checkRange (t , database , 124 , 543 , false )
643+ checkRange (t , database , 544 , 999 , true )
644+
645+ addRange (t , database , 999 )
646+ deleteRangeViaBatch ([]byte ("3" ), []byte ("7" ))
647+ checkRange (t , database , 1 , 2 , true )
648+ checkRange (t , database , 3 , 6 , false )
649+ checkRange (t , database , 7 , 29 , true )
650+ checkRange (t , database , 30 , 69 , false )
651+ checkRange (t , database , 70 , 299 , true )
652+ checkRange (t , database , 300 , 699 , false )
653+ checkRange (t , database , 700 , 999 , true )
654+
655+ deleteRangeViaBatch ([]byte ("" ), []byte ("a" ))
656+ checkRange (t , database , 1 , 999 , false )
632657 })
633658
634659 t .Run ("Snapshot" , func (t * testing.T ) {
@@ -797,6 +822,30 @@ func TestKeyValueStoreSuite(t *testing.T, newDB func() KeyValueStore) {
797822 })
798823}
799824
825+ // Helper to add keys 1..stop.
826+ func addRange (t * testing.T , database KeyValueStore , stop int ) {
827+ for i := 1 ; i <= stop ; i ++ {
828+ key := strconv .Itoa (i )
829+ value := "value-" + key
830+ err := database .Put ([]byte (key ), []byte (value ))
831+ require .NoError (t , err , "Put operation failed for key %s" , key )
832+ }
833+ }
834+
835+ // Helper to check if a range of keys exists
836+ func checkRange (t * testing.T , database KeyValueStore , start , stop int , expected bool ) {
837+ for i := start ; i <= stop ; i ++ {
838+ key := []byte (strconv .Itoa (i ))
839+ has , err := database .Has (key )
840+ require .NoError (t , err , "Has operation failed for key %s" , key )
841+ if expected {
842+ require .True (t , has , "key %s should exist" , key )
843+ } else {
844+ require .False (t , has , "key %s should not exist" , key )
845+ }
846+ }
847+ }
848+
800849func assertIteratorErrorsAfterClose (t * testing.T , it Iterator ) {
801850 t .Helper ()
802851 require .NoError (t , it .Close (), "iterator close should succeed" )
0 commit comments