Skip to content

Commit 6face6e

Browse files
committed
also add helper method for non-utf8 inputs to python/gdb.cc
1 parent 2f9559a commit 6face6e

2 files changed

Lines changed: 41 additions & 10 deletions

File tree

‎cpp/src/arrow/extension/json_test.cc‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ TEST_F(TestJsonExtensionType, JsonRoundtrip) {
6363
}
6464

6565
TEST_F(TestJsonExtensionType, InvalidUTF8) {
66-
const std::vector<std::string> invalid_values = {"Ⱥa\xFFⱭ", "Ɽ\xe1\xbdⱤaA"};
6766
for (const auto& storage_type : {utf8(), large_utf8(), utf8_view()}) {
6867
auto json_type = json(storage_type);
69-
auto invalid_input = BinaryArrayFromStrings(storage_type, invalid_values);
68+
auto invalid_input =
69+
BinaryArrayFromStrings(storage_type, {"Ⱥa\xFFⱭ", "Ɽ\xe1\xbdⱤaA"});
7070
auto ext_arr = ExtensionType::WrapArray(json_type, invalid_input);
7171

7272
ASSERT_RAISES_WITH_MESSAGE(Invalid,

‎python/pyarrow/src/arrow/python/gdb.cc‎

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,13 @@
1717

1818
#include <cstdlib>
1919
#include <memory>
20+
#include <optional>
21+
#include <string>
2022
#include <utility>
23+
#include <vector>
2124

2225
#include "arrow/array.h"
26+
#include "arrow/array/builder_binary.h"
2327
#include "arrow/chunked_array.h"
2428
#include "arrow/datum.h"
2529
#include "arrow/extension/uuid.h"
@@ -29,6 +33,7 @@
2933
#include "arrow/scalar.h"
3034
#include "arrow/table.h"
3135
#include "arrow/type.h"
36+
#include "arrow/util/checked_cast.h"
3237
#include "arrow/util/debug.h"
3338
#include "arrow/util/decimal.h"
3439
#include "arrow/util/key_value_metadata.h"
@@ -43,6 +48,8 @@ using json::ArrayFromJSONString;
4348
using json::ChunkedArrayFromJSONString;
4449
using json::ScalarFromJSONString;
4550

51+
using ::arrow::internal::checked_cast;
52+
4653
namespace gdb {
4754

4855
// Add a nested `arrow` namespace to exercise type lookup from GDB (ARROW-15652)
@@ -69,6 +76,26 @@ std::shared_ptr<Array> SliceArrayFromJSON(const std::shared_ptr<DataType>& ty,
6976
}
7077
}
7178

79+
80+
template <typename BuilderType>
81+
std::shared_ptr<Array> BinaryArrayFromStrings(
82+
const std::shared_ptr<DataType>& type,
83+
const std::vector<std::optional<std::string>>& values) {
84+
std::unique_ptr<ArrayBuilder> builder;
85+
ARROW_CHECK_OK(MakeBuilder(default_memory_pool(), type, &builder));
86+
auto& concrete_builder = checked_cast<BuilderType&>(*builder);
87+
for (const auto& value : values) {
88+
if (value.has_value()) {
89+
ARROW_CHECK_OK(concrete_builder.Append(*value));
90+
} else {
91+
ARROW_CHECK_OK(concrete_builder.AppendNull());
92+
}
93+
}
94+
std::shared_ptr<Array> array;
95+
ARROW_CHECK_OK(concrete_builder.Finish(&array));
96+
return array;
97+
}
98+
7299
} // namespace
73100

74101
void TestSession() {
@@ -448,18 +475,22 @@ void TestSession() {
448475
decimal256(50, 6), R"([null, "-123456789012345678901234567890123456789.012345"])");
449476
auto heap_decimal128_array_sliced = heap_decimal128_array->Slice(1, 1);
450477

451-
auto heap_fixed_size_binary_array =
452-
SliceArrayFromJSON(fixed_size_binary(3), "[null, \"abc\", \"\\u0000\\u001f\xff\"]");
478+
auto heap_fixed_size_binary_array = BinaryArrayFromStrings<FixedSizeBinaryBuilder>(
479+
fixed_size_binary(3), {std::nullopt, "abc", std::string("\x00\x1f\xff", 3)});
453480
auto heap_fixed_size_binary_array_zero_width =
454481
SliceArrayFromJSON(fixed_size_binary(0), R"([null, ""])");
455482
auto heap_fixed_size_binary_array_sliced = heap_fixed_size_binary_array->Slice(1, 1);
456483

457-
const char* json_binary_array = "[null, \"abcd\", \"\\u0000\\u001f\xff\"]";
458-
auto heap_binary_array = SliceArrayFromJSON(binary(), json_binary_array);
459-
auto heap_large_binary_array = SliceArrayFromJSON(large_binary(), json_binary_array);
460-
const char* json_string_array = "[null, \"héhé\", \"invalid \xff char\"]";
461-
auto heap_string_array = SliceArrayFromJSON(utf8(), json_string_array);
462-
auto heap_large_string_array = SliceArrayFromJSON(large_utf8(), json_string_array);
484+
const std::vector<std::optional<std::string>> binary_values = {
485+
std::nullopt, "abcd", std::string("\x00\x1f\xff", 3)};
486+
auto heap_binary_array = BinaryArrayFromStrings<BinaryBuilder>(binary(), binary_values);
487+
auto heap_large_binary_array =
488+
BinaryArrayFromStrings<LargeBinaryBuilder>(large_binary(), binary_values);
489+
const std::vector<std::optional<std::string>> string_values = {std::nullopt, "héhé",
490+
"invalid \xff char"};
491+
auto heap_string_array = BinaryArrayFromStrings<StringBuilder>(utf8(), string_values);
492+
auto heap_large_string_array =
493+
BinaryArrayFromStrings<LargeStringBuilder>(large_utf8(), string_values);
463494
auto heap_binary_array_sliced = heap_binary_array->Slice(1, 1);
464495

465496
// ChunkedArray

0 commit comments

Comments
 (0)