@@ -818,6 +818,18 @@ struct TTestContext {
818818 return values;
819819 }
820820
821+ TType* GetOptionalOptionalVariantType () {
822+ return TOptionalType::Create (GetOptionalVariantValueType (), TypeEnv);
823+ }
824+
825+ TUnboxedValueVector CreateOptionalsOptionalVariantValue (ui32 quantity) {
826+ TUnboxedValueVector values = CreateOptionalsVariantValue (quantity);
827+ for (size_t i = 0 ; i < values.size (); ++i) {
828+ values[i] = (i % 4 != 0 ) ? values[i].MakeOptional () : NUdf::TUnboxedValuePod ();
829+ }
830+ return values;
831+ }
832+
821833 TType* GetTaggedType () {
822834 return TTaggedType::Create (TDataType::Create (NUdf::TDataType<i32 >::Id, TypeEnv), " tag" , TypeEnv);
823835 }
@@ -2343,6 +2355,40 @@ Y_UNIT_TEST_SUITE(KqpFormats_Arrow_Conversion) {
23432355 }
23442356 }
23452357
2358+ Y_UNIT_TEST (NestedType_Optional_OptionalVariantValue) {
2359+ TTestContext context;
2360+
2361+ auto optionalType = context.GetOptionalOptionalVariantType ();
2362+ auto values = context.CreateOptionalsOptionalVariantValue (TEST_ARRAY_NESTED_SIZE);
2363+
2364+ UNIT_ASSERT (IsArrowCompatible (optionalType));
2365+
2366+ auto array = MakeArrowArray (values, optionalType);
2367+ UNIT_ASSERT_C (array->ValidateFull ().ok (), array->ValidateFull ().ToString ());
2368+ UNIT_ASSERT_VALUES_EQUAL (array->length (), values.size ());
2369+
2370+ UNIT_ASSERT (array->type_id () == arrow::Type::STRUCT);
2371+ auto structArray = static_pointer_cast<arrow::StructArray>(array);
2372+ UNIT_ASSERT_VALUES_EQUAL (structArray->num_fields (), 1 );
2373+ UNIT_ASSERT (structArray->field (0 )->type_id () == arrow::Type::STRUCT);
2374+
2375+ auto innerStructArray = static_pointer_cast<arrow::StructArray>(structArray->field (0 ));
2376+ UNIT_ASSERT_VALUES_EQUAL (innerStructArray->num_fields (), 1 );
2377+ UNIT_ASSERT (innerStructArray->field (0 )->type_id () == arrow::Type::DENSE_UNION);
2378+
2379+ auto innerUnionArray = static_pointer_cast<arrow::DenseUnionArray>(innerStructArray->field (0 ));
2380+ UNIT_ASSERT_VALUES_EQUAL (innerUnionArray->num_fields (), 4 );
2381+ UNIT_ASSERT (innerUnionArray->field (0 )->type_id () == arrow::Type::INT32);
2382+ UNIT_ASSERT (innerUnionArray->field (1 )->type_id () == arrow::Type::BINARY);
2383+ UNIT_ASSERT (innerUnionArray->field (2 )->type_id () == arrow::Type::FLOAT);
2384+ UNIT_ASSERT (innerUnionArray->field (3 )->type_id () == arrow::Type::UINT8);
2385+
2386+ for (size_t i = 0 ; i < values.size (); ++i) {
2387+ auto arrowValue = ExtractUnboxedValue (array, i, optionalType, context.HolderFactory );
2388+ AssertUnboxedValuesAreEqual (arrowValue, values[i], optionalType);
2389+ }
2390+ }
2391+
23462392 Y_UNIT_TEST (NestedType_Variant_Struct) {
23472393 TTestContext context;
23482394
0 commit comments