| 615 | } |
| 616 | |
| 617 | void AssertAppendScalar(MemoryPool* pool, const std::shared_ptr<Scalar>& scalar) { |
| 618 | std::unique_ptr<arrow::ArrayBuilder> builder; |
| 619 | auto null_scalar = MakeNullScalar(scalar->type); |
| 620 | ASSERT_OK(MakeBuilderExactIndex(pool, scalar->type, &builder)); |
| 621 | ASSERT_OK(builder->AppendScalar(*scalar)); // [0] = scalar |
| 622 | ASSERT_OK(builder->AppendScalar(*scalar)); // [1] = scalar |
| 623 | ASSERT_OK(builder->AppendScalar(*null_scalar)); // [2] = NULL |
| 624 | ASSERT_OK(builder->AppendScalars({scalar, null_scalar})); // [3, 4] = {scalar, NULL} |
| 625 | ASSERT_OK( |
| 626 | builder->AppendScalar(*scalar, /*n_repeats=*/2)); // [5, 6] = {scalar, scalar} |
| 627 | ASSERT_OK( |
| 628 | builder->AppendScalar(*null_scalar, /*n_repeats=*/2)); // [7, 8] = {NULL, NULL} |
| 629 | |
| 630 | std::shared_ptr<Array> out; |
| 631 | FinishAndCheckPadding(builder.get(), &out); |
| 632 | ASSERT_OK(out->ValidateFull()); |
| 633 | AssertTypeEqual(scalar->type, out->type()); |
| 634 | ASSERT_EQ(out->length(), 9); |
| 635 | |
| 636 | auto out_type_id = out->type()->id(); |
| 637 | const bool can_check_nulls = internal::may_have_validity_bitmap(out_type_id); |
| 638 | // For a dictionary builder, the output dictionary won't necessarily be the same |
| 639 | const bool can_check_values = !is_dictionary(out_type_id); |
| 640 | |
| 641 | if (can_check_nulls) { |
| 642 | ASSERT_EQ(out->null_count(), 4); |
| 643 | } else { |
| 644 | ASSERT_EQ(out->null_count(), 0); |
| 645 | } |
| 646 | if (scalar->is_valid) { |
| 647 | ASSERT_EQ(out->ComputeLogicalNullCount(), 4); |
| 648 | } else { |
| 649 | ASSERT_EQ(out->ComputeLogicalNullCount(), 9); |
| 650 | } |
| 651 | |
| 652 | for (const auto index : {0, 1, 3, 5, 6}) { |
| 653 | ASSERT_NE(out->IsNull(index), scalar->is_valid); |
| 654 | ASSERT_OK_AND_ASSIGN(auto scalar_i, out->GetScalar(index)); |
| 655 | ASSERT_OK(scalar_i->ValidateFull()); |
| 656 | if (can_check_values) AssertScalarsEqual(*scalar, *scalar_i, /*verbose=*/true); |
| 657 | } |
| 658 | for (const auto index : {2, 4, 7, 8}) { |
| 659 | ASSERT_TRUE(out->IsNull(index)); |
| 660 | ASSERT_OK_AND_ASSIGN(auto scalar_i, out->GetScalar(index)); |
| 661 | ASSERT_OK(scalar_i->ValidateFull()); |
| 662 | AssertScalarsEqual(*null_scalar, *scalar_i, /*verbose=*/true); |
| 663 | } |
| 664 | } |
| 665 | |
| 666 | static ScalarVector GetScalars() { |
| 667 | auto hello = Buffer::FromString("hello"); |
no test coverage detected