aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorva-kuznecov <va-kuznecov@ydb.tech>2023-05-24 13:13:05 +0300
committerva-kuznecov <va-kuznecov@ydb.tech>2023-05-24 13:13:05 +0300
commite39ab42935cf9ac9c1be81e37e425192f7f5ad68 (patch)
tree3dffc4e818e2109ac887a1675717591a7c7c93be
parent05d7cbd5c42cf81abb201436826077dc11896706 (diff)
downloadydb-e39ab42935cf9ac9c1be81e37e425192f7f5ad68.tar.gz
Fix datarace in yson2 UDF
-rw-r--r--ydb/library/yql/minikql/dom/make.cpp12
-rw-r--r--ydb/library/yql/minikql/dom/make.h2
-rw-r--r--ydb/library/yql/minikql/dom/peel.cpp26
-rw-r--r--ydb/library/yql/minikql/dom/peel.h2
-rw-r--r--ydb/library/yql/udfs/common/yson2/yson2_udf.cpp6
5 files changed, 24 insertions, 24 deletions
diff --git a/ydb/library/yql/minikql/dom/make.cpp b/ydb/library/yql/minikql/dom/make.cpp
index e28c089589..ead949e404 100644
--- a/ydb/library/yql/minikql/dom/make.cpp
+++ b/ydb/library/yql/minikql/dom/make.cpp
@@ -35,7 +35,7 @@ TUnboxedValuePod MakeData(const TDataTypeId nodeType, const TUnboxedValuePod val
Y_FAIL("Unsupported data type.");
}
-TUnboxedValuePod MakeList(const ITypeInfoHelper::TPtr typeHelper, const TType* itemType, const TUnboxedValuePod value, const IValueBuilder* valueBuilder) {
+TUnboxedValuePod MakeList(const ITypeInfoHelper* typeHelper, const TType* itemType, const TUnboxedValuePod value, const IValueBuilder* valueBuilder) {
if (const auto elements = value.GetElements()) {
if (const auto size = value.GetListLength()) {
TUnboxedValue* items = nullptr;
@@ -63,7 +63,7 @@ TUnboxedValuePod MakeList(const ITypeInfoHelper::TPtr typeHelper, const TType* i
return SetNodeType<ENodeType::List>(TUnboxedValuePod::Void());
}
-TUnboxedValuePod MakeDict(const ITypeInfoHelper::TPtr typeHelper, const TType* itemType, const TUnboxedValuePod value, const IValueBuilder* valueBuilder) {
+TUnboxedValuePod MakeDict(const ITypeInfoHelper* typeHelper, const TType* itemType, const TUnboxedValuePod value, const IValueBuilder* valueBuilder) {
TSmallVec<TPair, TStdAllocatorForUdf<TPair>> items;
items.reserve(value.GetDictLength());
const auto it = value.GetDictIterator();
@@ -78,7 +78,7 @@ TUnboxedValuePod MakeDict(const ITypeInfoHelper::TPtr typeHelper, const TType* i
return SetNodeType<ENodeType::Dict>(TUnboxedValuePod(new TMapNode(items.data(), items.size())));
}
-TUnboxedValuePod MakeTuple(const ITypeInfoHelper::TPtr typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder) {
+TUnboxedValuePod MakeTuple(const ITypeInfoHelper* typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder) {
if (const auto tupleTypeInspector = TTupleTypeInspector(*typeHelper, shape); const auto size = tupleTypeInspector.GetElementsCount()) {
TUnboxedValue* items = nullptr;
auto res = valueBuilder->NewArray(size, items);
@@ -91,7 +91,7 @@ TUnboxedValuePod MakeTuple(const ITypeInfoHelper::TPtr typeHelper, const TType*
return SetNodeType<ENodeType::List>(TUnboxedValuePod::Void());
}
-TUnboxedValuePod MakeStruct(const ITypeInfoHelper::TPtr typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder) {
+TUnboxedValuePod MakeStruct(const ITypeInfoHelper* typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder) {
if (const auto structTypeInspector = TStructTypeInspector(*typeHelper, shape); const auto size = structTypeInspector.GetMembersCount()) {
TSmallVec<TPair, TStdAllocatorForUdf<TPair>> items;
items.reserve(size);
@@ -109,7 +109,7 @@ TUnboxedValuePod MakeStruct(const ITypeInfoHelper::TPtr typeHelper, const TType*
return SetNodeType<ENodeType::Dict>(TUnboxedValuePod::Void());
}
-TUnboxedValuePod MakeVariant(const ITypeInfoHelper::TPtr typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder) {
+TUnboxedValuePod MakeVariant(const ITypeInfoHelper* typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder) {
const auto index = value.GetVariantIndex();
const auto& item = value.GetVariantItem();
const auto underlyingType = TVariantTypeInspector(*typeHelper, shape).GetUnderlyingType();
@@ -130,7 +130,7 @@ TUnboxedValuePod MakeVariant(const ITypeInfoHelper::TPtr typeHelper, const TType
}
-TUnboxedValuePod MakeDom(const ITypeInfoHelper::TPtr typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder) {
+TUnboxedValuePod MakeDom(const ITypeInfoHelper* typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder) {
switch (const auto kind = typeHelper->GetTypeKind(shape)) {
case ETypeKind::Null:
return MakeEntity();
diff --git a/ydb/library/yql/minikql/dom/make.h b/ydb/library/yql/minikql/dom/make.h
index a6bba77819..3cfaabd62f 100644
--- a/ydb/library/yql/minikql/dom/make.h
+++ b/ydb/library/yql/minikql/dom/make.h
@@ -5,6 +5,6 @@
namespace NYql::NDom {
-NUdf::TUnboxedValuePod MakeDom(const NUdf::ITypeInfoHelper::TPtr typeHelper, const NUdf::TType* shape, const NUdf::TUnboxedValuePod value, const NUdf::IValueBuilder* valueBuilder);
+NUdf::TUnboxedValuePod MakeDom(const NUdf::ITypeInfoHelper* typeHelper, const NUdf::TType* shape, const NUdf::TUnboxedValuePod value, const NUdf::IValueBuilder* valueBuilder);
}
diff --git a/ydb/library/yql/minikql/dom/peel.cpp b/ydb/library/yql/minikql/dom/peel.cpp
index 7f996688b8..44a27aa46b 100644
--- a/ydb/library/yql/minikql/dom/peel.cpp
+++ b/ydb/library/yql/minikql/dom/peel.cpp
@@ -37,10 +37,10 @@ TUnboxedValuePod PeelData(const TDataTypeId nodeType, const TUnboxedValuePod val
}
template<bool Strict, bool AutoConvert>
-TUnboxedValuePod TryPeelDom(const ITypeInfoHelper::TPtr typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos);
+TUnboxedValuePod TryPeelDom(const ITypeInfoHelper* typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos);
template<bool Strict, bool AutoConvert>
-TUnboxedValuePod PeelList(const ITypeInfoHelper::TPtr typeHelper, const TType* itemType, const TUnboxedValuePod x, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
+TUnboxedValuePod PeelList(const ITypeInfoHelper* typeHelper, const TType* itemType, const TUnboxedValuePod x, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
switch (GetNodeType(x)) {
case ENodeType::List: {
if (!x.IsBoxed())
@@ -87,7 +87,7 @@ TUnboxedValuePod PeelList(const ITypeInfoHelper::TPtr typeHelper, const TType* i
}
template<bool Strict, bool AutoConvert, bool Utf8Keys>
-TUnboxedValuePod PeelDict(const ITypeInfoHelper::TPtr typeHelper, const TType* itemType, const TUnboxedValuePod x, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
+TUnboxedValuePod PeelDict(const ITypeInfoHelper* typeHelper, const TType* itemType, const TUnboxedValuePod x, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
switch (GetNodeType(x)) {
case ENodeType::Dict:
if (!x.IsBoxed())
@@ -130,7 +130,7 @@ TUnboxedValuePod PeelDict(const ITypeInfoHelper::TPtr typeHelper, const TType* i
return valueBuilder->NewEmptyList().Release();
}
-TUnboxedValuePod MakeStub(const ITypeInfoHelper::TPtr typeHelper, const TType* shape, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
+TUnboxedValuePod MakeStub(const ITypeInfoHelper* typeHelper, const TType* shape, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
switch (const auto kind = typeHelper->GetTypeKind(shape)) {
case ETypeKind::Optional:
return TUnboxedValuePod();
@@ -191,7 +191,7 @@ TUnboxedValuePod MakeStub(const ITypeInfoHelper::TPtr typeHelper, const TType* s
}
template<bool Strict, bool AutoConvert>
-TUnboxedValuePod PeelTuple(const ITypeInfoHelper::TPtr typeHelper, const TType* shape, const TUnboxedValuePod x, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
+TUnboxedValuePod PeelTuple(const ITypeInfoHelper* typeHelper, const TType* shape, const TUnboxedValuePod x, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
if (const auto tupleTypeInspector = TTupleTypeInspector(*typeHelper, shape); auto count = tupleTypeInspector.GetElementsCount()) {
switch (GetNodeType(x)) {
case ENodeType::List: {
@@ -254,7 +254,7 @@ TUnboxedValuePod PeelTuple(const ITypeInfoHelper::TPtr typeHelper, const TType*
}
template<bool Strict, bool AutoConvert>
-TUnboxedValuePod PeelStruct(const ITypeInfoHelper::TPtr typeHelper, const TType* shape, const TUnboxedValuePod x, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
+TUnboxedValuePod PeelStruct(const ITypeInfoHelper* typeHelper, const TType* shape, const TUnboxedValuePod x, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
if (const auto structTypeInspector = TStructTypeInspector(*typeHelper, shape)) {
const auto size = structTypeInspector.GetMembersCount();
switch (GetNodeType(x)) {
@@ -307,7 +307,7 @@ TUnboxedValuePod PeelStruct(const ITypeInfoHelper::TPtr typeHelper, const TType*
}
template<bool Strict, bool AutoConvert>
-TUnboxedValuePod PeelOptional(const ITypeInfoHelper::TPtr typeHelper, const TType* itemType, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
+TUnboxedValuePod PeelOptional(const ITypeInfoHelper* typeHelper, const TType* itemType, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
if (IsNodeType<ENodeType::Entity>(value))
return TUnboxedValuePod().MakeOptional();
@@ -320,7 +320,7 @@ TUnboxedValuePod PeelOptional(const ITypeInfoHelper::TPtr typeHelper, const TTyp
}
template<bool Strict, bool AutoConvert>
-TUnboxedValuePod TryPeelDom(const ITypeInfoHelper::TPtr typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
+TUnboxedValuePod TryPeelDom(const ITypeInfoHelper* typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
switch (const auto kind = typeHelper->GetTypeKind(shape)) {
case ETypeKind::Data:
return PeelData<Strict, AutoConvert>(TDataTypeInspector(*typeHelper, shape).GetTypeId(), value, valueBuilder, pos);
@@ -356,7 +356,7 @@ TUnboxedValuePod TryPeelDom(const ITypeInfoHelper::TPtr typeHelper, const TType*
}
template<bool Strict, bool AutoConvert>
-TUnboxedValuePod PeelDom(const ITypeInfoHelper::TPtr typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
+TUnboxedValuePod PeelDom(const ITypeInfoHelper* typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos) {
if (const auto result = TryPeelDom<Strict, AutoConvert>(typeHelper, shape, value, valueBuilder, pos))
return result.GetOptionalValue();
::TStringBuilder sb;
@@ -365,9 +365,9 @@ TUnboxedValuePod PeelDom(const ITypeInfoHelper::TPtr typeHelper, const TType* sh
UdfTerminate(sb.c_str());
}
-template TUnboxedValuePod PeelDom<true, true>(const ITypeInfoHelper::TPtr typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos);
-template TUnboxedValuePod PeelDom<false, true>(const ITypeInfoHelper::TPtr typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos);
-template TUnboxedValuePod PeelDom<true, false>(const ITypeInfoHelper::TPtr typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos);
-template TUnboxedValuePod PeelDom<false, false>(const ITypeInfoHelper::TPtr typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos);
+template TUnboxedValuePod PeelDom<true, true>(const ITypeInfoHelper* typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos);
+template TUnboxedValuePod PeelDom<false, true>(const ITypeInfoHelper* typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos);
+template TUnboxedValuePod PeelDom<true, false>(const ITypeInfoHelper* typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos);
+template TUnboxedValuePod PeelDom<false, false>(const ITypeInfoHelper* typeHelper, const TType* shape, const TUnboxedValuePod value, const IValueBuilder* valueBuilder, const TSourcePosition& pos);
}
diff --git a/ydb/library/yql/minikql/dom/peel.h b/ydb/library/yql/minikql/dom/peel.h
index 35e476250f..37302e59b9 100644
--- a/ydb/library/yql/minikql/dom/peel.h
+++ b/ydb/library/yql/minikql/dom/peel.h
@@ -6,6 +6,6 @@
namespace NYql::NDom {
template<bool Strict, bool AutoConvert>
-NUdf::TUnboxedValuePod PeelDom(const NUdf::ITypeInfoHelper::TPtr typeHelper, const NUdf::TType* shape, const NUdf::TUnboxedValuePod value, const NUdf::IValueBuilder* valueBuilder, const NUdf::TSourcePosition& pos);
+NUdf::TUnboxedValuePod PeelDom(const NUdf::ITypeInfoHelper* typeHelper, const NUdf::TType* shape, const NUdf::TUnboxedValuePod value, const NUdf::IValueBuilder* valueBuilder, const NUdf::TSourcePosition& pos);
}
diff --git a/ydb/library/yql/udfs/common/yson2/yson2_udf.cpp b/ydb/library/yql/udfs/common/yson2/yson2_udf.cpp
index 36a90f5a70..1785a046ec 100644
--- a/ydb/library/yql/udfs/common/yson2/yson2_udf.cpp
+++ b/ydb/library/yql/udfs/common/yson2/yson2_udf.cpp
@@ -858,7 +858,7 @@ protected:
class TFrom: public TBase {
TUnboxedValue Run(const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) const final {
- return MakeDom(TypeHelper_, Shape_, *args, valueBuilder);
+ return MakeDom(TypeHelper_.Get(), Shape_, *args, valueBuilder);
}
public:
static const TStringRef& Name() {
@@ -926,9 +926,9 @@ public:
class TConvert: public TBase {
TUnboxedValue Run(const IValueBuilder* valueBuilder, const TUnboxedValuePod* args) const final {
if (const auto options = ParseOptions(args[1]); options.Strict)
- return (options.AutoConvert ? &PeelDom<true, true> : &PeelDom<true, false>)(TypeHelper_, Shape_, args[0], valueBuilder, Pos_);
+ return (options.AutoConvert ? &PeelDom<true, true> : &PeelDom<true, false>)(TypeHelper_.Get(), Shape_, args[0], valueBuilder, Pos_);
else
- return (options.AutoConvert ? &PeelDom<false, true> : &PeelDom<false, false>)(TypeHelper_, Shape_, args[0], valueBuilder, Pos_);
+ return (options.AutoConvert ? &PeelDom<false, true> : &PeelDom<false, false>)(TypeHelper_.Get(), Shape_, args[0], valueBuilder, Pos_);
}
public: