diff options
| author | Alexey Ozeritskiy <[email protected]> | 2024-08-18 19:46:02 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-08-18 20:46:02 +0300 |
| commit | 83cc74801ca5ced9b1bfdb968d0a8fd89e8f2c43 (patch) | |
| tree | 7d2b275f6e10872b1714d20e0e487316114ae0f0 | |
| parent | 3151c0a4f025d072308f770b1c561045e86ac378 (diff) | |
Correct work with TInt128 (win32 compile fix) (#7964)
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<typename T> inline T SelectArg(ui8 isFirst, T first, T second) { - static_assert(std::is_arithmetic<T>::value); - if constexpr (std::is_floating_point<T>::value) { - return isFirst ? first : second; - } else { + if constexpr (std::is_arithmetic_v<T> && !std::is_floating_point_v<T>) { // 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<typename TIn, bool IsMin> constexpr TIn InitialStateValue() { - static_assert(std::is_arithmetic<TIn>::value); if constexpr (std::is_floating_point<TIn>::value) { static_assert(std::numeric_limits<TIn>::has_infinity && std::numeric_limits<TIn>::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<TIn>::value) { if constexpr (IsMin) { return std::numeric_limits<TIn>::max(); } else { return std::numeric_limits<TIn>::min(); } + } else { + static_assert(std::is_arithmetic<TIn>::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<T>) { + if constexpr (std::is_integral_v<T> && !std::is_same_v<T, NYql::NDecimal::TInt128>) { if constexpr (std::is_signed_v<T>) { 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<T>) { + YQL_ENSURE(buf.Current() == DoubleMarker); + buf.Next(); + return NUdf::TBlockItem(T(buf.NextDouble())); + } else { + static_assert(std::is_floating_point_v<T>); } - - YQL_ENSURE(buf.Current() == DoubleMarker); - buf.Next(); - return NUdf::TBlockItem(T(buf.NextDouble())); } }; @@ -460,7 +462,8 @@ struct TYsonBlockReaderTraits { using TResult = IYsonBlockReader; template <bool Nullable> using TTuple = TYsonTupleBlockReader<Nullable, Native>; - template <typename T, bool Nullable> + // TODO: Implement reader for decimals + template <typename T, bool Nullable, typename = std::enable_if_t<!std::is_same_v<T, NYql::NDecimal::TInt128> && (std::is_integral_v<T> || std::is_floating_point_v<T>)>> using TFixedSize = TYsonFixedSizeBlockReader<T, Nullable, Native>; template <typename TStringType, bool Nullable, NKikimr::NUdf::EDataSlot OriginalT> using TStrings = TYsonStringBlockReader<TStringType, Nullable, OriginalT, Native>; 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<typename TTraits::TResult> MakeStringBlockReaderImpl(bool isOpti } } +template<typename TTraits> +concept CanInstantiateBlockReaderForDecimal = requires { + typename TTraits::template TFixedSize<NYql::NDecimal::TInt128, true>; +}; + template <typename TTraits> std::unique_ptr<typename TTraits::TResult> MakeBlockReaderImpl(const ITypeInfoHelper& typeInfoHelper, const TType* type, const IPgBuilder* pgBuilder) { const TType* unpacked = type; @@ -672,8 +677,13 @@ std::unique_ptr<typename TTraits::TResult> MakeBlockReaderImpl(const ITypeInfoHe return TTraits::template MakeTzDate<TTzDatetime64>(isOptional); case NUdf::EDataSlot::TzTimestamp64: return TTraits::template MakeTzDate<TTzTimestamp64>(isOptional); - case NUdf::EDataSlot::Decimal: - return MakeFixedSizeBlockReaderImpl<TTraits, NYql::NDecimal::TInt128>(isOptional); + case NUdf::EDataSlot::Decimal: { + if constexpr (CanInstantiateBlockReaderForDecimal<TTraits>) { + return MakeFixedSizeBlockReaderImpl<TTraits, NYql::NDecimal::TInt128>(isOptional); + } else { + Y_ENSURE(false, "Unsupported data slot"); + } + } case NUdf::EDataSlot::Uuid: case NUdf::EDataSlot::DyNumber: Y_ENSURE(false, "Unsupported data slot"); |
