diff options
author | va-kuznecov <va-kuznecov@ydb.tech> | 2023-05-24 13:13:05 +0300 |
---|---|---|
committer | va-kuznecov <va-kuznecov@ydb.tech> | 2023-05-24 13:13:05 +0300 |
commit | e39ab42935cf9ac9c1be81e37e425192f7f5ad68 (patch) | |
tree | 3dffc4e818e2109ac887a1675717591a7c7c93be | |
parent | 05d7cbd5c42cf81abb201436826077dc11896706 (diff) | |
download | ydb-e39ab42935cf9ac9c1be81e37e425192f7f5ad68.tar.gz |
Fix datarace in yson2 UDF
-rw-r--r-- | ydb/library/yql/minikql/dom/make.cpp | 12 | ||||
-rw-r--r-- | ydb/library/yql/minikql/dom/make.h | 2 | ||||
-rw-r--r-- | ydb/library/yql/minikql/dom/peel.cpp | 26 | ||||
-rw-r--r-- | ydb/library/yql/minikql/dom/peel.h | 2 | ||||
-rw-r--r-- | ydb/library/yql/udfs/common/yson2/yson2_udf.cpp | 6 |
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: |