diff --git a/cpp/src/arrow/array/array_list_test.cc b/cpp/src/arrow/array/array_list_test.cc index 8406bd1d8ed1..9908eb588655 100644 --- a/cpp/src/arrow/array/array_list_test.cc +++ b/cpp/src/arrow/array/array_list_test.cc @@ -1532,6 +1532,43 @@ TEST_F(TestMapArray, ValueBuilder) { ASSERT_ARRAYS_EQUAL(*actual_list, map_as_list); } +// GH-51029: Validate MapArray keys with an all-valid bitmap and unknown null count. +TEST_F(TestMapArray, ValidateKeysWithAllValidBitmap) { + auto keys = ArrayFromJSON(utf8(), R"(["a", "b"])"); + auto items = ArrayFromJSON(int32(), "[1, 2]"); + auto offsets = ArrayFromJSON(int32(), "[0, 1, 2]"); + + // Inject an all-valid validity bitmap with kUnknownNullCount. + auto keys_data = keys->data()->Copy(); + keys_data->buffers[0] = ArrayFromJSON(boolean(), "[true, true]")->data()->buffers[1]; + keys_data->null_count = kUnknownNullCount; + + ASSERT_OK_AND_ASSIGN(auto result, + MapArray::FromArrays(offsets, MakeArray(keys_data), items)); + ASSERT_OK(result->ValidateFull()); + ASSERT_EQ(result->length(), 2); +} + +TEST_F(TestMapArray, FromArraysWithAllValidOffsetsBitmap) { + auto offsets = ArrayFromJSON(int32(), "[0, 1, 2]"); + auto keys = ArrayFromJSON(utf8(), R"(["a", "b"])"); + auto items = ArrayFromJSON(int32(), "[1, 2]"); + + // Inject an all-valid validity bitmap with kUnknownNullCount. + auto offsets_data = offsets->data()->Copy(); + offsets_data->buffers[0] = + ArrayFromJSON(boolean(), "[true, true, true]")->data()->buffers[1]; + offsets_data->null_count = kUnknownNullCount; + offsets = MakeArray(offsets_data); + + auto null_bitmap = ArrayFromJSON(boolean(), "[true, true]")->data()->buffers[1]; + + ASSERT_OK_AND_ASSIGN(auto result, + MapArray::FromArrays(offsets, keys, items, pool_, null_bitmap)); + ASSERT_OK(result->ValidateFull()); + ASSERT_EQ(result->length(), 2); +} + // ---------------------------------------------------------------------- // FixedSizeList tests diff --git a/cpp/src/arrow/array/array_nested.cc b/cpp/src/arrow/array/array_nested.cc index c5a26a475c9e..55bce4d0def7 100644 --- a/cpp/src/arrow/array/array_nested.cc +++ b/cpp/src/arrow/array/array_nested.cc @@ -115,7 +115,7 @@ Result::ArrayType>> ListArrayFromArray return Status::TypeError("List offsets must be ", OffsetArrowType::type_name()); } - if (null_bitmap != nullptr && offsets.data()->MayHaveNulls()) { + if (null_bitmap != nullptr && offsets.data()->GetNullCount() != 0) { return Status::Invalid( "Ambiguous to specify both validity map and offsets with nulls"); } @@ -826,7 +826,7 @@ Result> MapArray::FromArraysInternal( return Status::Invalid("Map key and item arrays must be equal length"); } - if (null_bitmap != nullptr && offsets->data()->MayHaveNulls()) { + if (null_bitmap != nullptr && offsets->data()->GetNullCount() != 0) { return Status::Invalid( "Ambiguous to specify both validity map and offsets with nulls"); } @@ -835,7 +835,7 @@ Result> MapArray::FromArraysInternal( return Status::NotImplemented("Null bitmap with offsets slice not supported."); } - if (offsets->data()->MayHaveNulls()) { + if (offsets->data()->GetNullCount() != 0) { ARROW_ASSIGN_OR_RAISE(auto buffers, CleanListOffsets(NULLPTR, *offsets, pool)); return std::make_shared(type, offsets->length() - 1, std::move(buffers), @@ -896,13 +896,13 @@ Status MapArray::ValidateChildData( if (pair_data->type->id() != Type::STRUCT) { return Status::Invalid("Map array child array should have struct type"); } - if (pair_data->MayHaveNulls()) { + if (pair_data->GetNullCount() != 0) { return Status::Invalid("Map array child array should have no nulls"); } if (pair_data->child_data.size() != 2) { return Status::Invalid("Map array child array should have two fields"); } - if (pair_data->child_data[0]->MayHaveNulls()) { + if (pair_data->child_data[0]->GetNullCount() != 0) { return Status::Invalid("Map array keys array should have no nulls"); } return Status::OK();