Skip to content

Commit 3ec5e4c

Browse files
committed
Double optional variant test
1 parent 97b3ad5 commit 3ec5e4c

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

ydb/core/kqp/common/result_set_format/ut/kqp_formats_arrow_ut.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)