diff options
| author | vvvv <[email protected]> | 2025-10-09 12:25:18 +0300 |
|---|---|---|
| committer | vvvv <[email protected]> | 2025-10-09 12:57:17 +0300 |
| commit | cb77d014972b2cdb27d2e6d979fc3a2772b27ad4 (patch) | |
| tree | 7f3bcd8ce71c6bd0f3ccc11e31b9f665475b819e /yql/essentials/minikql/comp_nodes/mkql_frombytes.cpp | |
| parent | d58a8990d353b051c27e1069141117fdfde64358 (diff) | |
YQL-20086 minikql
commit_hash:e96f7390db5fcbe7e9f64f898141a263ad522daa
Diffstat (limited to 'yql/essentials/minikql/comp_nodes/mkql_frombytes.cpp')
| -rw-r--r-- | yql/essentials/minikql/comp_nodes/mkql_frombytes.cpp | 223 |
1 files changed, 112 insertions, 111 deletions
diff --git a/yql/essentials/minikql/comp_nodes/mkql_frombytes.cpp b/yql/essentials/minikql/comp_nodes/mkql_frombytes.cpp index 7e905056402..aead7098e35 100644 --- a/yql/essentials/minikql/comp_nodes/mkql_frombytes.cpp +++ b/yql/essentials/minikql/comp_nodes/mkql_frombytes.cpp @@ -19,8 +19,9 @@ namespace { using NYql::SwapBytes; template <bool IsOptional> -class TFromBytesWrapper : public TMutableComputationNode<TFromBytesWrapper<IsOptional>> { +class TFromBytesWrapper: public TMutableComputationNode<TFromBytesWrapper<IsOptional>> { typedef TMutableComputationNode<TFromBytesWrapper<IsOptional>> TBaseComputation; + public: TFromBytesWrapper(TComputationMutables& mutables, IComputationNode* data, NUdf::TDataTypeId schemeType, ui32 param1, ui32 param2) : TBaseComputation(mutables) @@ -47,150 +48,150 @@ public: } switch (SchemeType) { - case NUdf::EDataSlot::TzDate: { - const auto& ref = data.AsStringRef(); - if (ref.Size() != 4) { - return NUdf::TUnboxedValuePod(); - } - - auto tzId = SwapBytes(ReadUnaligned<ui16>(ref.Data() + ref.Size() - sizeof(ui16))); - auto value = SwapBytes(data.Get<ui16>()); - if (value < NUdf::MAX_DATE && tzId < NTi::GetTimezones().size()) { - auto ret = NUdf::TUnboxedValuePod(value); - ret.SetTimezoneId(tzId); - return ret; - } + case NUdf::EDataSlot::TzDate: { + const auto& ref = data.AsStringRef(); + if (ref.Size() != 4) { + return NUdf::TUnboxedValuePod(); + } + + auto tzId = SwapBytes(ReadUnaligned<ui16>(ref.Data() + ref.Size() - sizeof(ui16))); + auto value = SwapBytes(data.Get<ui16>()); + if (value < NUdf::MAX_DATE && tzId < NTi::GetTimezones().size()) { + auto ret = NUdf::TUnboxedValuePod(value); + ret.SetTimezoneId(tzId); + return ret; + } - return NUdf::TUnboxedValuePod(); - } - - case NUdf::EDataSlot::TzDatetime: { - const auto& ref = data.AsStringRef(); - if (ref.Size() != 6) { return NUdf::TUnboxedValuePod(); } - auto tzId = SwapBytes(ReadUnaligned<ui16>(ref.Data() + ref.Size() - sizeof(ui16))); - auto value = SwapBytes(data.Get<ui32>()); - if (value < NUdf::MAX_DATETIME && tzId < NTi::GetTimezones().size()) { - auto ret = NUdf::TUnboxedValuePod(value); - ret.SetTimezoneId(tzId); - return ret; - } + case NUdf::EDataSlot::TzDatetime: { + const auto& ref = data.AsStringRef(); + if (ref.Size() != 6) { + return NUdf::TUnboxedValuePod(); + } - return NUdf::TUnboxedValuePod(); - } + auto tzId = SwapBytes(ReadUnaligned<ui16>(ref.Data() + ref.Size() - sizeof(ui16))); + auto value = SwapBytes(data.Get<ui32>()); + if (value < NUdf::MAX_DATETIME && tzId < NTi::GetTimezones().size()) { + auto ret = NUdf::TUnboxedValuePod(value); + ret.SetTimezoneId(tzId); + return ret; + } - case NUdf::EDataSlot::TzTimestamp: { - const auto& ref = data.AsStringRef(); - if (ref.Size() != 10) { return NUdf::TUnboxedValuePod(); } - auto tzId = SwapBytes(ReadUnaligned<ui16>(ref.Data() + ref.Size() - sizeof(ui16))); - auto value = SwapBytes(data.Get<ui64>()); - if (value < NUdf::MAX_TIMESTAMP && tzId < NTi::GetTimezones().size()) { - auto ret = NUdf::TUnboxedValuePod(value); - ret.SetTimezoneId(tzId); - return ret; - } + case NUdf::EDataSlot::TzTimestamp: { + const auto& ref = data.AsStringRef(); + if (ref.Size() != 10) { + return NUdf::TUnboxedValuePod(); + } - return NUdf::TUnboxedValuePod(); - } + auto tzId = SwapBytes(ReadUnaligned<ui16>(ref.Data() + ref.Size() - sizeof(ui16))); + auto value = SwapBytes(data.Get<ui64>()); + if (value < NUdf::MAX_TIMESTAMP && tzId < NTi::GetTimezones().size()) { + auto ret = NUdf::TUnboxedValuePod(value); + ret.SetTimezoneId(tzId); + return ret; + } - case NUdf::EDataSlot::TzDate32: { - const auto& ref = data.AsStringRef(); - if (ref.Size() != 6) { return NUdf::TUnboxedValuePod(); } - auto tzId = SwapBytes(ReadUnaligned<ui16>(ref.Data() + ref.Size() - sizeof(ui16))); - auto value = SwapBytes(data.Get<i32>()); - if (value >= NUdf::MIN_DATE32 && value <= NUdf::MAX_DATE32 && tzId < NTi::GetTimezones().size()) { - auto ret = NUdf::TUnboxedValuePod(value); - ret.SetTimezoneId(tzId); - return ret; - } + case NUdf::EDataSlot::TzDate32: { + const auto& ref = data.AsStringRef(); + if (ref.Size() != 6) { + return NUdf::TUnboxedValuePod(); + } - return NUdf::TUnboxedValuePod(); - } + auto tzId = SwapBytes(ReadUnaligned<ui16>(ref.Data() + ref.Size() - sizeof(ui16))); + auto value = SwapBytes(data.Get<i32>()); + if (value >= NUdf::MIN_DATE32 && value <= NUdf::MAX_DATE32 && tzId < NTi::GetTimezones().size()) { + auto ret = NUdf::TUnboxedValuePod(value); + ret.SetTimezoneId(tzId); + return ret; + } - case NUdf::EDataSlot::TzDatetime64: { - const auto& ref = data.AsStringRef(); - if (ref.Size() != 10) { return NUdf::TUnboxedValuePod(); } - auto tzId = SwapBytes(ReadUnaligned<ui16>(ref.Data() + ref.Size() - sizeof(ui16))); - auto value = SwapBytes(data.Get<i64>()); - if (value >= NUdf::MIN_DATETIME64 && value <= NUdf::MAX_DATETIME64 && tzId < NTi::GetTimezones().size()) { - auto ret = NUdf::TUnboxedValuePod(value); - ret.SetTimezoneId(tzId); - return ret; - } + case NUdf::EDataSlot::TzDatetime64: { + const auto& ref = data.AsStringRef(); + if (ref.Size() != 10) { + return NUdf::TUnboxedValuePod(); + } - return NUdf::TUnboxedValuePod(); - } + auto tzId = SwapBytes(ReadUnaligned<ui16>(ref.Data() + ref.Size() - sizeof(ui16))); + auto value = SwapBytes(data.Get<i64>()); + if (value >= NUdf::MIN_DATETIME64 && value <= NUdf::MAX_DATETIME64 && tzId < NTi::GetTimezones().size()) { + auto ret = NUdf::TUnboxedValuePod(value); + ret.SetTimezoneId(tzId); + return ret; + } - case NUdf::EDataSlot::TzTimestamp64: { - const auto& ref = data.AsStringRef(); - if (ref.Size() != 10) { return NUdf::TUnboxedValuePod(); } - auto tzId = SwapBytes(ReadUnaligned<ui16>(ref.Data() + ref.Size() - sizeof(ui16))); - auto value = SwapBytes(data.Get<i64>()); - if (value >= NUdf::MIN_TIMESTAMP64 && value <= NUdf::MAX_TIMESTAMP64 && tzId < NTi::GetTimezones().size()) { - auto ret = NUdf::TUnboxedValuePod(value); - ret.SetTimezoneId(tzId); - return ret; - } + case NUdf::EDataSlot::TzTimestamp64: { + const auto& ref = data.AsStringRef(); + if (ref.Size() != 10) { + return NUdf::TUnboxedValuePod(); + } - return NUdf::TUnboxedValuePod(); - } + auto tzId = SwapBytes(ReadUnaligned<ui16>(ref.Data() + ref.Size() - sizeof(ui16))); + auto value = SwapBytes(data.Get<i64>()); + if (value >= NUdf::MIN_TIMESTAMP64 && value <= NUdf::MAX_TIMESTAMP64 && tzId < NTi::GetTimezones().size()) { + auto ret = NUdf::TUnboxedValuePod(value); + ret.SetTimezoneId(tzId); + return ret; + } - case NUdf::EDataSlot::JsonDocument: { - if (!NBinaryJson::IsValidBinaryJson(TStringBuf(data.AsStringRef()))) { return NUdf::TUnboxedValuePod(); } - return data.Release(); - } - case NUdf::EDataSlot::Decimal: { - const auto& ref = data.AsStringRef(); - if (ref.Size() != 15) { - return NUdf::TUnboxedValuePod(); + case NUdf::EDataSlot::JsonDocument: { + if (!NBinaryJson::IsValidBinaryJson(TStringBuf(data.AsStringRef()))) { + return NUdf::TUnboxedValuePod(); + } + return data.Release(); } - NYql::NDecimal::TInt128 v = 0; - ui8* p = (ui8*)&v; - memcpy(p, ref.Data(), 15); - p[0xF] = (p[0xE] & 0x80) ? 0xFF : 0x00; - if (NYql::NDecimal::IsError(v)) { - return NUdf::TUnboxedValuePod(); - } + case NUdf::EDataSlot::Decimal: { + const auto& ref = data.AsStringRef(); + if (ref.Size() != 15) { + return NUdf::TUnboxedValuePod(); + } - if (!NYql::NDecimal::IsNormal(v)) { - return NUdf::TUnboxedValuePod(v); - } + NYql::NDecimal::TInt128 v = 0; + ui8* p = (ui8*)&v; + memcpy(p, ref.Data(), 15); + p[0xF] = (p[0xE] & 0x80) ? 0xFF : 0x00; + if (NYql::NDecimal::IsError(v)) { + return NUdf::TUnboxedValuePod(); + } - if (v >= DecimalBound) { - return NUdf::TUnboxedValuePod(NYql::NDecimal::Inf()); - } + if (!NYql::NDecimal::IsNormal(v)) { + return NUdf::TUnboxedValuePod(v); + } - if (v <= NegDecimalBound) { - return NUdf::TUnboxedValuePod(-NYql::NDecimal::Inf()); - } + if (v >= DecimalBound) { + return NUdf::TUnboxedValuePod(NYql::NDecimal::Inf()); + } - return NUdf::TUnboxedValuePod(v); - } + if (v <= NegDecimalBound) { + return NUdf::TUnboxedValuePod(-NYql::NDecimal::Inf()); + } - default: - if (IsValidValue(SchemeType, data)) { - return data.Release(); - } else { - return NUdf::TUnboxedValuePod(); + return NUdf::TUnboxedValuePod(v); } + + default: + if (IsValidValue(SchemeType, data)) { + return data.Release(); + } else { + return NUdf::TUnboxedValuePod(); + } } } @@ -206,7 +207,7 @@ private: NYql::NDecimal::TInt128 DecimalBound, NegDecimalBound; }; -} +} // namespace IComputationNode* WrapFromBytes(TCallable& callable, const TComputationNodeFactoryContext& ctx) { MKQL_ENSURE(callable.GetInputsCount() == 2 || callable.GetInputsCount() == 4, "Expected 2 or 4 args"); @@ -237,5 +238,5 @@ IComputationNode* WrapFromBytes(TCallable& callable, const TComputationNodeFacto } } -} -} +} // namespace NMiniKQL +} // namespace NKikimr |
