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"
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;
4348using json::ChunkedArrayFromJSONString;
4449using json::ScalarFromJSONString;
4550
51+ using ::arrow::internal::checked_cast;
52+
4653namespace 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
74101void 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