@@ -158,6 +158,12 @@ Status RowToArrowArrayConverter<T, R>::Reserve(arrow::ArrayBuilder* array_builde
158158 PAIMON_RETURN_NOT_OK (Reserve (list_builder->value_builder (), idx));
159159 break ;
160160 }
161+ case arrow::Type::type::FIXED_SIZE_LIST : {
162+ PAIMON_ASSIGN_OR_RAISE (auto * list_builder,
163+ CastToTypedBuilder<arrow::FixedSizeListBuilder>(array_builder));
164+ PAIMON_RETURN_NOT_OK (Reserve (list_builder->value_builder (), idx));
165+ break ;
166+ }
161167 case arrow::Type::type::MAP : {
162168 PAIMON_ASSIGN_OR_RAISE (auto * map_builder,
163169 CastToTypedBuilder<arrow::MapBuilder>(array_builder));
@@ -224,6 +230,11 @@ Status RowToArrowArrayConverter<T, R>::Accumulate(const arrow::Array* array, int
224230 PAIMON_RETURN_NOT_OK (Accumulate (list_array->values ().get (), idx));
225231 break ;
226232 }
233+ case arrow::Type::type::FIXED_SIZE_LIST : {
234+ auto list_array = checked_cast<const arrow::FixedSizeListArray*>(array);
235+ PAIMON_RETURN_NOT_OK (Accumulate (list_array->values ().get (), idx));
236+ break ;
237+ }
227238 case arrow::Type::type::MAP : {
228239 auto map_array = checked_cast<const arrow::MapArray*>(array);
229240 PAIMON_RETURN_NOT_OK (Accumulate (map_array->keys ().get (), idx));
@@ -432,6 +443,31 @@ RowToArrowArrayConverter<T, R>::AppendField(bool use_view, arrow::ArrayBuilder*
432443 return arrow::Status::OK ();
433444 });
434445 }
446+ case arrow::Type::type::FIXED_SIZE_LIST : {
447+ PAIMON_ASSIGN_OR_RAISE (auto * list_builder,
448+ CastToTypedBuilder<arrow::FixedSizeListBuilder>(array_builder));
449+ std::shared_ptr<arrow::FixedSizeListType> list_type =
450+ checked_pointer_cast<arrow::FixedSizeListType>(list_builder->type ());
451+ int32_t list_size = list_type->list_size ();
452+ PAIMON_ASSIGN_OR_RAISE (AppendValueFunc value_func,
453+ (RowToArrowArrayConverter<T, R>::AppendField (
454+ use_view, list_builder->value_builder (), reserve_count)));
455+ return RowToArrowArrayConverter<T, R>::AppendValueFunc (
456+ [list_builder, list_size, value_func](const DataGetters& data_getter,
457+ int32_t pos) -> arrow::Status {
458+ CHECK_AND_APPEND_NULL (data_getter, list_builder, pos);
459+ std::shared_ptr<InternalArray> sub_array = data_getter.GetArray (pos);
460+ if (!sub_array || sub_array->Size () != list_size) {
461+ return arrow::Status::Invalid (
462+ " VECTOR length does not match its declared dimension" );
463+ }
464+ ARROW_RETURN_NOT_OK (list_builder->Append ());
465+ for (int32_t i = 0 ; i < list_size; ++i) {
466+ ARROW_RETURN_NOT_OK (value_func (*sub_array, i));
467+ }
468+ return arrow::Status::OK ();
469+ });
470+ }
435471 case arrow::Type::type::MAP : {
436472 PAIMON_ASSIGN_OR_RAISE (auto * map_builder,
437473 CastToTypedBuilder<arrow::MapBuilder>(array_builder));
0 commit comments