diff options
author | a-romanov <Anton.Romanov@ydb.tech> | 2023-03-27 12:03:17 +0300 |
---|---|---|
committer | a-romanov <Anton.Romanov@ydb.tech> | 2023-03-27 12:03:17 +0300 |
commit | b826ba6c4f21f1712cbab37e8d04ef1bed83adfa (patch) | |
tree | 6426e215d35b79f5b7be678d4fe4ab84fd192b9e | |
parent | 3758cf9a6b861c23beae3a1aaa78d18f9ef7e86e (diff) | |
download | ydb-b826ba6c4f21f1712cbab37e8d04ef1bed83adfa.tar.gz |
YQL-15802 Fix AggrAdd for Intervals.
-rw-r--r-- | ydb/library/yql/minikql/comp_nodes/ut/mkql_fold_ut.cpp | 22 | ||||
-rw-r--r-- | ydb/library/yql/minikql/invoke_builtins/mkql_builtins_add.cpp | 6 |
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); |