summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Ozeritskiy <[email protected]>2024-08-18 19:46:02 +0200
committerGitHub <[email protected]>2024-08-18 20:46:02 +0300
commit83cc74801ca5ced9b1bfdb968d0a8fd89e8f2c43 (patch)
tree7d2b275f6e10872b1714d20e0e487316114ae0f0
parent3151c0a4f025d072308f770b1c561045e86ac378 (diff)
Correct work with TInt128 (win32 compile fix) (#7964)
-rw-r--r--ydb/library/yql/minikql/arrow/mkql_bit_utils.h9
-rw-r--r--ydb/library/yql/minikql/comp_nodes/mkql_block_agg_minmax.cpp5
-rw-r--r--ydb/library/yql/providers/yt/comp_nodes/dq/arrow_converter.cpp15
-rw-r--r--ydb/library/yql/public/udf/arrow/block_reader.h14
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");