From c2a5725de8088b9c4a6574d1881f97ca84ba1bdd Mon Sep 17 00:00:00 2001 From: dkp116 Date: Thu, 9 Jul 2026 17:57:24 +0100 Subject: [PATCH 1/3] [C++][Docs] Add description to KeyValueMetadata::DeleteMany --- cpp/src/arrow/util/key_value_metadata.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cpp/src/arrow/util/key_value_metadata.h b/cpp/src/arrow/util/key_value_metadata.h index 57ade11e7586..b65bbb3dfd46 100644 --- a/cpp/src/arrow/util/key_value_metadata.h +++ b/cpp/src/arrow/util/key_value_metadata.h @@ -50,6 +50,12 @@ class ARROW_EXPORT KeyValueMetadata { // Note that deleting may invalidate known indices Status Delete(std::string_view key); Status Delete(int64_t index); + + /// \brief Delete metadata entries at specified index in keys and values array + /// \param indices Vector of distinct indices identifying the entries to + /// remove from the metadata. + /// \return Status indicating success or failure. + Status DeleteMany(std::vector indices); Status Set(std::string key, std::string value); From 465170c03ef6aabbe644143457b47015bdb40b74 Mon Sep 17 00:00:00 2001 From: dkp116 Date: Sun, 12 Jul 2026 21:33:13 +0100 Subject: [PATCH 2/3] [C++] added check to DeleteMany function to log before accessing an invalid memory address --- cpp/src/arrow/util/key_value_metadata.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/cpp/src/arrow/util/key_value_metadata.cc b/cpp/src/arrow/util/key_value_metadata.cc index 67bf02b4e1ac..aae6e75ac954 100644 --- a/cpp/src/arrow/util/key_value_metadata.cc +++ b/cpp/src/arrow/util/key_value_metadata.cc @@ -126,6 +126,7 @@ Status KeyValueMetadata::DeleteMany(std::vector indices) { DCHECK_GE(stop, 0); DCHECK_LE(stop, size); for (int64_t index = start; index < stop; ++index) { + DCHECK_GE(index - shift, 0); keys_[index - shift] = std::move(keys_[index]); values_[index - shift] = std::move(values_[index]); } From 039e42c3e35663aa9f312ef2aaa3e51e3c4230bb Mon Sep 17 00:00:00 2001 From: dkp116 Date: Sun, 12 Jul 2026 21:35:56 +0100 Subject: [PATCH 3/3] [C++] add test case when DeleteMany tried to access invalid memory address to log check failed --- cpp/src/arrow/util/key_value_metadata_test.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cpp/src/arrow/util/key_value_metadata_test.cc b/cpp/src/arrow/util/key_value_metadata_test.cc index 7c021429ac17..d4781994b1fc 100644 --- a/cpp/src/arrow/util/key_value_metadata_test.cc +++ b/cpp/src/arrow/util/key_value_metadata_test.cc @@ -226,6 +226,10 @@ TEST(KeyValueMetadataTest, Delete) { ASSERT_OK(metadata.DeleteMany({})); ASSERT_TRUE(metadata.Equals(KeyValueMetadata({"bb", "dd", "ee"}, {"2", "4", "5"}))); } + { + KeyValueMetadata metadata(keys, values); + ASSERT_DEATH(static_cast(metadata.DeleteMany({0, 0, 5, 2})), "Check failed"); + } } } // namespace arrow