summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraneporada <[email protected]>2023-09-03 16:14:00 +0300
committeraneporada <[email protected]>2023-09-03 16:27:41 +0300
commit259167d0860b7708e31eb89900fdba6e073b7388 (patch)
tree4dc07fbfd8b4232dfabff6c70d136530af2f1e3a
parent3b8e8b3907441545b20f9be2b266adc0cae6b1e6 (diff)
Fix AsScalar for nested optionals
initial
-rw-r--r--ydb/library/yql/minikql/computation/mkql_block_impl.cpp20
1 files changed, 13 insertions, 7 deletions
diff --git a/ydb/library/yql/minikql/computation/mkql_block_impl.cpp b/ydb/library/yql/minikql/computation/mkql_block_impl.cpp
index 947315e35ad..c54f76b7bcb 100644
--- a/ydb/library/yql/minikql/computation/mkql_block_impl.cpp
+++ b/ydb/library/yql/minikql/computation/mkql_block_impl.cpp
@@ -18,21 +18,27 @@ namespace {
template<typename T>
arrow::Datum DoConvertScalar(TType* type, const T& value, arrow::MemoryPool& pool) {
+ std::shared_ptr<arrow::DataType> arrowType;
+ MKQL_ENSURE(ConvertArrowType(type, arrowType), "Unsupported type of scalar " << *type);
if (!value) {
- std::shared_ptr<arrow::DataType> arrowType;
- MKQL_ENSURE(ConvertArrowType(type, arrowType), "Unsupported type of scalar");
return arrow::MakeNullScalar(arrowType);
}
+ bool isOptional = false;
if (type->IsOptional()) {
type = AS_TYPE(TOptionalType, type)->GetItemType();
+ isOptional = true;
+ }
+
+ if (type->IsOptional() || (isOptional && type->IsPg())) {
+ // nested optionals
+ std::vector<std::shared_ptr<arrow::Scalar>> arrowValue;
+ arrowValue.emplace_back(DoConvertScalar(type, value.GetOptionalValue(), pool).scalar());
+ return arrow::Datum(std::make_shared<arrow::StructScalar>(arrowValue, arrowType));
}
if (type->IsTuple()) {
auto tupleType = AS_TYPE(TTupleType, type);
- std::shared_ptr<arrow::DataType> arrowType;
- MKQL_ENSURE(ConvertArrowType(type, arrowType), "Unsupported type of scalar");
-
std::vector<std::shared_ptr<arrow::Scalar>> arrowValue;
for (ui32 i = 0; i < tupleType->GetElementsCount(); ++i) {
arrowValue.emplace_back(DoConvertScalar(tupleType->GetElementType(i), value.GetElement(i), pool).scalar());
@@ -82,7 +88,7 @@ arrow::Datum DoConvertScalar(TType* type, const T& value, arrow::MemoryPool& poo
return arrow::Datum(scalar);
}
default:
- MKQL_ENSURE(false, "Unsupported data slot");
+ MKQL_ENSURE(false, "Unsupported data slot " << slot);
}
}
@@ -90,7 +96,7 @@ arrow::Datum DoConvertScalar(TType* type, const T& value, arrow::MemoryPool& poo
return NYql::MakePgScalar(AS_TYPE(TPgType, type), value, pool);
}
- MKQL_ENSURE(false, "Unsupported type");
+ MKQL_ENSURE(false, "Unsupported type " << *type);
}
} // namespace