diff --git a/cpp/src/arrow/util/key_value_metadata.cc b/cpp/src/arrow/util/key_value_metadata.cc index 48e02c612020..67bf02b4e1ac 100644 --- a/cpp/src/arrow/util/key_value_metadata.cc +++ b/cpp/src/arrow/util/key_value_metadata.cc @@ -100,6 +100,12 @@ Result KeyValueMetadata::Get(std::string_view key) const { } Status KeyValueMetadata::Delete(int64_t index) { + if (ARROW_PREDICT_FALSE(index < 0 || index >= static_cast(keys_.size()))) { + return Status::IndexError("KeyValueMetadata::Delete: index ", index, + " is out of bounds for metadata " + "of size ", + keys_.size()); + } keys_.erase(keys_.begin() + index); values_.erase(values_.begin() + index); return Status::OK(); diff --git a/cpp/src/arrow/util/key_value_metadata_test.cc b/cpp/src/arrow/util/key_value_metadata_test.cc index 3cdcf9475799..7c021429ac17 100644 --- a/cpp/src/arrow/util/key_value_metadata_test.cc +++ b/cpp/src/arrow/util/key_value_metadata_test.cc @@ -187,6 +187,26 @@ TEST(KeyValueMetadataTest, Delete) { ASSERT_OK(metadata.Delete(3)); ASSERT_TRUE(metadata.Equals( KeyValueMetadata({"aa", "bb", "dd", "ff", "gg"}, {"1", "2", "4", "6", "7"}))); + + std::string expected_error_message = + "Index error: KeyValueMetadata::Delete: index -1 is out of bounds for metadata " + "of size 5"; + ASSERT_RAISES_WITH_MESSAGE(IndexError, expected_error_message, metadata.Delete(-1)); + expected_error_message = + "Index error: KeyValueMetadata::Delete: index 7 is out of bounds for metadata " + "of size 5"; + ASSERT_RAISES_WITH_MESSAGE(IndexError, expected_error_message, metadata.Delete(7)); + + ASSERT_OK(metadata.Delete(4)); + ASSERT_OK(metadata.Delete(3)); + ASSERT_OK(metadata.Delete(2)); + ASSERT_OK(metadata.Delete(1)); + ASSERT_OK(metadata.Delete(0)); + + expected_error_message = + "Index error: KeyValueMetadata::Delete: index 7 is out of bounds for metadata " + "of size 0"; + ASSERT_RAISES_WITH_MESSAGE(IndexError, expected_error_message, metadata.Delete(7)); } { KeyValueMetadata metadata(keys, values);