From 83cc74801ca5ced9b1bfdb968d0a8fd89e8f2c43 Mon Sep 17 00:00:00 2001 From: Alexey Ozeritskiy Date: Sun, 18 Aug 2024 19:46:02 +0200 Subject: Correct work with TInt128 (win32 compile fix) (#7964) --- ydb/library/yql/minikql/arrow/mkql_bit_utils.h | 9 ++++----- .../yql/minikql/comp_nodes/mkql_block_agg_minmax.cpp | 5 +++-- .../yql/providers/yt/comp_nodes/dq/arrow_converter.cpp | 15 +++++++++------ ydb/library/yql/public/udf/arrow/block_reader.h | 14 ++++++++++++-- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/ydb/library/yql/minikql/arrow/mkql_bit_utils.h b/ydb/library/yql/minikql/arrow/mkql_bit_utils.h index d11c94b4465..c7de68238d0 100644 --- a/ydb/library/yql/minikql/arrow/mkql_bit_utils.h +++ b/ydb/library/yql/minikql/arrow/mkql_bit_utils.h @@ -26,13 +26,12 @@ inline ui8 LoadByteUnaligned(const ui8* bitmap, size_t bitmapOffset) { template inline T SelectArg(ui8 isFirst, T first, T second) { - static_assert(std::is_arithmetic::value); - if constexpr (std::is_floating_point::value) { - return isFirst ? first : second; - } else { + if constexpr (std::is_arithmetic_v && !std::is_floating_point_v) { // isFirst == 1 -> mask 0xFF..FF, isFirst == 0 -> mask 0x00..00 T mask = -T(isFirst); return (first & mask) | (second & ~mask); + } else { + return isFirst ? first : second; } } @@ -160,4 +159,4 @@ using NYql::NUdf::CompressArray; using NYql::NUdf::DecompressToSparseBitmap; } // namespace NMiniKQL -} // namespace NKikimr \ No newline at end of file +} // namespace NKikimr diff --git a/ydb/library/yql/minikql/comp_nodes/mkql_block_agg_minmax.cpp b/ydb/library/yql/minikql/comp_nodes/mkql_block_agg_minmax.cpp index 0c2dae395ff..2c8e274c36c 100644 --- a/ydb/library/yql/minikql/comp_nodes/mkql_block_agg_minmax.cpp +++ b/ydb/library/yql/minikql/comp_nodes/mkql_block_agg_minmax.cpp @@ -87,7 +87,6 @@ struct TState; template constexpr TIn InitialStateValue() { - static_assert(std::is_arithmetic::value); if constexpr (std::is_floating_point::value) { static_assert(std::numeric_limits::has_infinity && std::numeric_limits::has_quiet_NaN); if constexpr (IsMin) { @@ -102,12 +101,14 @@ constexpr TIn InitialStateValue() { } else { return -NYql::NDecimal::Inf(); } - } else { + } else if constexpr (std::is_arithmetic::value) { if constexpr (IsMin) { return std::numeric_limits::max(); } else { return std::numeric_limits::min(); } + } else { + static_assert(std::is_arithmetic::value); } } diff --git a/ydb/library/yql/providers/yt/comp_nodes/dq/arrow_converter.cpp b/ydb/library/yql/providers/yt/comp_nodes/dq/arrow_converter.cpp index b438e139359..3104c2fc749 100644 --- a/ydb/library/yql/providers/yt/comp_nodes/dq/arrow_converter.cpp +++ b/ydb/library/yql/providers/yt/comp_nodes/dq/arrow_converter.cpp @@ -401,7 +401,7 @@ public: } } - if constexpr (std::is_integral_v) { + if constexpr (std::is_integral_v && !std::is_same_v) { if constexpr (std::is_signed_v) { YQL_ENSURE(buf.Current() == Int64Marker); buf.Next(); @@ -411,11 +411,13 @@ public: buf.Next(); return NUdf::TBlockItem(T(buf.ReadVarUI64())); } + } else if constexpr (std::is_floating_point_v) { + YQL_ENSURE(buf.Current() == DoubleMarker); + buf.Next(); + return NUdf::TBlockItem(T(buf.NextDouble())); + } else { + static_assert(std::is_floating_point_v); } - - YQL_ENSURE(buf.Current() == DoubleMarker); - buf.Next(); - return NUdf::TBlockItem(T(buf.NextDouble())); } }; @@ -460,7 +462,8 @@ struct TYsonBlockReaderTraits { using TResult = IYsonBlockReader; template using TTuple = TYsonTupleBlockReader; - template + // TODO: Implement reader for decimals + template && (std::is_integral_v || std::is_floating_point_v)>> using TFixedSize = TYsonFixedSizeBlockReader; template using TStrings = TYsonStringBlockReader; diff --git a/ydb/library/yql/public/udf/arrow/block_reader.h b/ydb/library/yql/public/udf/arrow/block_reader.h index dd72f51ac79..27b89d5e694 100644 --- a/ydb/library/yql/public/udf/arrow/block_reader.h +++ b/ydb/library/yql/public/udf/arrow/block_reader.h @@ -553,6 +553,11 @@ std::unique_ptr MakeStringBlockReaderImpl(bool isOpti } } +template +concept CanInstantiateBlockReaderForDecimal = requires { + typename TTraits::template TFixedSize; +}; + template std::unique_ptr MakeBlockReaderImpl(const ITypeInfoHelper& typeInfoHelper, const TType* type, const IPgBuilder* pgBuilder) { const TType* unpacked = type; @@ -672,8 +677,13 @@ std::unique_ptr MakeBlockReaderImpl(const ITypeInfoHe return TTraits::template MakeTzDate(isOptional); case NUdf::EDataSlot::TzTimestamp64: return TTraits::template MakeTzDate(isOptional); - case NUdf::EDataSlot::Decimal: - return MakeFixedSizeBlockReaderImpl(isOptional); + case NUdf::EDataSlot::Decimal: { + if constexpr (CanInstantiateBlockReaderForDecimal) { + return MakeFixedSizeBlockReaderImpl(isOptional); + } else { + Y_ENSURE(false, "Unsupported data slot"); + } + } case NUdf::EDataSlot::Uuid: case NUdf::EDataSlot::DyNumber: Y_ENSURE(false, "Unsupported data slot"); -- cgit v1.3