From f73a8fa35b9408c118162ec910a38c09eec3ce9d Mon Sep 17 00:00:00 2001 From: dkp116 Date: Thu, 17 Sep 2026 16:51:47 +0100 Subject: [PATCH 1/4] GH-45723: [C++] Add UnsafeAppend to FixedSizeListBuffer --- cpp/src/arrow/array/builder_nested.cc | 4 +++- cpp/src/arrow/array/builder_nested.h | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/cpp/src/arrow/array/builder_nested.cc b/cpp/src/arrow/array/builder_nested.cc index 915fbfbf895d..e8050f47b5d5 100644 --- a/cpp/src/arrow/array/builder_nested.cc +++ b/cpp/src/arrow/array/builder_nested.cc @@ -200,7 +200,7 @@ void FixedSizeListBuilder::Reset() { Status FixedSizeListBuilder::Append() { RETURN_NOT_OK(Reserve(1)); - UnsafeAppendToBitmap(true); + UnsafeAppend(); return Status::OK(); } @@ -268,6 +268,8 @@ Status FixedSizeListBuilder::FinishInternal(std::shared_ptr* out) { return Status::OK(); } +void FixedSizeListBuilder::UnsafeAppend() { UnsafeAppendToBitmap(true); } + // ---------------------------------------------------------------------- // Struct diff --git a/cpp/src/arrow/array/builder_nested.h b/cpp/src/arrow/array/builder_nested.h index fdbeb0cd7d17..a71a4371205f 100644 --- a/cpp/src/arrow/array/builder_nested.h +++ b/cpp/src/arrow/array/builder_nested.h @@ -725,6 +725,8 @@ class ARROW_EXPORT FixedSizeListBuilder : public ArrayBuilder { return std::numeric_limits::max() - 1; } + void UnsafeAppend(); + protected: std::shared_ptr value_field_; const int32_t list_size_; From 4e9f473d340b999eacebe1654e9f0089d3fb3990 Mon Sep 17 00:00:00 2001 From: dkp116 Date: Thu, 17 Sep 2026 18:36:10 +0100 Subject: [PATCH 2/4] GH-45723: [C++] Add test for Append --- cpp/src/arrow/array/array_list_test.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cpp/src/arrow/array/array_list_test.cc b/cpp/src/arrow/array/array_list_test.cc index 4901a1e6fa6a..d145812e99ab 100644 --- a/cpp/src/arrow/array/array_list_test.cc +++ b/cpp/src/arrow/array/array_list_test.cc @@ -1600,6 +1600,15 @@ class TestFixedSizeListArray : public ::testing::Test { std::shared_ptr result_; }; +TEST_F(TestFixedSizeListArray, TestAppend) { + ASSERT_OK(builder_->Append()); + ASSERT_OK(builder_->Append()); + + Done(); + + ASSERT_EQ(result_->length(), 2); +} + TEST_F(TestFixedSizeListArray, Equality) { Int32Builder* vb = checked_cast(builder_->value_builder()); From 8f9fe7425a49fafef5d6945c2250db592fb5eab7 Mon Sep 17 00:00:00 2001 From: dkp116 Date: Mon, 21 Sep 2026 18:54:11 +0100 Subject: [PATCH 3/4] GH-45723: [C++] Add docstring to UnsafeAppend and inline implementation --- cpp/src/arrow/array/builder_nested.cc | 2 -- cpp/src/arrow/array/builder_nested.h | 7 ++++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cpp/src/arrow/array/builder_nested.cc b/cpp/src/arrow/array/builder_nested.cc index e8050f47b5d5..f8475db65b39 100644 --- a/cpp/src/arrow/array/builder_nested.cc +++ b/cpp/src/arrow/array/builder_nested.cc @@ -268,8 +268,6 @@ Status FixedSizeListBuilder::FinishInternal(std::shared_ptr* out) { return Status::OK(); } -void FixedSizeListBuilder::UnsafeAppend() { UnsafeAppendToBitmap(true); } - // ---------------------------------------------------------------------- // Struct diff --git a/cpp/src/arrow/array/builder_nested.h b/cpp/src/arrow/array/builder_nested.h index a71a4371205f..9abfdb6202a0 100644 --- a/cpp/src/arrow/array/builder_nested.h +++ b/cpp/src/arrow/array/builder_nested.h @@ -725,7 +725,12 @@ class ARROW_EXPORT FixedSizeListBuilder : public ArrayBuilder { return std::numeric_limits::max() - 1; } - void UnsafeAppend(); + /// \brief UnsafeAppend a valid fixed length list. + /// + /// This function affects only the validity bitmap; the child values must be appended + /// using the child array builder. The caller must ensure that sufficient capacity is + /// available. + void UnsafeAppend() { UnsafeAppendToBitmap(true); } protected: std::shared_ptr value_field_; From 9eb6de396d1b6ee2b0b52c7eb1b011ded101d649 Mon Sep 17 00:00:00 2001 From: dkp116 Date: Mon, 21 Sep 2026 19:32:37 +0100 Subject: [PATCH 4/4] GH-45723: [C++] Add test for UnsafeAppend for FixedSizeBuilder --- cpp/src/arrow/array/array_list_test.cc | 37 +++++++++++++++++++++----- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/cpp/src/arrow/array/array_list_test.cc b/cpp/src/arrow/array/array_list_test.cc index d145812e99ab..2f5918f79a33 100644 --- a/cpp/src/arrow/array/array_list_test.cc +++ b/cpp/src/arrow/array/array_list_test.cc @@ -1600,14 +1600,15 @@ class TestFixedSizeListArray : public ::testing::Test { std::shared_ptr result_; }; -TEST_F(TestFixedSizeListArray, TestAppend) { - ASSERT_OK(builder_->Append()); - ASSERT_OK(builder_->Append()); +// TEST_F(TestFixedSizeListArray, TestUnsafeAppend) { +// ASSERT_OK(builder_->Reserve(2)); +// builder_->UnsafeAppend(); +// builder_->UnsafeAppend(); - Done(); +// Done(); - ASSERT_EQ(result_->length(), 2); -} +// ASSERT_EQ(result_->length(), 2); +// } TEST_F(TestFixedSizeListArray, Equality) { Int32Builder* vb = checked_cast(builder_->value_builder()); @@ -1731,6 +1732,30 @@ TEST_F(TestFixedSizeListArray, TestBasics) { ValidateBasicFixedSizeListArray(result_.get(), values, is_valid); } +TEST_F(TestFixedSizeListArray, TestBasicsWithUnsafeAppend) { + std::vector values = {0, 1, 2, 3, 4, 5}; + std::vector is_valid = {1, 0, 1}; + + Int32Builder* vb = checked_cast(builder_->value_builder()); + + int pos = 0; + ASSERT_OK(builder_->Reserve(values.size() / list_size())); + for (size_t i = 0; i < values.size() / list_size(); ++i) { + if (is_valid[i] == 0) { + ASSERT_OK(builder_->AppendNull()); + pos += list_size(); + continue; + } + builder_->UnsafeAppend(); + for (int j = 0; j < list_size(); ++j) { + ASSERT_OK(vb->Append(values[pos++])); + } + } + + Done(); + ValidateBasicFixedSizeListArray(result_.get(), values, is_valid); +} + TEST_F(TestFixedSizeListArray, BulkAppend) { std::vector values = {0, 1, 2, 3, 4, 5}; std::vector is_valid = {1, 0, 1};