diff --git a/cpp/src/arrow/array/array_run_end_test.cc b/cpp/src/arrow/array/array_run_end_test.cc index f2c493fb3a3..6cf50ccade1 100644 --- a/cpp/src/arrow/array/array_run_end_test.cc +++ b/cpp/src/arrow/array/array_run_end_test.cc @@ -366,6 +366,59 @@ TEST_P(TestRunEndEncodedArray, Builder) { } } } +TEST_P(TestRunEndEncodedArray, BuilderAppendScalarsPrimitiveScalar) { + auto value_type = float32(); + auto ree_type = run_end_encoded(run_end_type, value_type); + + ASSERT_OK_AND_ASSIGN(std::shared_ptr builder, MakeBuilder(ree_type)); + + ASSERT_OK_AND_ASSIGN(auto v1, MakeScalar(float32(), 1.0f)); + ASSERT_OK_AND_ASSIGN(auto v2, MakeScalar(float32(), 1.0f)); + ASSERT_OK_AND_ASSIGN(auto v3, MakeScalar(float32(), 2.0f)); + ASSERT_OK_AND_ASSIGN(auto v4, MakeScalar(float32(), 2.0f)); + ASSERT_OK_AND_ASSIGN(auto v5, MakeScalar(float32(), 3.0f)); + + ScalarVector scalars = {v1, v2, v3, v4, v5}; + + ASSERT_OK(builder->AppendScalars(scalars)); + ASSERT_EQ(builder->length(), 5); + ASSERT_OK_AND_ASSIGN(auto array, builder->Finish()); + ASSERT_OK(array->ValidateFull()); + + auto ree_array = std::dynamic_pointer_cast(array); + ASSERT_NE(ree_array, NULLPTR); + auto expected_run_ends = ArrayFromJSON(run_end_type, "[2,4,5]"); + auto expected_values = ArrayFromJSON(float32(), "[1,2,3]"); + ASSERT_ARRAYS_EQUAL(*expected_run_ends, *ree_array->run_ends()); + ASSERT_ARRAYS_EQUAL(*expected_values, *ree_array->values()); +} + +TEST_P(TestRunEndEncodedArray, BuilderAppendScalarsRunEndEncodedScalar) { + auto value_type = float32(); + auto ree_type = run_end_encoded(run_end_type, value_type); + + ASSERT_OK_AND_ASSIGN(std::shared_ptr builder, MakeBuilder(ree_type)); + + ASSERT_OK_AND_ASSIGN(auto s1, MakeScalar(ree_type, *MakeScalar(float32(), 1.0f))); + ASSERT_OK_AND_ASSIGN(auto s2, MakeScalar(ree_type, *MakeScalar(float32(), 1.0f))); + ASSERT_OK_AND_ASSIGN(auto s3, MakeScalar(ree_type, *MakeScalar(float32(), 2.0f))); + ASSERT_OK_AND_ASSIGN(auto s4, MakeScalar(ree_type, *MakeScalar(float32(), 2.0f))); + ASSERT_OK_AND_ASSIGN(auto s5, MakeScalar(ree_type, *MakeScalar(float32(), 3.0f))); + + ScalarVector scalars = {s1, s2, s3, s4, s5}; + + ASSERT_OK(builder->AppendScalars(scalars)); + ASSERT_EQ(builder->length(), 5); + ASSERT_OK_AND_ASSIGN(auto array, builder->Finish()); + ASSERT_OK(array->ValidateFull()); + + auto ree_array = std::dynamic_pointer_cast(array); + ASSERT_NE(ree_array, NULLPTR); + auto expected_run_ends = ArrayFromJSON(run_end_type, "[2,4,5]"); + auto expected_values = ArrayFromJSON(float32(), "[1,2,3]"); + ASSERT_ARRAYS_EQUAL(*expected_run_ends, *ree_array->run_ends()); + ASSERT_ARRAYS_EQUAL(*expected_values, *ree_array->values()); +} TEST_P(TestRunEndEncodedArray, BuilderReuseAfterFinish) { // GH-45532: RunEndEncodedBuilder should clear dimensions after a Finish() call diff --git a/cpp/src/arrow/array/builder_run_end.cc b/cpp/src/arrow/array/builder_run_end.cc index 9199b5ab498..2edeaff504d 100644 --- a/cpp/src/arrow/array/builder_run_end.cc +++ b/cpp/src/arrow/array/builder_run_end.cc @@ -213,7 +213,10 @@ Status RunEndEncodedBuilder::AppendScalar(const Scalar& scalar, int64_t n_repeat } Status RunEndEncodedBuilder::AppendScalars(const ScalarVector& scalars) { - RETURN_NOT_OK(this->ArrayBuilder::AppendScalars(scalars)); + if (scalars.empty()) return Status::OK(); + for (const auto& scalar : scalars) { + RETURN_NOT_OK(AppendScalar(*scalar, 1)); + } UpdateDimensions(committed_logical_length_, value_run_builder_->open_run_length()); return Status::OK(); }