aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authora-romanov <Anton.Romanov@ydb.tech>2023-03-27 12:03:17 +0300
committera-romanov <Anton.Romanov@ydb.tech>2023-03-27 12:03:17 +0300
commitb826ba6c4f21f1712cbab37e8d04ef1bed83adfa (patch)
tree6426e215d35b79f5b7be678d4fe4ab84fd192b9e
parent3758cf9a6b861c23beae3a1aaa78d18f9ef7e86e (diff)
downloadydb-b826ba6c4f21f1712cbab37e8d04ef1bed83adfa.tar.gz
YQL-15802 Fix AggrAdd for Intervals.
-rw-r--r--ydb/library/yql/minikql/comp_nodes/ut/mkql_fold_ut.cpp22
-rw-r--r--ydb/library/yql/minikql/invoke_builtins/mkql_builtins_add.cpp6
2 files changed, 25 insertions, 3 deletions
diff --git a/ydb/library/yql/minikql/comp_nodes/ut/mkql_fold_ut.cpp b/ydb/library/yql/minikql/comp_nodes/ut/mkql_fold_ut.cpp
index 87c596e094..951aa0158b 100644
--- a/ydb/library/yql/minikql/comp_nodes/ut/mkql_fold_ut.cpp
+++ b/ydb/library/yql/minikql/comp_nodes/ut/mkql_fold_ut.cpp
@@ -758,6 +758,28 @@ Y_UNIT_TEST_SUITE(TMiniKQLFoldNodeTest) {
}
}
+ Y_UNIT_TEST_LLVM(TestFoldAggrAddIntervals) {
+ TSetup<LLVM> setup;
+ TProgramBuilder& pb = *setup.PgmBuilder;
+
+ const auto upper = i64(+1000LL);
+ const auto lower = i64(-1000LL);
+ const auto part = i64(100LL);
+ const auto from = pb.NewDataLiteral<NUdf::EDataSlot::Interval>(NUdf::TStringRef((const char*)&lower, sizeof(lower)));
+ const auto stop = pb.NewDataLiteral<NUdf::EDataSlot::Interval>(NUdf::TStringRef((const char*)&upper, sizeof(upper)));
+ const auto step = pb.NewDataLiteral<NUdf::EDataSlot::Interval>(NUdf::TStringRef((const char*)&part, sizeof(part)));
+ const auto list = pb.ListFromRange(from, stop, step);
+
+ const auto pgmReturn = pb.Fold1(pb.ListFromRange(from, stop, step),
+ [&](TRuntimeNode item) { return pb.NewOptional(item); },
+ [&](TRuntimeNode item, TRuntimeNode state) { return pb.AggrAdd(pb.NewOptional(item), state); }
+ );
+
+ const auto graph = setup.BuildGraph(pgmReturn);
+ const auto value = graph->GetValue();
+ UNIT_ASSERT_VALUES_EQUAL(value.template Get<i64>(), -1000LL);
+ }
+
Y_UNIT_TEST_LLVM(TestFoldFoldPerf) {
TSetup<LLVM> setup;
TProgramBuilder& pb = *setup.PgmBuilder;
diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_add.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_add.cpp
index 967f16e01d..de8ac53030 100644
--- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_add.cpp
+++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_add.cpp
@@ -108,12 +108,12 @@ struct TDateTimeAddT {
const auto lv = ToScaledDate<TLeft>(left.template Get<TLeft>());
const auto rv = ToScaledDate<TRight>(right.template Get<TRight>());
const auto ret = lv + rv;
- if (IsBadDateTime(ret)) {
+ if (std::is_same<TOutput, NUdf::TDataType<NUdf::TInterval>::TLayout>() ? IsBadInterval(ret) : IsBadDateTime(ret)) {
return NUdf::TUnboxedValuePod();
}
auto data = NUdf::TUnboxedValuePod(FromScaledDate<TOutput>(ret));
- if (Tz) {
+ if constexpr (Tz) {
data.SetTimezoneId((std::is_same<TLeft, NUdf::TDataType<NUdf::TInterval>::TLayout>() ? right : left).GetTimezoneId());
}
return data;
@@ -133,7 +133,7 @@ struct TDateTimeAddT {
const auto type = Type::getInt128Ty(context);
const auto zero = ConstantInt::get(type, 0);
- if (Tz) {
+ if constexpr (Tz) {
const uint64_t init[] = {0ULL, 0xFFFFULL};
const auto mask = ConstantInt::get(type, APInt(128, 2, init));
const auto tzid = BinaryOperator::CreateAnd(std::is_same<TLeft, NUdf::TDataType<NUdf::TInterval>::TLayout>() ? right : left, mask, "tzid", block);