summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVitaly Stoyan <[email protected]>2024-06-10 15:39:07 +0300
committerGitHub <[email protected]>2024-06-10 17:39:07 +0500
commit4ed43f378b03afa11450876ee25ba2cdf675dce6 (patch)
tree3d102c39c87085ecfc5794bda778d92ed49e8028
parent986b35715d12e0d634cd1bfedb7c6e57ecdc04f4 (diff)
[block] subtraction for datetime, interval (#5341)
-rw-r--r--ydb/library/yql/minikql/computation/mkql_block_impl.cpp24
-rw-r--r--ydb/library/yql/minikql/invoke_builtins/mkql_builtins_impl.h.txt317
-rw-r--r--ydb/library/yql/minikql/invoke_builtins/mkql_builtins_sub.cpp152
-rw-r--r--ydb/library/yql/minikql/mkql_type_builder.h4
-rw-r--r--ydb/library/yql/tests/sql/dq_file/part10/canondata/result.json22
-rw-r--r--ydb/library/yql/tests/sql/dq_file/part12/canondata/result.json22
-rw-r--r--ydb/library/yql/tests/sql/dq_file/part18/canondata/result.json22
-rw-r--r--ydb/library/yql/tests/sql/dq_file/part7/canondata/result.json44
-rw-r--r--ydb/library/yql/tests/sql/dq_file/part8/canondata/result.json22
-rw-r--r--ydb/library/yql/tests/sql/hybrid_file/part10/canondata/result.json14
-rw-r--r--ydb/library/yql/tests/sql/hybrid_file/part2/canondata/result.json14
-rw-r--r--ydb/library/yql/tests/sql/hybrid_file/part4/canondata/result.json14
-rw-r--r--ydb/library/yql/tests/sql/hybrid_file/part5/canondata/result.json14
-rw-r--r--ydb/library/yql/tests/sql/hybrid_file/part6/canondata/result.json14
-rw-r--r--ydb/library/yql/tests/sql/hybrid_file/part9/canondata/result.json14
-rw-r--r--ydb/library/yql/tests/sql/sql2yql/canondata/result.json84
-rw-r--r--ydb/library/yql/tests/sql/suites/blocks/date_sub.cfg1
-rw-r--r--ydb/library/yql/tests/sql/suites/blocks/date_sub.sql96
-rw-r--r--ydb/library/yql/tests/sql/suites/blocks/date_sub_interval.cfg1
-rw-r--r--ydb/library/yql/tests/sql/suites/blocks/date_sub_interval.sql18
-rw-r--r--ydb/library/yql/tests/sql/suites/blocks/date_sub_interval_scalar.cfg1
-rw-r--r--ydb/library/yql/tests/sql/suites/blocks/date_sub_interval_scalar.sql46
-rw-r--r--ydb/library/yql/tests/sql/suites/blocks/date_sub_scalar.cfg1
-rw-r--r--ydb/library/yql/tests/sql/suites/blocks/date_sub_scalar.sql189
-rw-r--r--ydb/library/yql/tests/sql/suites/blocks/dates.txt1
-rw-r--r--ydb/library/yql/tests/sql/suites/blocks/dates.txt.attr15
-rw-r--r--ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval.cfg1
-rw-r--r--ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval.sql10
-rw-r--r--ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.cfg1
-rw-r--r--ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.sql17
-rw-r--r--ydb/library/yql/tests/sql/yt_native_file/part10/canondata/result.json28
-rw-r--r--ydb/library/yql/tests/sql/yt_native_file/part12/canondata/result.json28
-rw-r--r--ydb/library/yql/tests/sql/yt_native_file/part18/canondata/result.json28
-rw-r--r--ydb/library/yql/tests/sql/yt_native_file/part7/canondata/result.json56
-rw-r--r--ydb/library/yql/tests/sql/yt_native_file/part8/canondata/result.json28
35 files changed, 1273 insertions, 90 deletions
diff --git a/ydb/library/yql/minikql/computation/mkql_block_impl.cpp b/ydb/library/yql/minikql/computation/mkql_block_impl.cpp
index 2510a6ed9ba..4e87c0df34b 100644
--- a/ydb/library/yql/minikql/computation/mkql_block_impl.cpp
+++ b/ydb/library/yql/minikql/computation/mkql_block_impl.cpp
@@ -119,6 +119,30 @@ arrow::Datum DoConvertScalar(TType* type, const T& value, arrow::MemoryPool& poo
std::shared_ptr<arrow::Scalar> scalar = std::make_shared<arrow::BinaryScalar>(buffer, type);
return arrow::Datum(scalar);
}
+ case NUdf::EDataSlot::TzDate: {
+ auto items = arrow::StructScalar::ValueType{
+ std::make_shared<arrow::UInt16Scalar>(value.template Get<ui16>()),
+ std::make_shared<arrow::UInt16Scalar>(value.GetTimezoneId())
+ };
+
+ return arrow::Datum(std::make_shared<arrow::StructScalar>(items, MakeTzDateArrowType<NUdf::EDataSlot::TzDate>()));
+ }
+ case NUdf::EDataSlot::TzDatetime: {
+ auto items = arrow::StructScalar::ValueType{
+ std::make_shared<arrow::UInt32Scalar>(value.template Get<ui32>()),
+ std::make_shared<arrow::UInt16Scalar>(value.GetTimezoneId())
+ };
+
+ return arrow::Datum(std::make_shared<arrow::StructScalar>(items, MakeTzDateArrowType<NUdf::EDataSlot::TzDatetime>()));
+ }
+ case NUdf::EDataSlot::TzTimestamp: {
+ auto items = arrow::StructScalar::ValueType{
+ std::make_shared<arrow::UInt64Scalar>(value.template Get<ui64>()),
+ std::make_shared<arrow::UInt16Scalar>(value.GetTimezoneId())
+ };
+
+ return arrow::Datum(std::make_shared<arrow::StructScalar>(items, MakeTzDateArrowType<NUdf::EDataSlot::TzTimestamp>()));
+ }
default:
MKQL_ENSURE(false, "Unsupported data slot " << slot);
}
diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_impl.h.txt b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_impl.h.txt
index 2d69f3a9daa..a161cd20f7d 100644
--- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_impl.h.txt
+++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_impl.h.txt
@@ -3,6 +3,8 @@
#include "mkql_builtins_impl_common.h"
#include <mkql_builtins.h>
#include "mkql_builtins_codegen.h"
+#include <arrow/array/array_base.h>
+#include <arrow/array/util.h>
namespace NKikimr {
namespace NMiniKQL {
@@ -142,7 +144,7 @@ struct TSimpleArithmeticUnary : public TArithmeticConstraintsSame<TInput, TOutpu
#endif
};
-template <typename TLeft, typename TRight, typename TOutput, class TImpl>
+template <typename TLeft, typename TRight, typename TOutput, class TImpl, bool CustomCast = false>
struct TSimpleArithmeticBinary : public TArithmeticConstraintsBinary<TLeft, TRight, TOutput> {
static NUdf::TUnboxedValuePod Execute(const NUdf::TUnboxedValuePod& left, const NUdf::TUnboxedValuePod& right) {
return NUdf::TUnboxedValuePod(TImpl::Do(left.template Get<TLeft>(), right.template Get<TRight>()));
@@ -152,8 +154,12 @@ struct TSimpleArithmeticBinary : public TArithmeticConstraintsBinary<TLeft, TRig
static Value* Generate(Value* left, Value* right, const TCodegenContext& ctx, BasicBlock*& block)
{
auto& context = ctx.Codegen.GetContext();
- const auto lhs = StaticCast<TLeft, TOutput>(GetterFor<TLeft>(left, context, block), context, block);
- const auto rhs = StaticCast<TRight, TOutput>(GetterFor<TRight>(right, context, block), context, block);
+ auto lhs = GetterFor<TLeft>(left, context, block);
+ auto rhs = GetterFor<TRight>(right, context, block);
+ if constexpr (!CustomCast) {
+ lhs = StaticCast<TLeft, TOutput>(lhs, context, block);
+ rhs = StaticCast<TRight, TOutput>(rhs, context, block);
+ }
const auto res = TImpl::Gen(lhs, rhs, ctx, block);
const auto wide = SetterFor<TOutput>(res, context, block);
return wide;
@@ -831,15 +837,38 @@ void RegisterAggrMax(IBuiltinFunctionRegistry& registry);
void RegisterAggrMin(IBuiltinFunctionRegistry& registry);
void RegisterWith(IBuiltinFunctionRegistry& registry);
+enum class EPropagateTz {
+ None,
+ FromLeft,
+ FromRight
+};
+
+inline std::shared_ptr<arrow::DataType> AddTzType(bool addTz, const std::shared_ptr<arrow::DataType>& type) {
+ if (!addTz) {
+ return type;
+ }
+
+ std::vector<std::shared_ptr<arrow::Field>> fields {
+ std::make_shared<arrow::Field>("datetime", type, false),
+ std::make_shared<arrow::Field>("timezoneId", arrow::uint16(), false)
+ };
+
+ return std::make_shared<arrow::StructType>(fields);
+}
+
+inline std::shared_ptr<arrow::DataType> AddTzType(EPropagateTz propagateTz, const std::shared_ptr<arrow::DataType>& type) {
+ return AddTzType(propagateTz != EPropagateTz::None, type);
+}
+
template <typename T>
-arrow::compute::InputType GetPrimitiveInputArrowType() {
- return arrow::compute::InputType(GetPrimitiveDataType<T>(), arrow::ValueDescr::ANY);
+arrow::compute::InputType GetPrimitiveInputArrowType(bool tz = false) {
+ return arrow::compute::InputType(AddTzType(tz, GetPrimitiveDataType<T>()), arrow::ValueDescr::ANY);
}
template <typename T>
-arrow::compute::OutputType GetPrimitiveOutputArrowType() {
- return arrow::compute::OutputType(GetPrimitiveDataType<T>());
+arrow::compute::OutputType GetPrimitiveOutputArrowType(bool tz = false) {
+ return arrow::compute::OutputType(AddTzType(tz, GetPrimitiveDataType<T>()));
}
template<typename TDerived>
@@ -877,40 +906,162 @@ struct TBinaryKernelExecsBase {
}
};
-template<typename TInput1, typename TInput2, typename TOutput,
+inline std::shared_ptr<arrow::Scalar> ExtractTz(bool isTz, const std::shared_ptr<arrow::Scalar>& value) {
+ if (!isTz) {
+ return value;
+ }
+
+ const auto& structScalar = arrow::internal::checked_cast<const arrow::StructScalar&>(*value);
+ return structScalar.value[0];
+}
+
+inline std::shared_ptr<arrow::ArrayData> ExtractTz(bool isTz, const std::shared_ptr<arrow::ArrayData>& value) {
+ if (!isTz) {
+ return value;
+ }
+
+ return value->child_data[0];
+}
+
+inline std::shared_ptr<arrow::Scalar> WithTz(bool propagateTz, const std::shared_ptr<arrow::Scalar>& input,
+ const std::shared_ptr<arrow::Scalar>& value) {
+ if (!propagateTz) {
+ return value;
+ }
+
+ const auto& structScalar = arrow::internal::checked_cast<const arrow::StructScalar&>(*input);
+ auto tzId = structScalar.value[1];
+ return std::make_shared<arrow::StructScalar>(arrow::StructScalar::ValueType{value, tzId}, input->type);
+}
+
+inline std::shared_ptr<arrow::Scalar> WithTz(EPropagateTz propagateTz,
+ const std::shared_ptr<arrow::Scalar>& input1,
+ const std::shared_ptr<arrow::Scalar>& input2,
+ const std::shared_ptr<arrow::Scalar>& value) {
+ if (propagateTz == EPropagateTz::None) {
+ return value;
+ }
+
+ const auto& structScalar = arrow::internal::checked_cast<const arrow::StructScalar&>(propagateTz == EPropagateTz::FromLeft ? *input1 : *input2);
+ const auto tzId = structScalar.value[1];
+ return std::make_shared<arrow::StructScalar>(arrow::StructScalar::ValueType{value,tzId}, propagateTz == EPropagateTz::FromLeft ? input1->type : input2->type);
+}
+
+template <typename TOutput>
+inline std::shared_ptr<arrow::ArrayData> CopyTz(const std::shared_ptr<arrow::ArrayData>& res, bool propagateTz,
+ const std::shared_ptr<arrow::ArrayData>& input, arrow::MemoryPool* pool) {
+ if (!propagateTz) {
+ return res;
+ }
+
+ Y_ENSURE(res->child_data.empty());
+ std::shared_ptr<arrow::Buffer> buffer(NUdf::AllocateResizableBuffer(sizeof(TOutput) * res->length, pool));
+ res->child_data.push_back(arrow::ArrayData::Make(GetPrimitiveDataType<TOutput>(), res->length, { nullptr, buffer }));
+ res->child_data.push_back(input->child_data[1]);
+ return res->child_data[0];
+}
+
+template <typename TOutput>
+inline std::shared_ptr<arrow::ArrayData> CopyTz(const std::shared_ptr<arrow::ArrayData>& res, EPropagateTz propagateTz,
+ const std::shared_ptr<arrow::ArrayData>& input1,
+ const std::shared_ptr<arrow::Scalar>& input2,
+ arrow::MemoryPool* pool) {
+ if (propagateTz == EPropagateTz::None) {
+ return res;
+ }
+
+ Y_ENSURE(res->child_data.empty());
+ std::shared_ptr<arrow::Buffer> buffer(NUdf::AllocateResizableBuffer(sizeof(TOutput) * res->length, pool));
+ res->child_data.push_back(arrow::ArrayData::Make(GetPrimitiveDataType<TOutput>(), res->length, { nullptr, buffer }));
+ if (propagateTz == EPropagateTz::FromLeft) {
+ res->child_data.push_back(input1->child_data[1]);
+ } else {
+ const auto& structScalar = arrow::internal::checked_cast<const arrow::StructScalar&>(*input2);
+ auto tzId = ARROW_RESULT(arrow::MakeArrayFromScalar(*structScalar.value[1], res->length, pool))->data();
+ res->child_data.push_back(tzId);
+ }
+
+ return res->child_data[0];
+}
+
+template <typename TOutput>
+inline std::shared_ptr<arrow::ArrayData> CopyTz(const std::shared_ptr<arrow::ArrayData>& res, EPropagateTz propagateTz,
+ const std::shared_ptr<arrow::Scalar>& input1,
+ const std::shared_ptr<arrow::ArrayData>& input2,
+ arrow::MemoryPool* pool) {
+ if (propagateTz == EPropagateTz::None) {
+ return res;
+ }
+
+ Y_ENSURE(res->child_data.empty());
+ std::shared_ptr<arrow::Buffer> buffer(NUdf::AllocateResizableBuffer(sizeof(TOutput) * res->length, pool));
+ res->child_data.push_back(arrow::ArrayData::Make(GetPrimitiveDataType<TOutput>(), res->length, { nullptr, buffer }));
+ if (propagateTz == EPropagateTz::FromLeft) {
+ const auto& structScalar = arrow::internal::checked_cast<const arrow::StructScalar&>(*input1);
+ auto tzId = ARROW_RESULT(arrow::MakeArrayFromScalar(*structScalar.value[1], res->length, pool))->data();
+ res->child_data.push_back(tzId);
+ } else {
+ res->child_data.push_back(input2->child_data[1]);
+ }
+
+ return res->child_data[0];
+}
+
+template <typename TOutput>
+inline std::shared_ptr<arrow::ArrayData> CopyTz(const std::shared_ptr<arrow::ArrayData>& res, EPropagateTz propagateTz,
+ const std::shared_ptr<arrow::ArrayData>& input1,
+ const std::shared_ptr<arrow::ArrayData>& input2,
+ arrow::MemoryPool* pool) {
+ if (propagateTz == EPropagateTz::None) {
+ return res;
+ }
+
+ Y_ENSURE(res->child_data.empty());
+ std::shared_ptr<arrow::Buffer> buffer(NUdf::AllocateResizableBuffer(sizeof(TOutput) * res->length, pool));
+ res->child_data.push_back(arrow::ArrayData::Make(GetPrimitiveDataType<TOutput>(), res->length, { nullptr, buffer }));
+ if (propagateTz == EPropagateTz::FromLeft) {
+ res->child_data.push_back(input1->child_data[1]);
+ } else {
+ res->child_data.push_back(input2->child_data[1]);
+ }
+
+ return res->child_data[0];
+}
+
+template<typename TInput1, bool Tz1, typename TInput2, bool Tz2, typename TOutput, EPropagateTz PropagateTz,
typename TFuncInstance, TKernel::ENullMode NullMode>
struct TBinaryKernelExecs;
-template<typename TInput1, typename TInput2, typename TOutput,
+template<typename TInput1, bool Tz1, typename TInput2, bool Tz2, typename TOutput, EPropagateTz PropagateTz,
typename TFuncInstance>
-struct TBinaryKernelExecs<TInput1, TInput2, TOutput, TFuncInstance, TKernel::ENullMode::Default> : TBinaryKernelExecsBase<TBinaryKernelExecs<TInput1, TInput2, TOutput, TFuncInstance, TKernel::ENullMode::Default>>
+struct TBinaryKernelExecs<TInput1, Tz1, TInput2, Tz2, TOutput, PropagateTz, TFuncInstance, TKernel::ENullMode::Default> : TBinaryKernelExecsBase<TBinaryKernelExecs<TInput1, Tz1, TInput2, Tz2, TOutput, PropagateTz, TFuncInstance, TKernel::ENullMode::Default>>
{
static arrow::Status ExecScalarScalar(arrow::compute::KernelContext*, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
MKQL_ENSURE(batch.values.size() == 2, "Expected 2 args");
const auto& arg1 = batch.values[0];
const auto& arg2 = batch.values[1];
if (!arg1.scalar()->is_valid || !arg2.scalar()->is_valid) {
- *res = arrow::MakeNullScalar(GetPrimitiveDataType<TOutput>());
+ *res = arrow::MakeNullScalar(AddTzType(PropagateTz, GetPrimitiveDataType<TOutput>()));
} else {
- const auto val1 = GetPrimitiveScalarValue<TInput1>(*arg1.scalar());
- const auto val2 = GetPrimitiveScalarValue<TInput2>(*arg2.scalar());
- *res = MakeScalarDatum<TOutput>(TFuncInstance::Do(val1, val2));
+ const auto val1 = GetPrimitiveScalarValue<TInput1>(*ExtractTz(Tz1, arg1.scalar()));
+ const auto val2 = GetPrimitiveScalarValue<TInput2>(*ExtractTz(Tz2, arg2.scalar()));
+ *res = WithTz(PropagateTz, arg1.scalar(), arg2.scalar(), MakeScalarDatum<TOutput>(TFuncInstance::Do(val1, val2)).scalar());
}
return arrow::Status::OK();
}
- static arrow::Status ExecScalarArray(arrow::compute::KernelContext*, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
+ static arrow::Status ExecScalarArray(arrow::compute::KernelContext* kernelCtx, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
MKQL_ENSURE(batch.values.size() == 2, "Expected 2 args");
const auto& arg1 = batch.values[0];
const auto& arg2 = batch.values[1];
- auto& resArr = *res->array();
+ auto& resArr = *CopyTz<TOutput>(res->array(), PropagateTz, arg1.scalar(), arg2.array(), kernelCtx->memory_pool());
if (arg1.scalar()->is_valid) {
- const auto val1 = GetPrimitiveScalarValue<TInput1>(*arg1.scalar());
- const auto& arr2 = *arg2.array();
+ const auto val1 = GetPrimitiveScalarValue<TInput1>(*ExtractTz(Tz1, arg1.scalar()));
+ const auto& arr2 = *ExtractTz(Tz2, arg2.array());
auto length = arr2.length;
const auto values2 = arr2.GetValues<TInput2>(1);
- auto resValues = resArr.GetMutableValues<TOutput>(1);
+ auto resValues = resArr.template GetMutableValues<TOutput>(1);
for (int64_t i = 0; i < length; ++i) {
resValues[i] = TFuncInstance::Do(val1, values2[i]);
}
@@ -919,17 +1070,17 @@ struct TBinaryKernelExecs<TInput1, TInput2, TOutput, TFuncInstance, TKernel::ENu
return arrow::Status::OK();
}
- static arrow::Status ExecArrayScalar(arrow::compute::KernelContext*, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
+ static arrow::Status ExecArrayScalar(arrow::compute::KernelContext* kernelCtx, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
MKQL_ENSURE(batch.values.size() == 2, "Expected 2 args");
const auto& arg1 = batch.values[0];
const auto& arg2 = batch.values[1];
- auto& resArr = *res->array();
+ auto& resArr = *CopyTz<TOutput>(res->array(), PropagateTz, arg1.array(), arg2.scalar(), kernelCtx->memory_pool());
if (arg2.scalar()->is_valid) {
- const auto& arr1 = *arg1.array();
+ const auto& arr1 = *ExtractTz(Tz1, arg1.array());
auto length = arr1.length;
const auto values1 = arr1.GetValues<TInput1>(1);
- const auto val2 = GetPrimitiveScalarValue<TInput2>(*arg2.scalar());
- auto resValues = resArr.GetMutableValues<TOutput>(1);
+ const auto val2 = GetPrimitiveScalarValue<TInput2>(*ExtractTz(Tz2, arg2.scalar()));
+ auto resValues = resArr.template GetMutableValues<TOutput>(1);
for (int64_t i = 0; i < length; ++i) {
resValues[i] = TFuncInstance::Do(values1[i], val2);
}
@@ -938,18 +1089,18 @@ struct TBinaryKernelExecs<TInput1, TInput2, TOutput, TFuncInstance, TKernel::ENu
return arrow::Status::OK();
}
- static arrow::Status ExecArrayArray(arrow::compute::KernelContext*, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
+ static arrow::Status ExecArrayArray(arrow::compute::KernelContext* kernelCtx, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
MKQL_ENSURE(batch.values.size() == 2, "Expected 2 args");
const auto& arg1 = batch.values[0];
const auto& arg2 = batch.values[1];
- const auto& arr1 = *arg1.array();
- const auto& arr2 = *arg2.array();
- auto& resArr = *res->array();
+ const auto& arr1 = *ExtractTz(Tz1, arg1.array());
+ const auto& arr2 = *ExtractTz(Tz2, arg2.array());
+ auto& resArr = *CopyTz<TOutput>(res->array(), PropagateTz, arg1.array(), arg2.array(), kernelCtx->memory_pool());
MKQL_ENSURE(arr1.length == arr2.length, "Expected same length");
auto length = arr1.length;
const auto values1 = arr1.GetValues<TInput1>(1);
const auto values2 = arr2.GetValues<TInput2>(1);
- auto resValues = resArr.GetMutableValues<TOutput>(1);
+ auto resValues = resArr.template GetMutableValues<TOutput>(1);
for (int64_t i = 0; i < length; ++i) {
resValues[i] = TFuncInstance::Do(values1[i], values2[i]);
}
@@ -958,44 +1109,44 @@ struct TBinaryKernelExecs<TInput1, TInput2, TOutput, TFuncInstance, TKernel::ENu
}
};
-template<typename TInput1, typename TInput2, typename TOutput,
+template<typename TInput1, bool Tz1, typename TInput2, bool Tz2, typename TOutput, EPropagateTz PropagateTz,
typename TFuncInstance>
-struct TBinaryKernelExecs<TInput1, TInput2, TOutput, TFuncInstance, TKernel::ENullMode::AlwaysNull> : TBinaryKernelExecsBase<TBinaryKernelExecs<TInput1, TInput2, TOutput, TFuncInstance, TKernel::ENullMode::AlwaysNull>>
+struct TBinaryKernelExecs<TInput1, Tz1, TInput2, Tz2, TOutput, PropagateTz, TFuncInstance, TKernel::ENullMode::AlwaysNull> : TBinaryKernelExecsBase<TBinaryKernelExecs<TInput1, Tz1, TInput2, Tz2, TOutput, PropagateTz, TFuncInstance, TKernel::ENullMode::AlwaysNull>>
{
static arrow::Status ExecScalarScalar(arrow::compute::KernelContext*, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
MKQL_ENSURE(batch.values.size() == 2, "Expected 2 args");
const auto& arg1 = batch.values[0];
const auto& arg2 = batch.values[1];
if (!arg1.scalar()->is_valid || !arg2.scalar()->is_valid) {
- *res = arrow::MakeNullScalar(GetPrimitiveDataType<TOutput>());
+ *res = arrow::MakeNullScalar(AddTzType(PropagateTz, GetPrimitiveDataType<TOutput>()));
} else {
- const auto val1 = GetPrimitiveScalarValue<TInput1>(*arg1.scalar());
- const auto val2 = GetPrimitiveScalarValue<TInput2>(*arg2.scalar());
+ const auto val1 = GetPrimitiveScalarValue<TInput1>(*ExtractTz(Tz1, arg1.scalar()));
+ const auto val2 = GetPrimitiveScalarValue<TInput2>(*ExtractTz(Tz2, arg2.scalar()));
auto podRes = TFuncInstance::Execute(NUdf::TUnboxedValuePod(val1), NUdf::TUnboxedValuePod(val2));
if (!podRes) {
- *res = arrow::MakeNullScalar(GetPrimitiveDataType<TOutput>());
+ *res = arrow::MakeNullScalar(AddTzType(PropagateTz, GetPrimitiveDataType<TOutput>()));
} else {
- *res = MakeScalarDatum<TOutput>(podRes.template Get<TOutput>());
+ *res = WithTz(PropagateTz, arg1.scalar(), arg2.scalar(), MakeScalarDatum<TOutput>(podRes.template Get<TOutput>()).scalar());
}
}
return arrow::Status::OK();
}
- static arrow::Status ExecScalarArray(arrow::compute::KernelContext*, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
+ static arrow::Status ExecScalarArray(arrow::compute::KernelContext* kernelCtx, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
MKQL_ENSURE(batch.values.size() == 2, "Expected 2 args");
const auto& arg1 = batch.values[0];
const auto& arg2 = batch.values[1];
- const auto& arr2 = *arg2.array();
- auto& resArr = *res->array();
+ auto& resArr = *CopyTz<TOutput>(res->array(), PropagateTz, arg1.scalar(), arg2.array(), kernelCtx->memory_pool());
if (arg1.scalar()->is_valid) {
- const auto val1 = GetPrimitiveScalarValue<TInput1>(*arg1.scalar());
+ const auto val1 = GetPrimitiveScalarValue<TInput1>(*ExtractTz(Tz1, arg1.scalar()));
+ const auto& arr2 = *ExtractTz(Tz2, arg2.array());
auto length = arr2.length;
const auto values2 = arr2.GetValues<TInput2>(1);
const auto valid2 = arr2.GetValues<uint8_t>(0);
const auto nullCount2 = arr2.GetNullCount();
- auto resValues = resArr.GetMutableValues<TOutput>(1);
- auto resValid = resArr.GetMutableValues<uint8_t>(0);
+ auto resValues = resArr.template GetMutableValues<TOutput>(1);
+ auto resValid = res->array()->GetMutableValues<uint8_t>(0);
for (int64_t i = 0; i < length; ++i) {
if (nullCount2 == 0 || arrow::BitUtil::GetBit(valid2, i + arr2.offset)) {
@@ -1016,20 +1167,20 @@ struct TBinaryKernelExecs<TInput1, TInput2, TOutput, TFuncInstance, TKernel::ENu
return arrow::Status::OK();
}
- static arrow::Status ExecArrayScalar(arrow::compute::KernelContext*, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
+ static arrow::Status ExecArrayScalar(arrow::compute::KernelContext* kernelCtx, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
MKQL_ENSURE(batch.values.size() == 2, "Expected 2 args");
const auto& arg1 = batch.values[0];
const auto& arg2 = batch.values[1];
- const auto& arr1 = *arg1.array();
- auto& resArr = *res->array();
+ auto& resArr = *CopyTz<TOutput>(res->array(), PropagateTz, arg1.array(), arg2.scalar(), kernelCtx->memory_pool());
if (arg2.scalar()->is_valid) {
- const auto val2 = GetPrimitiveScalarValue<TInput2>(*arg2.scalar());
+ const auto val2 = GetPrimitiveScalarValue<TInput2>(*ExtractTz(Tz2, arg2.scalar()));
+ const auto& arr1 = *ExtractTz(Tz1, arg1.array());
auto length = arr1.length;
const auto values1 = arr1.GetValues<TInput1>(1);
const auto valid1 = arr1.GetValues<uint8_t>(0);
const auto nullCount1 = arr1.GetNullCount();
- auto resValues = resArr.GetMutableValues<TOutput>(1);
- auto resValid = resArr.GetMutableValues<uint8_t>(0);
+ auto resValues = resArr.template GetMutableValues<TOutput>(1);
+ auto resValid = res->array()->GetMutableValues<uint8_t>(0);
for (int64_t i = 0; i < length; ++i) {
if (nullCount1 == 0 || arrow::BitUtil::GetBit(valid1, i + arr1.offset)) {
@@ -1050,12 +1201,12 @@ struct TBinaryKernelExecs<TInput1, TInput2, TOutput, TFuncInstance, TKernel::ENu
return arrow::Status::OK();
}
- static arrow::Status ExecArrayArray(arrow::compute::KernelContext*, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
+ static arrow::Status ExecArrayArray(arrow::compute::KernelContext* kernelCtx, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
MKQL_ENSURE(batch.values.size() == 2, "Expected 2 args");
const auto& arg1 = batch.values[0];
const auto& arg2 = batch.values[1];
- const auto& arr1 = *arg1.array();
- const auto& arr2 = *arg2.array();
+ const auto& arr1 = *ExtractTz(Tz1, arg1.array());
+ const auto& arr2 = *ExtractTz(Tz2, arg2.array());
MKQL_ENSURE(arr1.length == arr2.length, "Expected same length");
auto length = arr1.length;
const auto values1 = arr1.GetValues<TInput1>(1);
@@ -1064,9 +1215,9 @@ struct TBinaryKernelExecs<TInput1, TInput2, TOutput, TFuncInstance, TKernel::ENu
const auto values2 = arr2.GetValues<TInput2>(1);
const auto valid2 = arr2.GetValues<uint8_t>(0);
const auto nullCount2 = arr2.GetNullCount();
- auto& resArr = *res->array();
- auto resValues = resArr.GetMutableValues<TOutput>(1);
- auto resValid = resArr.GetMutableValues<uint8_t>(0);
+ auto& resArr = *CopyTz<TOutput>(res->array(), PropagateTz, arg1.array(), arg2.array(), kernelCtx->memory_pool());
+ auto resValues = resArr.template GetMutableValues<TOutput>(1);
+ auto resValid = res->array()->GetMutableValues<uint8_t>(0);
for (int64_t i = 0; i < length; ++i) {
if ((nullCount1 == 0 || arrow::BitUtil::GetBit(valid1, i + arr1.offset)) &&
(nullCount2 == 0 || arrow::BitUtil::GetBit(valid2, i + arr2.offset))) {
@@ -1101,29 +1252,29 @@ private:
const arrow::compute::ScalarKernel ArrowKernel;
};
-template<typename TInput, typename TOutput, class TFuncInstance>
-struct TUnaryKernelExecs : TUnaryKernelExecsBase<TUnaryKernelExecs<TInput, TOutput, TFuncInstance>>
+template<typename TInput, bool Tz, typename TOutput, bool PropagateTz, class TFuncInstance>
+struct TUnaryKernelExecs : TUnaryKernelExecsBase<TUnaryKernelExecs<TInput, Tz, TOutput, PropagateTz, TFuncInstance>>
{
static arrow::Status ExecScalar(arrow::compute::KernelContext*, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
if (const auto& arg = batch.values.front(); !arg.scalar()->is_valid) {
- *res = arrow::MakeNullScalar(GetPrimitiveDataType<TOutput>());
+ *res = arrow::MakeNullScalar(AddTzType(PropagateTz, GetPrimitiveDataType<TOutput>()));
} else {
- const auto val = GetPrimitiveScalarValue<TInput>(*arg.scalar());
- *res = MakeScalarDatum<TOutput>(TFuncInstance::Do(val));
+ const auto val = GetPrimitiveScalarValue<TInput>(*ExtractTz(Tz, arg.scalar()));
+ *res = WithTz(PropagateTz, arg.scalar(), MakeScalarDatum<TOutput>(TFuncInstance::Do(val)).scalar());
}
return arrow::Status::OK();
}
- static arrow::Status ExecArray(arrow::compute::KernelContext*, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
+ static arrow::Status ExecArray(arrow::compute::KernelContext* kernelCtx, const arrow::compute::ExecBatch& batch, arrow::Datum* res) {
static_assert(!std::is_same<TOutput, bool>::value);
const auto& arg = batch.values.front();
- auto& resArr = *res->array();
+ auto& resArr = *CopyTz<TOutput>(res->array(), PropagateTz, arg.array(), kernelCtx->memory_pool());
- const auto& arr = *arg.array();
+ const auto& arr = *ExtractTz(Tz, arg.array());
auto length = arr.length;
const auto values = arr.GetValues<TInput>(1);
- auto resValues = resArr.GetMutableValues<TOutput>(1);
+ auto resValues = resArr.template GetMutableValues<TOutput>(1);
for (int64_t i = 0; i < length; ++i) {
resValues[i] = TFuncInstance::Do(values[i]);
}
@@ -1138,13 +1289,19 @@ void AddUnaryKernel(TKernelFamilyBase& owner) {
using TInputLayout = typename TInput::TLayout;
using TOutputLayout = typename TOutput::TLayout;
+ static constexpr bool tz = (TInput::Features & NUdf::TzDateType) != 0;
+ static constexpr bool propagateTz = (TOutput::Features & NUdf::TzDateType) != 0;
+
using TFuncInstance = TFunc<TInputLayout, TOutputLayout>;
- using TExecs = TUnaryKernelExecs<TInputLayout, TOutputLayout, TFuncInstance>;
+ using TExecs = TUnaryKernelExecs<TInputLayout, tz, TOutputLayout, propagateTz, TFuncInstance>;
std::vector<NUdf::TDataTypeId> argTypes({ TInput::Id });
NUdf::TDataTypeId returnType = TOutput::Id;
- arrow::compute::ScalarKernel k({ GetPrimitiveInputArrowType<TInputLayout>() }, GetPrimitiveOutputArrowType<TOutputLayout>(), &TExecs::Exec);
+ arrow::compute::ScalarKernel k({
+ GetPrimitiveInputArrowType<TInputLayout>(tz)
+ }, GetPrimitiveOutputArrowType<TOutputLayout>(propagateTz), &TExecs::Exec);
+
switch (TFuncInstance::NullMode) {
case TKernel::ENullMode::Default:
k.null_handling = arrow::compute::NullHandling::INTERSECTION;
@@ -1166,14 +1323,23 @@ void AddBinaryKernel(TKernelFamilyBase& owner) {
using TInput2Layout = typename TInput2::TLayout;
using TOutputLayout = typename TOutput::TLayout;
+ static constexpr bool tz1 = (TInput1::Features & NUdf::TzDateType) != 0;
+ static constexpr bool tz2 = (TInput2::Features & NUdf::TzDateType) != 0;
+ static constexpr EPropagateTz propagateTz = (TOutput::Features & NUdf::TzDateType) ?
+ ((TInput1::Features & NUdf::TzDateType) ? EPropagateTz::FromLeft : EPropagateTz::FromRight) :
+ EPropagateTz::None;
+
using TFuncInstance = TFunc<TInput1Layout, TInput2Layout, TOutputLayout>;
- using TExecs = TBinaryKernelExecs<TInput1Layout, TInput2Layout, TOutputLayout, TFuncInstance, TFuncInstance::NullMode>;
+ using TExecs = TBinaryKernelExecs<TInput1Layout, tz1, TInput2Layout, tz2, TOutputLayout, propagateTz, TFuncInstance, TFuncInstance::NullMode>;
std::vector<NUdf::TDataTypeId> argTypes({ TInput1::Id, TInput2::Id });
NUdf::TDataTypeId returnType = TOutput::Id;
- arrow::compute::ScalarKernel k({ GetPrimitiveInputArrowType<TInput1Layout>(), GetPrimitiveInputArrowType<TInput2Layout>() },
- GetPrimitiveOutputArrowType<TOutputLayout>(), &TExecs::Exec);
+ arrow::compute::ScalarKernel k({
+ GetPrimitiveInputArrowType<TInput1Layout>(tz1),
+ GetPrimitiveInputArrowType<TInput2Layout>(tz2)
+ }, GetPrimitiveOutputArrowType<TOutputLayout>(propagateTz != EPropagateTz::None), &TExecs::Exec);
+
switch (TFuncInstance::NullMode) {
case TKernel::ENullMode::Default:
k.null_handling = arrow::compute::NullHandling::INTERSECTION;
@@ -1195,14 +1361,23 @@ void AddBinaryKernelPoly(TKernelFamilyBase& owner) {
using TInput2Layout = typename TInput2::TLayout;
using TOutputLayout = typename TOutput::TLayout;
+ static constexpr bool tz1 = (TInput1::Features & NUdf::TzDateType) != 0;
+ static constexpr bool tz2 = (TInput2::Features & NUdf::TzDateType) != 0;
+ static constexpr EPropagateTz propagateTz = (TOutput::Features & NUdf::TzDateType) ?
+ ((TInput1::Features & NUdf::TzDateType) ? EPropagateTz::FromLeft : EPropagateTz::FromRight) :
+ EPropagateTz::None;
+
using TFuncInstance = TFunc<TInput1, TInput2, TOutput>;
- using TExecs = TBinaryKernelExecs<TInput1Layout, TInput2Layout, TOutputLayout, TFuncInstance, TFuncInstance::NullMode>;
+ using TExecs = TBinaryKernelExecs<TInput1Layout, tz1, TInput2Layout, tz2, TOutputLayout, propagateTz, TFuncInstance, TFuncInstance::NullMode>;
std::vector<NUdf::TDataTypeId> argTypes({ TInput1::Id, TInput2::Id });
NUdf::TDataTypeId returnType = TOutput::Id;
- arrow::compute::ScalarKernel k({ GetPrimitiveInputArrowType<TInput1Layout>(), GetPrimitiveInputArrowType<TInput2Layout>() },
- GetPrimitiveOutputArrowType<TOutputLayout>(), &TExecs::Exec);
+ arrow::compute::ScalarKernel k({
+ GetPrimitiveInputArrowType<TInput1Layout>(tz1),
+ GetPrimitiveInputArrowType<TInput2Layout>(tz2)
+ }, GetPrimitiveOutputArrowType<TOutputLayout>(propagateTz != EPropagateTz::None), &TExecs::Exec);
+
switch (TFuncInstance::NullMode) {
case TKernel::ENullMode::Default:
k.null_handling = arrow::compute::NullHandling::INTERSECTION;
diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_sub.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_sub.cpp
index 9f230aa2e3f..97e35217cbf 100644
--- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_sub.cpp
+++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_sub.cpp
@@ -95,25 +95,24 @@ struct TDecimalSub {
};
template<typename TLeft, typename TRight, typename TOutput>
-struct TDateTimeSub {
+struct TDateTimeSub : public TSimpleArithmeticBinary<typename TLeft::TLayout, typename TRight::TLayout, typename TOutput::TLayout, TDateTimeSub<TLeft, TRight, TOutput>, true>{
+ static constexpr auto NullMode = TKernel::ENullMode::Default;
+
static_assert(TOutput::Features & NYql::NUdf::TimeIntervalType, "Interval type expected");
- static NUdf::TUnboxedValuePod Execute(const NUdf::TUnboxedValuePod& left, const NUdf::TUnboxedValuePod& right)
+ static typename TOutput::TLayout Do(typename TLeft::TLayout left, typename TRight::TLayout right)
{
- const auto lv = left.template Get<typename TLeft::TLayout>();
- const auto rv = right.template Get<typename TRight::TLayout>();
- return NUdf::TUnboxedValuePod(ToScaledDate<TLeft>(lv) - ToScaledDate<TRight>(rv));
+ return ToScaledDate<TLeft>(left) - ToScaledDate<TRight>(right);
}
#ifndef MKQL_DISABLE_CODEGEN
- static Value* Generate(Value* left, Value* right, const TCodegenContext& ctx, BasicBlock*& block)
+ static Value* Gen(Value* left, Value* right, const TCodegenContext& ctx, BasicBlock*& block)
{
auto& context = ctx.Codegen.GetContext();
- const auto lhs = GenToScaledDate<TLeft>(GetterFor<typename TLeft::TLayout>(left, context, block), context, block);
- const auto rhs = GenToScaledDate<TRight>(GetterFor<typename TRight::TLayout>(right, context, block), context, block);
+ const auto lhs = GenToScaledDate<TLeft>(left, context, block);
+ const auto rhs = GenToScaledDate<TRight>(right, context, block);
const auto sub = BinaryOperator::CreateSub(lhs, rhs, "sub", block);
- const auto full = SetterFor<typename TOutput::TLayout>(sub, context, block);
- return full;
+ return sub;
}
#endif
};
@@ -124,6 +123,8 @@ struct TIntervalSubInterval {
static_assert(TRight::Features & NYql::NUdf::TimeIntervalType, "Right must be interval type");
static_assert(TOutput::Features & NYql::NUdf::TimeIntervalType, "Output must be interval type");
+ static constexpr auto NullMode = TKernel::ENullMode::AlwaysNull;
+
static NUdf::TUnboxedValuePod Execute(const NUdf::TUnboxedValuePod& left, const NUdf::TUnboxedValuePod& right)
{
const auto lv = left.template Get<typename TLeft::TLayout>();
@@ -150,9 +151,11 @@ struct TIntervalSubInterval {
template<typename TLeft, typename TRight, typename TOutput>
struct TBigIntervalSub {
- static_assert(std::is_same_v<TLeft, i64>, "Left must be i64");
- static_assert(std::is_same_v<TRight, i64>, "Right must be i64");
- static_assert(std::is_same_v<TOutput, i64>, "Output must be i64");
+ static_assert(std::is_same_v<typename TLeft::TLayout, i64>, "Left must be i64");
+ static_assert(std::is_same_v<typename TRight::TLayout, i64>, "Right must be i64");
+ static_assert(std::is_same_v<typename TOutput::TLayout, i64>, "Output must be i64");
+
+ static constexpr auto NullMode = TKernel::ENullMode::AlwaysNull;
static NUdf::TUnboxedValuePod Execute(const NUdf::TUnboxedValuePod& left, const NUdf::TUnboxedValuePod& right)
{
@@ -205,6 +208,8 @@ struct TAnyDateTimeSubIntervalT {
static_assert(TRight::Features & NYql::NUdf::TimeIntervalType, "right must be interval type");
static_assert(std::is_same<TLeft, TOutput>::value, "left and output must be same");
+ static constexpr auto NullMode = TKernel::ENullMode::AlwaysNull;
+
static NUdf::TUnboxedValuePod Execute(const NUdf::TUnboxedValuePod& left, const NUdf::TUnboxedValuePod& right)
{
const auto lv = ToScaledDate<TLeft>(left.template Get<typename TLeft::TLayout>());
@@ -307,6 +312,48 @@ void RegisterDateSub(IBuiltinFunctionRegistry& registry) {
TOutput, TDateTimeSub, TBinaryArgsOpt>(registry, "Sub");
}
+template <bool LeftTz, bool RightTz, bool LeftBig, bool RightBig>
+void RegisterDateSub(TKernelFamilyBase& owner) {
+ static_assert(!(LeftTz && LeftBig), "Expect either Tz or Big date type");
+ static_assert(!(RightTz && RightBig), "Expect either Tz or Big date type");
+
+ using TDateLeft1 = std::conditional_t<LeftBig,
+ NUdf::TDataType<NUdf::TDate32>,
+ std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TDate>>>;
+ using TDateLeft2 = std::conditional_t<LeftBig,
+ NUdf::TDataType<NUdf::TDatetime64>,
+ std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TDatetime>>>;
+ using TDateLeft3 = std::conditional_t<LeftBig,
+ NUdf::TDataType<NUdf::TTimestamp64>,
+ std::conditional_t<LeftTz, NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTimestamp>>>;
+
+ using TDateRight1 = std::conditional_t<RightBig,
+ NUdf::TDataType<NUdf::TDate32>,
+ std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TDate>>>;
+ using TDateRight2 = std::conditional_t<RightBig,
+ NUdf::TDataType<NUdf::TDatetime64>,
+ std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TDatetime>>>;
+ using TDateRight3 = std::conditional_t<RightBig,
+ NUdf::TDataType<NUdf::TTimestamp64>,
+ std::conditional_t<RightTz, NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTimestamp>>>;
+
+ using TOutput = std::conditional_t<LeftBig || RightBig,
+ NUdf::TDataType<NUdf::TInterval64>,
+ NUdf::TDataType<NUdf::TInterval>>;
+
+ AddBinaryKernelPoly<TDateLeft1, TDateRight1, TOutput, TDateTimeSub>(owner);
+ AddBinaryKernelPoly<TDateLeft1, TDateRight2, TOutput, TDateTimeSub>(owner);
+ AddBinaryKernelPoly<TDateLeft1, TDateRight3, TOutput, TDateTimeSub>(owner);
+
+ AddBinaryKernelPoly<TDateLeft2, TDateRight1, TOutput, TDateTimeSub>(owner);
+ AddBinaryKernelPoly<TDateLeft2, TDateRight2, TOutput, TDateTimeSub>(owner);
+ AddBinaryKernelPoly<TDateLeft2, TDateRight3, TOutput, TDateTimeSub>(owner);
+
+ AddBinaryKernelPoly<TDateLeft3, TDateRight1, TOutput, TDateTimeSub>(owner);
+ AddBinaryKernelPoly<TDateLeft3, TDateRight2, TOutput, TDateTimeSub>(owner);
+ AddBinaryKernelPoly<TDateLeft3, TDateRight3, TOutput, TDateTimeSub>(owner);
+}
+
void RegisterSub(IBuiltinFunctionRegistry& registry) {
RegisterBinaryNumericFunctionOpt<TSub, TBinaryArgsOpt>(registry, "Sub");
NDecimal::RegisterBinaryFunctionForAllPrecisions<TDecimalSub, TBinaryArgsOpt>(registry, "Sub_");
@@ -327,11 +374,11 @@ void RegisterSub(IBuiltinFunctionRegistry& registry) {
RegisterFunctionBinPolyOpt<NUdf::TDataType<NUdf::TInterval>, NUdf::TDataType<NUdf::TInterval>,
NUdf::TDataType<NUdf::TInterval>, TIntervalSubInterval, TBinaryArgsOptWithNullableResult>(registry, "Sub");
- RegisterFunctionBinOpt<NUdf::TDataType<NUdf::TInterval>, NUdf::TDataType<NUdf::TInterval64>,
+ RegisterFunctionBinPolyOpt<NUdf::TDataType<NUdf::TInterval>, NUdf::TDataType<NUdf::TInterval64>,
NUdf::TDataType<NUdf::TInterval64>, TBigIntervalSub, TBinaryArgsOptWithNullableResult>(registry, "Sub");
- RegisterFunctionBinOpt<NUdf::TDataType<NUdf::TInterval64>, NUdf::TDataType<NUdf::TInterval>,
+ RegisterFunctionBinPolyOpt<NUdf::TDataType<NUdf::TInterval64>, NUdf::TDataType<NUdf::TInterval>,
NUdf::TDataType<NUdf::TInterval64>, TBigIntervalSub, TBinaryArgsOptWithNullableResult>(registry, "Sub");
- RegisterFunctionBinOpt<NUdf::TDataType<NUdf::TInterval64>, NUdf::TDataType<NUdf::TInterval64>,
+ RegisterFunctionBinPolyOpt<NUdf::TDataType<NUdf::TInterval64>, NUdf::TDataType<NUdf::TInterval64>,
NUdf::TDataType<NUdf::TInterval64>, TBigIntervalSub, TBinaryArgsOptWithNullableResult>(registry, "Sub");
RegisterFunctionBinPolyOpt<NUdf::TDataType<NUdf::TDate>, NUdf::TDataType<NUdf::TInterval>,
@@ -377,8 +424,79 @@ void RegisterSub(IBuiltinFunctionRegistry& registry) {
NUdf::TDataType<NUdf::TTimestamp64>, TAnyDateTimeSubInterval, TBinaryArgsOptWithNullableResult>(registry, "Sub");
}
+template <bool Tz, bool BigDate, bool BigInterval>
+void RegisterDateSubInterval(TKernelFamilyBase& owner) {
+ static_assert(!(Tz && BigDate), "Expect either Tz or Big date type");
+
+ using TDateLeft1 = std::conditional_t<BigDate,
+ NUdf::TDataType<NUdf::TDate32>,
+ std::conditional_t<Tz, NUdf::TDataType<NUdf::TTzDate>, NUdf::TDataType<NUdf::TDate>>>;
+ using TDateLeft2 = std::conditional_t<BigDate,
+ NUdf::TDataType<NUdf::TDatetime64>,
+ std::conditional_t<Tz, NUdf::TDataType<NUdf::TTzDatetime>, NUdf::TDataType<NUdf::TDatetime>>>;
+ using TDateLeft3 = std::conditional_t<BigDate,
+ NUdf::TDataType<NUdf::TTimestamp64>,
+ std::conditional_t<Tz, NUdf::TDataType<NUdf::TTzTimestamp>, NUdf::TDataType<NUdf::TTimestamp>>>;
+
+ using TIntervalRight = std::conditional_t<BigInterval,
+ NUdf::TDataType<NUdf::TInterval64>, NUdf::TDataType<NUdf::TInterval>>;
+
+ AddBinaryKernelPoly<TDateLeft1, TIntervalRight, TDateLeft1, TAnyDateTimeSubInterval>(owner);
+ AddBinaryKernelPoly<TDateLeft2, TIntervalRight, TDateLeft2, TAnyDateTimeSubInterval>(owner);
+ AddBinaryKernelPoly<TDateLeft3, TIntervalRight, TDateLeft3, TAnyDateTimeSubInterval>(owner);
+}
+
+template <bool BigInterval1, bool BigInterval2>
+void RegisterIntervalSubInterval(TKernelFamilyBase& owner) {
+ using TLeft = std::conditional_t<BigInterval1,
+ NUdf::TDataType<NUdf::TInterval64>, NUdf::TDataType<NUdf::TInterval>>;
+ using TRight = std::conditional_t<BigInterval2,
+ NUdf::TDataType<NUdf::TInterval64>, NUdf::TDataType<NUdf::TInterval>>;
+
+ using TOutput = std::conditional_t<BigInterval1 || BigInterval2,
+ NUdf::TDataType<NUdf::TInterval64>, NUdf::TDataType<NUdf::TInterval>>;
+
+ if constexpr (BigInterval1 || BigInterval2) {
+ AddBinaryKernelPoly<TLeft, TRight, TOutput, TBigIntervalSub>(owner);
+ } else {
+ AddBinaryKernelPoly<TLeft, TRight, TOutput, TIntervalSubInterval>(owner);
+ }
+}
+
void RegisterSub(TKernelFamilyMap& kernelFamilyMap) {
- kernelFamilyMap["Sub"] = std::make_unique<TBinaryNumericKernelFamily<TSub, TSub>>();
+ auto family = std::make_unique<TKernelFamilyBase>();
+
+ AddBinaryIntegralKernels<TSub>(*family);
+ AddBinaryRealKernels<TSub>(*family);
+
+ RegisterDateSub<false, false, false, false>(*family);
+ RegisterDateSub<false, true, false, false>(*family);
+ RegisterDateSub<true, false, false, false>(*family);
+ RegisterDateSub<true, true, false, false>(*family);
+
+ // NarrowDate minus BigDate
+ RegisterDateSub<false, false, false, true>(*family);
+ RegisterDateSub<true, false, false, true>(*family);
+ // BigDate minus NarrowDate
+ RegisterDateSub<false, false, true, false>(*family);
+ RegisterDateSub<false, true, true, false>(*family);
+ // BigDate minus BigDate
+ RegisterDateSub<false, false, true, true>(*family);
+
+ RegisterDateSubInterval<false, false, false>(*family);
+ RegisterDateSubInterval<true, false, false>(*family);
+ RegisterDateSubInterval<false, true, false>(*family);
+
+ RegisterDateSubInterval<false, false, true>(*family);
+ RegisterDateSubInterval<true, false, true>(*family);
+ RegisterDateSubInterval<false, true, true>(*family);
+
+ RegisterIntervalSubInterval<false, false>(*family);
+ RegisterIntervalSubInterval<false, true>(*family);
+ RegisterIntervalSubInterval<true, false>(*family);
+ RegisterIntervalSubInterval<true, true>(*family);
+
+ kernelFamilyMap["Sub"] = std::move(family);
}
} // namespace NMiniKQL
diff --git a/ydb/library/yql/minikql/mkql_type_builder.h b/ydb/library/yql/minikql/mkql_type_builder.h
index 7199bc83605..56e65b5c6f9 100644
--- a/ydb/library/yql/minikql/mkql_type_builder.h
+++ b/ydb/library/yql/minikql/mkql_type_builder.h
@@ -52,8 +52,8 @@ std::shared_ptr<arrow::DataType> MakeTzLayoutArrowType() {
template<NUdf::EDataSlot slot>
std::shared_ptr<arrow::StructType> MakeTzDateArrowType() {
std::vector<std::shared_ptr<arrow::Field>> fields {
- std::make_shared<arrow::Field>("datetime", MakeTzLayoutArrowType<slot>()),
- std::make_shared<arrow::Field>("timezoneId", arrow::uint16()),
+ std::make_shared<arrow::Field>("datetime", MakeTzLayoutArrowType<slot>(), false),
+ std::make_shared<arrow::Field>("timezoneId", arrow::uint16(), false),
};
return std::make_shared<arrow::StructType>(fields);
}
diff --git a/ydb/library/yql/tests/sql/dq_file/part10/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part10/canondata/result.json
index 142ecbe7ad5..4368aa01577 100644
--- a/ydb/library/yql/tests/sql/dq_file/part10/canondata/result.json
+++ b/ydb/library/yql/tests/sql/dq_file/part10/canondata/result.json
@@ -499,6 +499,28 @@
}
],
"test.test[blocks-complex_scalars--Results]": [],
+ "test.test[blocks-interval_sub_interval--Analyze]": [
+ {
+ "checksum": "561c97fa318a3c8866cf7449d7a3af37",
+ "size": 5048,
+ "uri": "https://{canondata_backend}/1937367/4bf2fc8ed770be8771897ca6e18da1695949f3e3/resource.tar.gz#test.test_blocks-interval_sub_interval--Analyze_/plan.txt"
+ }
+ ],
+ "test.test[blocks-interval_sub_interval--Debug]": [
+ {
+ "checksum": "fb66d5a829584064ff0b2c116e2ce2de",
+ "size": 2309,
+ "uri": "https://{canondata_backend}/1937367/4bf2fc8ed770be8771897ca6e18da1695949f3e3/resource.tar.gz#test.test_blocks-interval_sub_interval--Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[blocks-interval_sub_interval--Plan]": [
+ {
+ "checksum": "561c97fa318a3c8866cf7449d7a3af37",
+ "size": 5048,
+ "uri": "https://{canondata_backend}/1937367/4bf2fc8ed770be8771897ca6e18da1695949f3e3/resource.tar.gz#test.test_blocks-interval_sub_interval--Plan_/plan.txt"
+ }
+ ],
+ "test.test[blocks-interval_sub_interval--Results]": [],
"test.test[coalesce-coalesce_sugar-default.txt-Analyze]": [
{
"checksum": "f195daa0332f326a49d3606aa59caf5b",
diff --git a/ydb/library/yql/tests/sql/dq_file/part12/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part12/canondata/result.json
index fda14c012e2..49c463f025c 100644
--- a/ydb/library/yql/tests/sql/dq_file/part12/canondata/result.json
+++ b/ydb/library/yql/tests/sql/dq_file/part12/canondata/result.json
@@ -483,6 +483,28 @@
}
],
"test.test[blocks-combine_hashed_sum--Results]": [],
+ "test.test[blocks-interval_sub_interval_scalar--Analyze]": [
+ {
+ "checksum": "217a473970dbc10a0b4c75ae9132ff85",
+ "size": 4736,
+ "uri": "https://{canondata_backend}/1871102/11e6945e4e6c6cb4988d850a85e2c863aa1a9f2e/resource.tar.gz#test.test_blocks-interval_sub_interval_scalar--Analyze_/plan.txt"
+ }
+ ],
+ "test.test[blocks-interval_sub_interval_scalar--Debug]": [
+ {
+ "checksum": "8ca9bd1ecd8fbaa72257180c1dc0212e",
+ "size": 2456,
+ "uri": "https://{canondata_backend}/1925821/b1639f1531bdf8483237800df0046cfb209f827b/resource.tar.gz#test.test_blocks-interval_sub_interval_scalar--Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[blocks-interval_sub_interval_scalar--Plan]": [
+ {
+ "checksum": "217a473970dbc10a0b4c75ae9132ff85",
+ "size": 4736,
+ "uri": "https://{canondata_backend}/1871102/11e6945e4e6c6cb4988d850a85e2c863aa1a9f2e/resource.tar.gz#test.test_blocks-interval_sub_interval_scalar--Plan_/plan.txt"
+ }
+ ],
+ "test.test[blocks-interval_sub_interval_scalar--Results]": [],
"test.test[blocks-lazy_nonstrict_with_scalar_ctx--Analyze]": [
{
"checksum": "1ac2168b6dc19a2b64a8ef3cd8f1dc9b",
diff --git a/ydb/library/yql/tests/sql/dq_file/part18/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part18/canondata/result.json
index 9e87e151044..03d43dcc0b3 100644
--- a/ydb/library/yql/tests/sql/dq_file/part18/canondata/result.json
+++ b/ydb/library/yql/tests/sql/dq_file/part18/canondata/result.json
@@ -454,6 +454,28 @@
}
],
"test.test[blocks-combine_all_min_filter--Results]": [],
+ "test.test[blocks-date_sub_scalar--Analyze]": [
+ {
+ "checksum": "bd6b4aa9afd3b38e89780c640809b2fa",
+ "size": 4921,
+ "uri": "https://{canondata_backend}/1903885/7fee0de6d842367583eafc84bd37adc06c405ab2/resource.tar.gz#test.test_blocks-date_sub_scalar--Analyze_/plan.txt"
+ }
+ ],
+ "test.test[blocks-date_sub_scalar--Debug]": [
+ {
+ "checksum": "c774d90cfb8f0725fa8d44b1a3ec11ba",
+ "size": 8473,
+ "uri": "https://{canondata_backend}/1903885/7fee0de6d842367583eafc84bd37adc06c405ab2/resource.tar.gz#test.test_blocks-date_sub_scalar--Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[blocks-date_sub_scalar--Plan]": [
+ {
+ "checksum": "bd6b4aa9afd3b38e89780c640809b2fa",
+ "size": 4921,
+ "uri": "https://{canondata_backend}/1903885/7fee0de6d842367583eafc84bd37adc06c405ab2/resource.tar.gz#test.test_blocks-date_sub_scalar--Plan_/plan.txt"
+ }
+ ],
+ "test.test[blocks-date_sub_scalar--Results]": [],
"test.test[blocks-filter_partial_expr--Analyze]": [
{
"checksum": "7ea7129bb729c5e5ecfb73b0b1e700e7",
diff --git a/ydb/library/yql/tests/sql/dq_file/part7/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part7/canondata/result.json
index e87a30d4387..3fbd5a77f25 100644
--- a/ydb/library/yql/tests/sql/dq_file/part7/canondata/result.json
+++ b/ydb/library/yql/tests/sql/dq_file/part7/canondata/result.json
@@ -490,6 +490,50 @@
}
],
"test.test[blocks-combine_hashed_minmax_nested--Results]": [],
+ "test.test[blocks-date_sub_interval--Analyze]": [
+ {
+ "checksum": "11c133b61ea9a2a4a8789bb92fb0f8b1",
+ "size": 5207,
+ "uri": "https://{canondata_backend}/1871102/4e21780039cfd055a35d3741651fac7b5d2c3ebc/resource.tar.gz#test.test_blocks-date_sub_interval--Analyze_/plan.txt"
+ }
+ ],
+ "test.test[blocks-date_sub_interval--Debug]": [
+ {
+ "checksum": "359d9d8ce2325c445d431d29f70952da",
+ "size": 3069,
+ "uri": "https://{canondata_backend}/1871102/4e21780039cfd055a35d3741651fac7b5d2c3ebc/resource.tar.gz#test.test_blocks-date_sub_interval--Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[blocks-date_sub_interval--Plan]": [
+ {
+ "checksum": "11c133b61ea9a2a4a8789bb92fb0f8b1",
+ "size": 5207,
+ "uri": "https://{canondata_backend}/1871102/4e21780039cfd055a35d3741651fac7b5d2c3ebc/resource.tar.gz#test.test_blocks-date_sub_interval--Plan_/plan.txt"
+ }
+ ],
+ "test.test[blocks-date_sub_interval--Results]": [],
+ "test.test[blocks-date_sub_interval_scalar--Analyze]": [
+ {
+ "checksum": "3907ee7540799aa802dd3a6c2503639b",
+ "size": 4973,
+ "uri": "https://{canondata_backend}/1871102/4e21780039cfd055a35d3741651fac7b5d2c3ebc/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Analyze_/plan.txt"
+ }
+ ],
+ "test.test[blocks-date_sub_interval_scalar--Debug]": [
+ {
+ "checksum": "b934590ea9323970c041923afd06f7cd",
+ "size": 4391,
+ "uri": "https://{canondata_backend}/1871102/4e21780039cfd055a35d3741651fac7b5d2c3ebc/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[blocks-date_sub_interval_scalar--Plan]": [
+ {
+ "checksum": "3907ee7540799aa802dd3a6c2503639b",
+ "size": 4973,
+ "uri": "https://{canondata_backend}/1871102/4e21780039cfd055a35d3741651fac7b5d2c3ebc/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Plan_/plan.txt"
+ }
+ ],
+ "test.test[blocks-date_sub_interval_scalar--Results]": [],
"test.test[column_order-insert--Analyze]": [
{
"checksum": "66c7e677ca50f835e2a8ac1095e79c99",
diff --git a/ydb/library/yql/tests/sql/dq_file/part8/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part8/canondata/result.json
index e52479b8451..e7e7e2d0bd7 100644
--- a/ydb/library/yql/tests/sql/dq_file/part8/canondata/result.json
+++ b/ydb/library/yql/tests/sql/dq_file/part8/canondata/result.json
@@ -749,6 +749,28 @@
}
],
"test.test[blocks-combine_hashed_some--Results]": [],
+ "test.test[blocks-date_sub--Analyze]": [
+ {
+ "checksum": "4555f223051c08302c2fe00d17152b19",
+ "size": 5233,
+ "uri": "https://{canondata_backend}/1784117/16524d92b9f240114ba8cd4e834331e49f57a47a/resource.tar.gz#test.test_blocks-date_sub--Analyze_/plan.txt"
+ }
+ ],
+ "test.test[blocks-date_sub--Debug]": [
+ {
+ "checksum": "b11db170c8731c06819269e39c65f626",
+ "size": 5979,
+ "uri": "https://{canondata_backend}/1784117/16524d92b9f240114ba8cd4e834331e49f57a47a/resource.tar.gz#test.test_blocks-date_sub--Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[blocks-date_sub--Plan]": [
+ {
+ "checksum": "4555f223051c08302c2fe00d17152b19",
+ "size": 5233,
+ "uri": "https://{canondata_backend}/1784117/16524d92b9f240114ba8cd4e834331e49f57a47a/resource.tar.gz#test.test_blocks-date_sub--Plan_/plan.txt"
+ }
+ ],
+ "test.test[blocks-date_sub--Results]": [],
"test.test[blocks-filter_expr--Analyze]": [
{
"checksum": "7ea7129bb729c5e5ecfb73b0b1e700e7",
diff --git a/ydb/library/yql/tests/sql/hybrid_file/part10/canondata/result.json b/ydb/library/yql/tests/sql/hybrid_file/part10/canondata/result.json
index f59e455782f..91bea10a315 100644
--- a/ydb/library/yql/tests/sql/hybrid_file/part10/canondata/result.json
+++ b/ydb/library/yql/tests/sql/hybrid_file/part10/canondata/result.json
@@ -657,6 +657,20 @@
"uri": "https://{canondata_backend}/1923547/14c0d60ad63ffaedb974b51b52039901f095b5c5/resource.tar.gz#test.test_blocks-combine_hashed_sum_many_keys--Plan_/plan.txt"
}
],
+ "test.test[blocks-date_sub_scalar--Debug]": [
+ {
+ "checksum": "1308baa313fd88a7284d827bc91bccfb",
+ "size": 12831,
+ "uri": "https://{canondata_backend}/1871102/7114dd07ec200bfe07bfea5951c87fab883e7bf3/resource.tar.gz#test.test_blocks-date_sub_scalar--Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[blocks-date_sub_scalar--Plan]": [
+ {
+ "checksum": "0957630bd26e7e3d2f4b8724493c325a",
+ "size": 6542,
+ "uri": "https://{canondata_backend}/1871102/7114dd07ec200bfe07bfea5951c87fab883e7bf3/resource.tar.gz#test.test_blocks-date_sub_scalar--Plan_/plan.txt"
+ }
+ ],
"test.test[blocks-finalize_hashed_keys--Debug]": [
{
"checksum": "c0d8a7799a8883a8fdfa0a2a64a4ccb8",
diff --git a/ydb/library/yql/tests/sql/hybrid_file/part2/canondata/result.json b/ydb/library/yql/tests/sql/hybrid_file/part2/canondata/result.json
index 93f109afa37..7369fa219ca 100644
--- a/ydb/library/yql/tests/sql/hybrid_file/part2/canondata/result.json
+++ b/ydb/library/yql/tests/sql/hybrid_file/part2/canondata/result.json
@@ -545,6 +545,20 @@
"uri": "https://{canondata_backend}/1936842/5461a7f0f4d722c81cba2eff5dd1d41bf3a77f80/resource.tar.gz#test.test_blocks-combine_hashed_some--Plan_/plan.txt"
}
],
+ "test.test[blocks-interval_sub_interval--Debug]": [
+ {
+ "checksum": "7194dbe66d3787b0dd96e1ce22f20dd4",
+ "size": 4123,
+ "uri": "https://{canondata_backend}/1937367/84628edfd25ac57fbbb45c68496d926716c730fa/resource.tar.gz#test.test_blocks-interval_sub_interval--Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[blocks-interval_sub_interval--Plan]": [
+ {
+ "checksum": "61057db0b69190f7328165c6af945755",
+ "size": 4932,
+ "uri": "https://{canondata_backend}/1937367/84628edfd25ac57fbbb45c68496d926716c730fa/resource.tar.gz#test.test_blocks-interval_sub_interval--Plan_/plan.txt"
+ }
+ ],
"test.test[blocks-pg_to_dates--Debug]": [
{
"checksum": "a372b66e19e41c1f7fcfe4dc45ab5fbf",
diff --git a/ydb/library/yql/tests/sql/hybrid_file/part4/canondata/result.json b/ydb/library/yql/tests/sql/hybrid_file/part4/canondata/result.json
index 26115d943d8..fdeb58be348 100644
--- a/ydb/library/yql/tests/sql/hybrid_file/part4/canondata/result.json
+++ b/ydb/library/yql/tests/sql/hybrid_file/part4/canondata/result.json
@@ -447,6 +447,20 @@
"uri": "https://{canondata_backend}/1931696/8382830b676a61af36d1344910d51cd1bf39f3ef/resource.tar.gz#test.test_blocks-combine_hashed_count--Plan_/plan.txt"
}
],
+ "test.test[blocks-date_sub_interval_scalar--Debug]": [
+ {
+ "checksum": "ffa4627b3c360fc1fc30d4b8d1298275",
+ "size": 5805,
+ "uri": "https://{canondata_backend}/1871102/80fb1cbac53cba16157825a5ffc08dde188b4de3/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[blocks-date_sub_interval_scalar--Plan]": [
+ {
+ "checksum": "9e1974869bffd277ef018d9b5e6f833f",
+ "size": 6872,
+ "uri": "https://{canondata_backend}/1871102/80fb1cbac53cba16157825a5ffc08dde188b4de3/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Plan_/plan.txt"
+ }
+ ],
"test.test[blocks-distinct_pure_all--Debug]": [
{
"checksum": "87eac3d4671cd41968be856df7ccdb4e",
diff --git a/ydb/library/yql/tests/sql/hybrid_file/part5/canondata/result.json b/ydb/library/yql/tests/sql/hybrid_file/part5/canondata/result.json
index ad63db5ae0f..1ca4f1428f6 100644
--- a/ydb/library/yql/tests/sql/hybrid_file/part5/canondata/result.json
+++ b/ydb/library/yql/tests/sql/hybrid_file/part5/canondata/result.json
@@ -629,6 +629,20 @@
"uri": "https://{canondata_backend}/1931696/cc756dc950b218e9f3589a791267d21773207f44/resource.tar.gz#test.test_blocks-complex_scalars--Plan_/plan.txt"
}
],
+ "test.test[blocks-date_sub--Debug]": [
+ {
+ "checksum": "2be79bff1f96355281e04eb63395110a",
+ "size": 12635,
+ "uri": "https://{canondata_backend}/1937424/08e3a86d5655c0e758eb31431ffcbf96b753a17d/resource.tar.gz#test.test_blocks-date_sub--Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[blocks-date_sub--Plan]": [
+ {
+ "checksum": "80bebb87a06836a98dbb872736e8633d",
+ "size": 7392,
+ "uri": "https://{canondata_backend}/1899731/f313c6d2d443c9b12f3c2631c4523bf4bbbad997/resource.tar.gz#test.test_blocks-date_sub--Plan_/plan.txt"
+ }
+ ],
"test.test[blocks-div_uint64--Debug]": [
{
"checksum": "c2dff769d3d88a41775ed2a7537ca36e",
diff --git a/ydb/library/yql/tests/sql/hybrid_file/part6/canondata/result.json b/ydb/library/yql/tests/sql/hybrid_file/part6/canondata/result.json
index 75aaf2c4630..35ba911ef24 100644
--- a/ydb/library/yql/tests/sql/hybrid_file/part6/canondata/result.json
+++ b/ydb/library/yql/tests/sql/hybrid_file/part6/canondata/result.json
@@ -615,6 +615,20 @@
"uri": "https://{canondata_backend}/1031349/201452dd8c883b2adcbf46cb075c912d25efe67e/resource.tar.gz#test.test_blocks-compare--Plan_/plan.txt"
}
],
+ "test.test[blocks-interval_sub_interval_scalar--Debug]": [
+ {
+ "checksum": "6f16681d9d0795d3731eb168f0a3fc6d",
+ "size": 2880,
+ "uri": "https://{canondata_backend}/1597364/73506093c4f6b048d0ff3078193bbdd00b0a7f92/resource.tar.gz#test.test_blocks-interval_sub_interval_scalar--Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[blocks-interval_sub_interval_scalar--Plan]": [
+ {
+ "checksum": "1a26b81622c35035ff41e4e8d5210422",
+ "size": 4323,
+ "uri": "https://{canondata_backend}/1871102/88d719de4a519472511eb7909f9cefad532ae240/resource.tar.gz#test.test_blocks-interval_sub_interval_scalar--Plan_/plan.txt"
+ }
+ ],
"test.test[blocks-mod_uint64--Debug]": [
{
"checksum": "51fdb2115a77e12579f52bae2c411078",
diff --git a/ydb/library/yql/tests/sql/hybrid_file/part9/canondata/result.json b/ydb/library/yql/tests/sql/hybrid_file/part9/canondata/result.json
index 607fd0e3a9d..cbceb083d1f 100644
--- a/ydb/library/yql/tests/sql/hybrid_file/part9/canondata/result.json
+++ b/ydb/library/yql/tests/sql/hybrid_file/part9/canondata/result.json
@@ -699,6 +699,20 @@
"uri": "https://{canondata_backend}/1900335/8eba31ae2dcfd9245ad9327a1ac3ca89667336e2/resource.tar.gz#test.test_blocks-combine_all_some_filter--Plan_/plan.txt"
}
],
+ "test.test[blocks-date_sub_interval--Debug]": [
+ {
+ "checksum": "21b59f22223dac2751761b915188392c",
+ "size": 5896,
+ "uri": "https://{canondata_backend}/1900335/5d529321b2bf20bf136b195a3d3ce1780735805e/resource.tar.gz#test.test_blocks-date_sub_interval--Debug_/opt.yql_patched"
+ }
+ ],
+ "test.test[blocks-date_sub_interval--Plan]": [
+ {
+ "checksum": "9c1a91deae35cbcb0059782d185821de",
+ "size": 7241,
+ "uri": "https://{canondata_backend}/1900335/5d529321b2bf20bf136b195a3d3ce1780735805e/resource.tar.gz#test.test_blocks-date_sub_interval--Plan_/plan.txt"
+ }
+ ],
"test.test[blocks-minmax_strings_filter--Debug]": [
{
"checksum": "2e0121e1c7e3f2c621101f6ba0d5c4b7",
diff --git a/ydb/library/yql/tests/sql/sql2yql/canondata/result.json b/ydb/library/yql/tests/sql/sql2yql/canondata/result.json
index d742f1b6799..fa1020cfcc1 100644
--- a/ydb/library/yql/tests/sql/sql2yql/canondata/result.json
+++ b/ydb/library/yql/tests/sql/sql2yql/canondata/result.json
@@ -3548,6 +3548,34 @@
"uri": "https://{canondata_backend}/1937150/45555237489e71bb2d9899d4db0123024cd3eb00/resource.tar.gz#test_sql2yql.test_blocks-complex_scalars_/sql.yql"
}
],
+ "test_sql2yql.test[blocks-date_sub]": [
+ {
+ "checksum": "bf53180d62f6ebbe87e4ae9adbe88ba9",
+ "size": 18267,
+ "uri": "https://{canondata_backend}/212715/79e7a17b8755b0c468dda328d90c9b4cbd158569/resource.tar.gz#test_sql2yql.test_blocks-date_sub_/sql.yql"
+ }
+ ],
+ "test_sql2yql.test[blocks-date_sub_interval]": [
+ {
+ "checksum": "c2be800180b3e2582812f1cdbdedb9f6",
+ "size": 3798,
+ "uri": "https://{canondata_backend}/1937367/1fda6d8133fcc3c4cc9f49cbc1788a47ea2ac87d/resource.tar.gz#test_sql2yql.test_blocks-date_sub_interval_/sql.yql"
+ }
+ ],
+ "test_sql2yql.test[blocks-date_sub_interval_scalar]": [
+ {
+ "checksum": "68662ae28d0bd67df5f4a8f75e87fc5e",
+ "size": 9061,
+ "uri": "https://{canondata_backend}/1937367/1fda6d8133fcc3c4cc9f49cbc1788a47ea2ac87d/resource.tar.gz#test_sql2yql.test_blocks-date_sub_interval_scalar_/sql.yql"
+ }
+ ],
+ "test_sql2yql.test[blocks-date_sub_scalar]": [
+ {
+ "checksum": "e22b37ec52e8bb991f21f851c05c6416",
+ "size": 34899,
+ "uri": "https://{canondata_backend}/1937367/1fda6d8133fcc3c4cc9f49cbc1788a47ea2ac87d/resource.tar.gz#test_sql2yql.test_blocks-date_sub_scalar_/sql.yql"
+ }
+ ],
"test_sql2yql.test[blocks-distinct_mixed_all]": [
{
"checksum": "85a7b39bb723343212403b43f168b9dc",
@@ -3660,6 +3688,20 @@
"uri": "https://{canondata_backend}/1917492/bf361ba6aca9974e26535026fb228b74d0ff24ef/resource.tar.gz#test_sql2yql.test_blocks-if_/sql.yql"
}
],
+ "test_sql2yql.test[blocks-interval_sub_interval]": [
+ {
+ "checksum": "dc719fa0feecc46732a00f0e868addb4",
+ "size": 2120,
+ "uri": "https://{canondata_backend}/1937367/1fda6d8133fcc3c4cc9f49cbc1788a47ea2ac87d/resource.tar.gz#test_sql2yql.test_blocks-interval_sub_interval_/sql.yql"
+ }
+ ],
+ "test_sql2yql.test[blocks-interval_sub_interval_scalar]": [
+ {
+ "checksum": "64bed1638acd380231ccc8dcfb8507f1",
+ "size": 3369,
+ "uri": "https://{canondata_backend}/1925821/546674887da11b6a1a7690d670b49951da73a997/resource.tar.gz#test_sql2yql.test_blocks-interval_sub_interval_scalar_/sql.yql"
+ }
+ ],
"test_sql2yql.test[blocks-lazy_nonstrict_basic]": [
{
"checksum": "bb3c3b4a2e9d968a4e3d7d5c70d98e4d",
@@ -22294,6 +22336,34 @@
"uri": "https://{canondata_backend}/1880306/64654158d6bfb1289c66c626a8162239289559d0/resource.tar.gz#test_sql_format.test_blocks-complex_scalars_/formatted.sql"
}
],
+ "test_sql_format.test[blocks-date_sub]": [
+ {
+ "checksum": "7acc054ae9bdf92f4cdda9fe057f4c52",
+ "size": 1514,
+ "uri": "https://{canondata_backend}/212715/79e7a17b8755b0c468dda328d90c9b4cbd158569/resource.tar.gz#test_sql_format.test_blocks-date_sub_/formatted.sql"
+ }
+ ],
+ "test_sql_format.test[blocks-date_sub_interval]": [
+ {
+ "checksum": "5120f1b62bfb8416f4f1ac4bf0151f07",
+ "size": 293,
+ "uri": "https://{canondata_backend}/1937367/1fda6d8133fcc3c4cc9f49cbc1788a47ea2ac87d/resource.tar.gz#test_sql_format.test_blocks-date_sub_interval_/formatted.sql"
+ }
+ ],
+ "test_sql_format.test[blocks-date_sub_interval_scalar]": [
+ {
+ "checksum": "5ad62b4918036b94e7e047039f119b92",
+ "size": 1401,
+ "uri": "https://{canondata_backend}/1937367/1fda6d8133fcc3c4cc9f49cbc1788a47ea2ac87d/resource.tar.gz#test_sql_format.test_blocks-date_sub_interval_scalar_/formatted.sql"
+ }
+ ],
+ "test_sql_format.test[blocks-date_sub_scalar]": [
+ {
+ "checksum": "654cedeef89c8f61b00dd07160d32297",
+ "size": 7699,
+ "uri": "https://{canondata_backend}/1937367/1fda6d8133fcc3c4cc9f49cbc1788a47ea2ac87d/resource.tar.gz#test_sql_format.test_blocks-date_sub_scalar_/formatted.sql"
+ }
+ ],
"test_sql_format.test[blocks-distinct_mixed_all]": [
{
"checksum": "09047010fa82ca717821ea72c88bab75",
@@ -22406,6 +22476,20 @@
"uri": "https://{canondata_backend}/1880306/64654158d6bfb1289c66c626a8162239289559d0/resource.tar.gz#test_sql_format.test_blocks-if_/formatted.sql"
}
],
+ "test_sql_format.test[blocks-interval_sub_interval]": [
+ {
+ "checksum": "80ad2672847e0efcf8cd70159631f9bb",
+ "size": 151,
+ "uri": "https://{canondata_backend}/1937367/1fda6d8133fcc3c4cc9f49cbc1788a47ea2ac87d/resource.tar.gz#test_sql_format.test_blocks-interval_sub_interval_/formatted.sql"
+ }
+ ],
+ "test_sql_format.test[blocks-interval_sub_interval_scalar]": [
+ {
+ "checksum": "50592633fbf0b2106f6bbf2bdf256192",
+ "size": 283,
+ "uri": "https://{canondata_backend}/1925821/546674887da11b6a1a7690d670b49951da73a997/resource.tar.gz#test_sql_format.test_blocks-interval_sub_interval_scalar_/formatted.sql"
+ }
+ ],
"test_sql_format.test[blocks-lazy_nonstrict_basic]": [
{
"checksum": "285bfbbe81a6ea4974ba99c38efbb87f",
diff --git a/ydb/library/yql/tests/sql/suites/blocks/date_sub.cfg b/ydb/library/yql/tests/sql/suites/blocks/date_sub.cfg
new file mode 100644
index 00000000000..8d2d2a19fc3
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/blocks/date_sub.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/ydb/library/yql/tests/sql/suites/blocks/date_sub.sql b/ydb/library/yql/tests/sql/suites/blocks/date_sub.sql
new file mode 100644
index 00000000000..91449555547
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/blocks/date_sub.sql
@@ -0,0 +1,96 @@
+USE plato;
+pragma UseBlocks;
+
+SELECT
+ a.na - b.na,
+ a.na - b.naz,
+ a.na - b.nd,
+ a.na - b.ndz,
+ a.na - b.nt,
+ a.na - b.ntz,
+ a.na - b.wa,
+ a.na - b.wd,
+ a.na - b.wt,
+
+ a.naz - b.na,
+ a.naz - b.naz,
+ a.naz - b.nd,
+ a.naz - b.ndz,
+ a.naz - b.nt,
+ a.naz - b.ntz,
+ a.naz - b.wa,
+ a.naz - b.wd,
+ a.naz - b.wt,
+
+ a.nd - b.na,
+ a.nd - b.naz,
+ a.nd - b.nd,
+ a.nd - b.ndz,
+ a.nd - b.nt,
+ a.nd - b.ntz,
+ a.nd - b.wa,
+ a.nd - b.wd,
+ a.nd - b.wt,
+
+ a.ndz - b.na,
+ a.ndz - b.naz,
+ a.ndz - b.nd,
+ a.ndz - b.ndz,
+ a.ndz - b.nt,
+ a.ndz - b.ntz,
+ a.ndz - b.wa,
+ a.ndz - b.wd,
+ a.ndz - b.wt,
+
+ a.nt - b.na,
+ a.nt - b.naz,
+ a.nt - b.nd,
+ a.nt - b.ndz,
+ a.nt - b.nt,
+ a.nt - b.ntz,
+ a.nt - b.wa,
+ a.nt - b.wd,
+ a.nt - b.wt,
+
+ a.ntz - b.na,
+ a.ntz - b.naz,
+ a.ntz - b.nd,
+ a.ntz - b.ndz,
+ a.ntz - b.nt,
+ a.ntz - b.ntz,
+ a.ntz - b.wa,
+ a.ntz - b.wd,
+ a.ntz - b.wt,
+
+ a.wa - b.na,
+ a.wa - b.naz,
+ a.wa - b.nd,
+ a.wa - b.ndz,
+ a.wa - b.nt,
+ a.wa - b.ntz,
+ a.wa - b.wa,
+ a.wa - b.wd,
+ a.wa - b.wt,
+
+ a.wd - b.na,
+ a.wd - b.naz,
+ a.wd - b.nd,
+ a.wd - b.ndz,
+ a.wd - b.nt,
+ a.wd - b.ntz,
+ a.wd - b.wa,
+ a.wd - b.wd,
+ a.wd - b.wt,
+
+ a.wt - b.na,
+ a.wt - b.naz,
+ a.wt - b.nd,
+ a.wt - b.ndz,
+ a.wt - b.nt,
+ a.wt - b.ntz,
+ a.wt - b.wa,
+ a.wt - b.wd,
+ a.wt - b.wt
+
+FROM Dates as a CROSS JOIN Dates as b
+
diff --git a/ydb/library/yql/tests/sql/suites/blocks/date_sub_interval.cfg b/ydb/library/yql/tests/sql/suites/blocks/date_sub_interval.cfg
new file mode 100644
index 00000000000..8d2d2a19fc3
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/blocks/date_sub_interval.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/ydb/library/yql/tests/sql/suites/blocks/date_sub_interval.sql b/ydb/library/yql/tests/sql/suites/blocks/date_sub_interval.sql
new file mode 100644
index 00000000000..c136a845da9
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/blocks/date_sub_interval.sql
@@ -0,0 +1,18 @@
+USE plato;
+pragma UseBlocks;
+
+SELECT
+ a.na - b.ni,
+ a.na - b.wi,
+ a.naz - b.ni,
+ a.naz - b.wi,
+ a.nd - b.ni,
+ a.nd - b.wi,
+ a.ndz - b.ni,
+ a.ndz - b.wi,
+ a.nt - b.ni,
+ a.nt - b.wi,
+ a.ntz - b.ni,
+ a.ntz - b.wi
+FROM Dates as a CROSS JOIN Dates as b
+
diff --git a/ydb/library/yql/tests/sql/suites/blocks/date_sub_interval_scalar.cfg b/ydb/library/yql/tests/sql/suites/blocks/date_sub_interval_scalar.cfg
new file mode 100644
index 00000000000..8d2d2a19fc3
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/blocks/date_sub_interval_scalar.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/ydb/library/yql/tests/sql/suites/blocks/date_sub_interval_scalar.sql b/ydb/library/yql/tests/sql/suites/blocks/date_sub_interval_scalar.sql
new file mode 100644
index 00000000000..5d1d58ba9cc
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/blocks/date_sub_interval_scalar.sql
@@ -0,0 +1,46 @@
+USE plato;
+pragma UseBlocks;
+
+SELECT
+ Date("2000-01-01") - ni,
+ Date("2000-01-01") - wi,
+ TzDate("2000-01-01,Europe/Moscow") - ni,
+ TzDate("2000-01-01,Europe/Moscow") - wi,
+ Datetime("2000-01-01T03:04:05Z") - ni,
+ Datetime("2000-01-01T03:04:05Z") - wi,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - ni,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - wi,
+ Timestamp("2000-01-01T03:04:05.678912Z") - ni,
+ Timestamp("2000-01-01T03:04:05.678912Z") - wi,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - ni,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - wi,
+ Date32("1900-01-01") - ni,
+ Date32("1900-01-01") - wi,
+ Datetime64("1900-01-01T03:04:05Z") - ni,
+ Datetime64("1900-01-01T03:04:05Z") - wi,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - ni,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - wi
+FROM Dates;
+
+SELECT
+ na - Interval("P1D"),
+ na - Interval64("P1D"),
+ naz - Interval("P1D"),
+ naz - Interval64("P1D"),
+ nd - Interval("P1D"),
+ nd - Interval64("P1D"),
+ ndz - Interval("P1D"),
+ ndz - Interval64("P1D"),
+ nt - Interval("P1D"),
+ nt - Interval64("P1D"),
+ ntz - Interval("P1D"),
+ ntz - Interval64("P1D"),
+ wa - Interval("P1D"),
+ wa - Interval64("P1D"),
+ wd - Interval("P1D"),
+ wd - Interval64("P1D"),
+ wt - Interval("P1D"),
+ wt - Interval64("P1D")
+FROM Dates;
+
+
diff --git a/ydb/library/yql/tests/sql/suites/blocks/date_sub_scalar.cfg b/ydb/library/yql/tests/sql/suites/blocks/date_sub_scalar.cfg
new file mode 100644
index 00000000000..8d2d2a19fc3
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/blocks/date_sub_scalar.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/ydb/library/yql/tests/sql/suites/blocks/date_sub_scalar.sql b/ydb/library/yql/tests/sql/suites/blocks/date_sub_scalar.sql
new file mode 100644
index 00000000000..4b70c6ea694
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/blocks/date_sub_scalar.sql
@@ -0,0 +1,189 @@
+USE plato;
+pragma UseBlocks;
+
+SELECT
+ Date("2000-01-01") - na,
+ Date("2000-01-01") - naz,
+ Date("2000-01-01") - nd,
+ Date("2000-01-01") - ndz,
+ Date("2000-01-01") - nt,
+ Date("2000-01-01") - ntz,
+ Date("2000-01-01") - wa,
+ Date("2000-01-01") - wd,
+ Date("2000-01-01") - wt,
+
+ TzDate("2000-01-01,Europe/Moscow") - na,
+ TzDate("2000-01-01,Europe/Moscow") - naz,
+ TzDate("2000-01-01,Europe/Moscow") - nd,
+ TzDate("2000-01-01,Europe/Moscow") - ndz,
+ TzDate("2000-01-01,Europe/Moscow") - nt,
+ TzDate("2000-01-01,Europe/Moscow") - ntz,
+ TzDate("2000-01-01,Europe/Moscow") - wa,
+ TzDate("2000-01-01,Europe/Moscow") - wd,
+ TzDate("2000-01-01,Europe/Moscow") - wt,
+
+ Datetime("2000-01-01T03:04:05Z") - na,
+ Datetime("2000-01-01T03:04:05Z") - naz,
+ Datetime("2000-01-01T03:04:05Z") - nd,
+ Datetime("2000-01-01T03:04:05Z") - ndz,
+ Datetime("2000-01-01T03:04:05Z") - nt,
+ Datetime("2000-01-01T03:04:05Z") - ntz,
+ Datetime("2000-01-01T03:04:05Z") - wa,
+ Datetime("2000-01-01T03:04:05Z") - wd,
+ Datetime("2000-01-01T03:04:05Z") - wt,
+
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - na,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - naz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - nd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - ndz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - nt,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - ntz,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - wa,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - wd,
+ TzDatetime("2000-01-01T03:04:05,Europe/Moscow") - wt,
+
+ Timestamp("2000-01-01T03:04:05.678912Z") - na,
+ Timestamp("2000-01-01T03:04:05.678912Z") - naz,
+ Timestamp("2000-01-01T03:04:05.678912Z") - nd,
+ Timestamp("2000-01-01T03:04:05.678912Z") - ndz,
+ Timestamp("2000-01-01T03:04:05.678912Z") - nt,
+ Timestamp("2000-01-01T03:04:05.678912Z") - ntz,
+ Timestamp("2000-01-01T03:04:05.678912Z") - wa,
+ Timestamp("2000-01-01T03:04:05.678912Z") - wd,
+ Timestamp("2000-01-01T03:04:05.678912Z") - wt,
+
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - na,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - naz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - nd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - ndz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - nt,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - ntz,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - wa,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - wd,
+ TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow") - wt,
+
+ Date32("1900-01-01") - na,
+ Date32("1900-01-01") - naz,
+ Date32("1900-01-01") - nd,
+ Date32("1900-01-01") - ndz,
+ Date32("1900-01-01") - nt,
+ Date32("1900-01-01") - ntz,
+ Date32("1900-01-01") - wa,
+ Date32("1900-01-01") - wd,
+ Date32("1900-01-01") - wt,
+
+ Datetime64("1900-01-01T03:04:05Z") - na,
+ Datetime64("1900-01-01T03:04:05Z") - naz,
+ Datetime64("1900-01-01T03:04:05Z") - nd,
+ Datetime64("1900-01-01T03:04:05Z") - ndz,
+ Datetime64("1900-01-01T03:04:05Z") - nt,
+ Datetime64("1900-01-01T03:04:05Z") - ntz,
+ Datetime64("1900-01-01T03:04:05Z") - wa,
+ Datetime64("1900-01-01T03:04:05Z") - wd,
+ Datetime64("1900-01-01T03:04:05Z") - wt,
+
+ Timestamp64("1900-01-01T03:04:05.678912Z") - na,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - naz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - nd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - ndz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - nt,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - ntz,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - wa,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - wd,
+ Timestamp64("1900-01-01T03:04:05.678912Z") - wt
+
+FROM Dates;
+
+SELECT
+ na - Date("2000-01-01"),
+ naz - Date("2000-01-01"),
+ nd - Date("2000-01-01"),
+ ndz - Date("2000-01-01"),
+ nt - Date("2000-01-01"),
+ ntz - Date("2000-01-01"),
+ wa - Date("2000-01-01"),
+ wd - Date("2000-01-01"),
+ wt - Date("2000-01-01"),
+
+ na - TzDate("2000-01-01,Europe/Moscow"),
+ naz - TzDate("2000-01-01,Europe/Moscow"),
+ nd - TzDate("2000-01-01,Europe/Moscow"),
+ ndz - TzDate("2000-01-01,Europe/Moscow"),
+ nt - TzDate("2000-01-01,Europe/Moscow"),
+ ntz - TzDate("2000-01-01,Europe/Moscow"),
+ wa - TzDate("2000-01-01,Europe/Moscow"),
+ wd - TzDate("2000-01-01,Europe/Moscow"),
+ wt - TzDate("2000-01-01,Europe/Moscow"),
+
+ na - Datetime("2000-01-01T03:04:05Z"),
+ naz - Datetime("2000-01-01T03:04:05Z"),
+ nd - Datetime("2000-01-01T03:04:05Z"),
+ ndz - Datetime("2000-01-01T03:04:05Z"),
+ nt - Datetime("2000-01-01T03:04:05Z"),
+ ntz - Datetime("2000-01-01T03:04:05Z"),
+ wa - Datetime("2000-01-01T03:04:05Z"),
+ wd - Datetime("2000-01-01T03:04:05Z"),
+ wt - Datetime("2000-01-01T03:04:05Z"),
+
+ na - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ naz - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nd - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ndz - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ nt - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ ntz - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wa - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wd - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+ wt - TzDatetime("2000-01-01T03:04:05,Europe/Moscow"),
+
+ na - Timestamp("2000-01-01T03:04:05.678912Z"),
+ naz - Timestamp("2000-01-01T03:04:05.678912Z"),
+ nd - Timestamp("2000-01-01T03:04:05.678912Z"),
+ ndz - Timestamp("2000-01-01T03:04:05.678912Z"),
+ nt - Timestamp("2000-01-01T03:04:05.678912Z"),
+ ntz - Timestamp("2000-01-01T03:04:05.678912Z"),
+ wa - Timestamp("2000-01-01T03:04:05.678912Z"),
+ wd - Timestamp("2000-01-01T03:04:05.678912Z"),
+ wt - Timestamp("2000-01-01T03:04:05.678912Z"),
+
+ na - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ naz - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nd - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ndz - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ nt - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ ntz - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wa - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wd - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+ wt - TzTimestamp("2000-01-01T03:04:05.678912,Europe/Moscow"),
+
+ na - Date32("1900-01-01"),
+ naz - Date32("1900-01-01"),
+ nd - Date32("1900-01-01"),
+ ndz - Date32("1900-01-01"),
+ nt - Date32("1900-01-01"),
+ ntz - Date32("1900-01-01"),
+ wa - Date32("1900-01-01"),
+ wd - Date32("1900-01-01"),
+ wt - Date32("1900-01-01"),
+
+ na - Datetime64("1900-01-01T03:04:05Z"),
+ naz - Datetime64("1900-01-01T03:04:05Z"),
+ nd - Datetime64("1900-01-01T03:04:05Z"),
+ ndz - Datetime64("1900-01-01T03:04:05Z"),
+ nt - Datetime64("1900-01-01T03:04:05Z"),
+ ntz - Datetime64("1900-01-01T03:04:05Z"),
+ wa - Datetime64("1900-01-01T03:04:05Z"),
+ wd - Datetime64("1900-01-01T03:04:05Z"),
+ wt - Datetime64("1900-01-01T03:04:05Z"),
+
+ na - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ naz - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nd - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ndz - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ nt - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ ntz - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wa - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wd - Timestamp64("1900-01-01T03:04:05.678912Z"),
+ wt - Timestamp64("1900-01-01T03:04:05.678912Z")
+
+FROM Dates;
+
diff --git a/ydb/library/yql/tests/sql/suites/blocks/dates.txt b/ydb/library/yql/tests/sql/suites/blocks/dates.txt
new file mode 100644
index 00000000000..502f025c79c
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/blocks/dates.txt
@@ -0,0 +1 @@
+{"na"=1u;"nd"=2u;"nt"=3u;"naz"="\x00\x04\x00\x01";"ndz"="\x00\x00\x00\x05\x00\x01";"ntz"="\x00\x00\x00\x00\x00\x00\x00\x06\x00\x01";"wa"=7;"wd"=8;"wt"=9;"ni"=10;"wi"=11}
diff --git a/ydb/library/yql/tests/sql/suites/blocks/dates.txt.attr b/ydb/library/yql/tests/sql/suites/blocks/dates.txt.attr
new file mode 100644
index 00000000000..1636425719e
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/blocks/dates.txt.attr
@@ -0,0 +1,15 @@
+{"_yql_row_spec"={
+ "Type"=["StructType";[
+ ["na";["DataType";"Date"]];
+ ["nd";["DataType";"Datetime"]];
+ ["nt";["DataType";"Timestamp"]];
+ ["naz";["DataType";"TzDate"]];
+ ["ndz";["DataType";"TzDatetime"]];
+ ["ntz";["DataType";"TzTimestamp"]];
+ ["wa";["DataType";"Date32"]];
+ ["wd";["DataType";"Datetime64"]];
+ ["wt";["DataType";"Timestamp64"]];
+ ["ni";["DataType";"Interval"]];
+ ["wi";["DataType";"Interval64"]];
+ ]];
+}}
diff --git a/ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval.cfg b/ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval.cfg
new file mode 100644
index 00000000000..8d2d2a19fc3
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval.sql b/ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval.sql
new file mode 100644
index 00000000000..f78cf8f7b3c
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval.sql
@@ -0,0 +1,10 @@
+USE plato;
+pragma UseBlocks;
+
+SELECT
+ a.ni - b.ni,
+ a.ni - b.wi,
+ a.wi - b.ni,
+ a.wi - b.wi
+FROM Dates as a CROSS JOIN Dates as b
+
diff --git a/ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.cfg b/ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.cfg
new file mode 100644
index 00000000000..8d2d2a19fc3
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.cfg
@@ -0,0 +1 @@
+in Dates dates.txt
diff --git a/ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.sql b/ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.sql
new file mode 100644
index 00000000000..92a82e438fb
--- /dev/null
+++ b/ydb/library/yql/tests/sql/suites/blocks/interval_sub_interval_scalar.sql
@@ -0,0 +1,17 @@
+USE plato;
+pragma UseBlocks;
+
+SELECT
+ ni - Interval("P1D"),
+ wi - Interval("P1D"),
+ ni - Interval64("P1D"),
+ wi - Interval64("P1D")
+FROM Dates;
+
+SELECT
+ Interval("P1D") - ni,
+ Interval("P1D") - wi,
+ Interval64("P1D") - ni,
+ Interval64("P1D") - wi
+FROM Dates;
+
diff --git a/ydb/library/yql/tests/sql/yt_native_file/part10/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part10/canondata/result.json
index 080baef3034..8033e7d6b9f 100644
--- a/ydb/library/yql/tests/sql/yt_native_file/part10/canondata/result.json
+++ b/ydb/library/yql/tests/sql/yt_native_file/part10/canondata/result.json
@@ -486,6 +486,34 @@
"uri": "https://{canondata_backend}/1775059/f7233eab470e14ecb29d15fd37372b772f337134/resource.tar.gz#test.test_blocks-complex_scalars--Results_/results.txt"
}
],
+ "test.test[blocks-interval_sub_interval--Debug]": [
+ {
+ "checksum": "48a87b772c7075cf8928447cb7a2e492",
+ "size": 4060,
+ "uri": "https://{canondata_backend}/1900335/38e000ce6fc888e12dda32a428f2ef5541bfa644/resource.tar.gz#test.test_blocks-interval_sub_interval--Debug_/opt.yql"
+ }
+ ],
+ "test.test[blocks-interval_sub_interval--Peephole]": [
+ {
+ "checksum": "b86c8f7ff554979f63e15719cb87098a",
+ "size": 4092,
+ "uri": "https://{canondata_backend}/1900335/38e000ce6fc888e12dda32a428f2ef5541bfa644/resource.tar.gz#test.test_blocks-interval_sub_interval--Peephole_/opt.yql"
+ }
+ ],
+ "test.test[blocks-interval_sub_interval--Plan]": [
+ {
+ "checksum": "d7dbf254cbb680e6c3ac7584c091fdfe",
+ "size": 4932,
+ "uri": "https://{canondata_backend}/1900335/38e000ce6fc888e12dda32a428f2ef5541bfa644/resource.tar.gz#test.test_blocks-interval_sub_interval--Plan_/plan.txt"
+ }
+ ],
+ "test.test[blocks-interval_sub_interval--Results]": [
+ {
+ "checksum": "07ee1b4d20dabe0468bdb5026fece6e3",
+ "size": 2361,
+ "uri": "https://{canondata_backend}/1900335/38e000ce6fc888e12dda32a428f2ef5541bfa644/resource.tar.gz#test.test_blocks-interval_sub_interval--Results_/results.txt"
+ }
+ ],
"test.test[coalesce-coalesce_sugar-default.txt-Debug]": [
{
"checksum": "6820035ebd1c56ae06ecf6c4414ba3f0",
diff --git a/ydb/library/yql/tests/sql/yt_native_file/part12/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part12/canondata/result.json
index 6b6a0400e94..7b94c83ef77 100644
--- a/ydb/library/yql/tests/sql/yt_native_file/part12/canondata/result.json
+++ b/ydb/library/yql/tests/sql/yt_native_file/part12/canondata/result.json
@@ -496,6 +496,34 @@
"uri": "https://{canondata_backend}/1936997/a95cccf3209d441f2d222d56081bdfc240fc8b83/resource.tar.gz#test.test_blocks-combine_hashed_sum--Results_/results.txt"
}
],
+ "test.test[blocks-interval_sub_interval_scalar--Debug]": [
+ {
+ "checksum": "025a4bae76d4ccd9e58ec584a8b2756f",
+ "size": 2816,
+ "uri": "https://{canondata_backend}/1781765/7b47f1d593ee4b46b180526a99b36ed224350620/resource.tar.gz#test.test_blocks-interval_sub_interval_scalar--Debug_/opt.yql"
+ }
+ ],
+ "test.test[blocks-interval_sub_interval_scalar--Peephole]": [
+ {
+ "checksum": "7bf95ccc4b51928e4766a0cda529d2d7",
+ "size": 3030,
+ "uri": "https://{canondata_backend}/1781765/7b47f1d593ee4b46b180526a99b36ed224350620/resource.tar.gz#test.test_blocks-interval_sub_interval_scalar--Peephole_/opt.yql"
+ }
+ ],
+ "test.test[blocks-interval_sub_interval_scalar--Plan]": [
+ {
+ "checksum": "83346add489df45fa08e15e22f3014ae",
+ "size": 4323,
+ "uri": "https://{canondata_backend}/1871102/11243d32bd33d72dd389228fada66a98feeffe3b/resource.tar.gz#test.test_blocks-interval_sub_interval_scalar--Plan_/plan.txt"
+ }
+ ],
+ "test.test[blocks-interval_sub_interval_scalar--Results]": [
+ {
+ "checksum": "abe40433628a970774033c2b5d4ee9da",
+ "size": 4802,
+ "uri": "https://{canondata_backend}/1781765/7b47f1d593ee4b46b180526a99b36ed224350620/resource.tar.gz#test.test_blocks-interval_sub_interval_scalar--Results_/results.txt"
+ }
+ ],
"test.test[blocks-lazy_nonstrict_with_scalar_ctx--Debug]": [
{
"checksum": "6f91a2c9be4e63aa2603467a3775d663",
diff --git a/ydb/library/yql/tests/sql/yt_native_file/part18/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part18/canondata/result.json
index e72411bda3f..3dd55a63d5d 100644
--- a/ydb/library/yql/tests/sql/yt_native_file/part18/canondata/result.json
+++ b/ydb/library/yql/tests/sql/yt_native_file/part18/canondata/result.json
@@ -396,6 +396,34 @@
"uri": "https://{canondata_backend}/1899731/c92a452de9406ab0662eb9deef9f0799dbd3673d/resource.tar.gz#test.test_blocks-combine_all_min_filter--Results_/results.txt"
}
],
+ "test.test[blocks-date_sub_scalar--Debug]": [
+ {
+ "checksum": "b6461248fdc76173f20b07bd8fa87b88",
+ "size": 12767,
+ "uri": "https://{canondata_backend}/1871102/e156ef9d10ae5a3aee8ce3273e7322fb66517cc8/resource.tar.gz#test.test_blocks-date_sub_scalar--Debug_/opt.yql"
+ }
+ ],
+ "test.test[blocks-date_sub_scalar--Peephole]": [
+ {
+ "checksum": "70db5c1a2cd4e620f34d56c7546107cf",
+ "size": 18828,
+ "uri": "https://{canondata_backend}/1871102/e156ef9d10ae5a3aee8ce3273e7322fb66517cc8/resource.tar.gz#test.test_blocks-date_sub_scalar--Peephole_/opt.yql"
+ }
+ ],
+ "test.test[blocks-date_sub_scalar--Plan]": [
+ {
+ "checksum": "0e278aa62af2bd9061a3135d4033a8c0",
+ "size": 6542,
+ "uri": "https://{canondata_backend}/1871102/e156ef9d10ae5a3aee8ce3273e7322fb66517cc8/resource.tar.gz#test.test_blocks-date_sub_scalar--Plan_/plan.txt"
+ }
+ ],
+ "test.test[blocks-date_sub_scalar--Results]": [
+ {
+ "checksum": "4efad65c7cde8cbe6cd47113e837f7f6",
+ "size": 51479,
+ "uri": "https://{canondata_backend}/1871102/e156ef9d10ae5a3aee8ce3273e7322fb66517cc8/resource.tar.gz#test.test_blocks-date_sub_scalar--Results_/results.txt"
+ }
+ ],
"test.test[blocks-filter_partial_expr--Debug]": [
{
"checksum": "a946bc043844144adf891d515850ccb4",
diff --git a/ydb/library/yql/tests/sql/yt_native_file/part7/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part7/canondata/result.json
index 83d3179c6df..307545bd321 100644
--- a/ydb/library/yql/tests/sql/yt_native_file/part7/canondata/result.json
+++ b/ydb/library/yql/tests/sql/yt_native_file/part7/canondata/result.json
@@ -483,6 +483,62 @@
"uri": "https://{canondata_backend}/1871102/ae8b5d002551349280cb6bef50e922859b127b33/resource.tar.gz#test.test_blocks-combine_hashed_minmax_nested--Results_/results.txt"
}
],
+ "test.test[blocks-date_sub_interval--Debug]": [
+ {
+ "checksum": "ab58ccf75ab84de1df8165b435764ea9",
+ "size": 5833,
+ "uri": "https://{canondata_backend}/1900335/bd6c7c57c7cbffe4c815a9e399efee57e9f68a68/resource.tar.gz#test.test_blocks-date_sub_interval--Debug_/opt.yql"
+ }
+ ],
+ "test.test[blocks-date_sub_interval--Peephole]": [
+ {
+ "checksum": "4682805abc4343a65faba5c0c58792c5",
+ "size": 6041,
+ "uri": "https://{canondata_backend}/1900335/bd6c7c57c7cbffe4c815a9e399efee57e9f68a68/resource.tar.gz#test.test_blocks-date_sub_interval--Peephole_/opt.yql"
+ }
+ ],
+ "test.test[blocks-date_sub_interval--Plan]": [
+ {
+ "checksum": "aae45f9035acd48ed1e089d2e39f13f0",
+ "size": 7241,
+ "uri": "https://{canondata_backend}/1900335/bd6c7c57c7cbffe4c815a9e399efee57e9f68a68/resource.tar.gz#test.test_blocks-date_sub_interval--Plan_/plan.txt"
+ }
+ ],
+ "test.test[blocks-date_sub_interval--Results]": [
+ {
+ "checksum": "b8a07b38d67c42796cf54d342ddad081",
+ "size": 6138,
+ "uri": "https://{canondata_backend}/1900335/bd6c7c57c7cbffe4c815a9e399efee57e9f68a68/resource.tar.gz#test.test_blocks-date_sub_interval--Results_/results.txt"
+ }
+ ],
+ "test.test[blocks-date_sub_interval_scalar--Debug]": [
+ {
+ "checksum": "a58ecd112fc6be225db7313e1ccd5e4b",
+ "size": 5741,
+ "uri": "https://{canondata_backend}/1900335/bd6c7c57c7cbffe4c815a9e399efee57e9f68a68/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Debug_/opt.yql"
+ }
+ ],
+ "test.test[blocks-date_sub_interval_scalar--Peephole]": [
+ {
+ "checksum": "ffd40cfa106b6714055e9d484f88ee00",
+ "size": 7072,
+ "uri": "https://{canondata_backend}/1900335/bd6c7c57c7cbffe4c815a9e399efee57e9f68a68/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Peephole_/opt.yql"
+ }
+ ],
+ "test.test[blocks-date_sub_interval_scalar--Plan]": [
+ {
+ "checksum": "abde8bbc01ab049101cb5673bad50a1c",
+ "size": 6872,
+ "uri": "https://{canondata_backend}/1900335/bd6c7c57c7cbffe4c815a9e399efee57e9f68a68/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Plan_/plan.txt"
+ }
+ ],
+ "test.test[blocks-date_sub_interval_scalar--Results]": [
+ {
+ "checksum": "2bdacd094bfd3374a6cf60342b8de137",
+ "size": 18314,
+ "uri": "https://{canondata_backend}/1900335/bd6c7c57c7cbffe4c815a9e399efee57e9f68a68/resource.tar.gz#test.test_blocks-date_sub_interval_scalar--Results_/results.txt"
+ }
+ ],
"test.test[column_order-insert--Debug]": [
{
"checksum": "e4030a85259a67fc2ab749b257ad91e9",
diff --git a/ydb/library/yql/tests/sql/yt_native_file/part8/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part8/canondata/result.json
index 5640f77f939..9ca988508d4 100644
--- a/ydb/library/yql/tests/sql/yt_native_file/part8/canondata/result.json
+++ b/ydb/library/yql/tests/sql/yt_native_file/part8/canondata/result.json
@@ -774,6 +774,34 @@
"uri": "https://{canondata_backend}/1775059/105879cd875204bc7c66426c8bfdd2bbd01bfaf7/resource.tar.gz#test.test_blocks-compare_dates_floats_bools--Results_/results.txt"
}
],
+ "test.test[blocks-date_sub--Debug]": [
+ {
+ "checksum": "1b57bdcd2ac9c4c29504d65874958e5c",
+ "size": 12572,
+ "uri": "https://{canondata_backend}/1597364/22cafa9d137c7f566e7fb8d90372e8edb5586315/resource.tar.gz#test.test_blocks-date_sub--Debug_/opt.yql"
+ }
+ ],
+ "test.test[blocks-date_sub--Peephole]": [
+ {
+ "checksum": "3a41452e7af983a27380b0cca00689ae",
+ "size": 13861,
+ "uri": "https://{canondata_backend}/1597364/22cafa9d137c7f566e7fb8d90372e8edb5586315/resource.tar.gz#test.test_blocks-date_sub--Peephole_/opt.yql"
+ }
+ ],
+ "test.test[blocks-date_sub--Plan]": [
+ {
+ "checksum": "672e0da1456232a1ae0f207f8a4dac92",
+ "size": 7392,
+ "uri": "https://{canondata_backend}/1900335/022692338168d2d1b3c06dbd9c2be2ecced30cb7/resource.tar.gz#test.test_blocks-date_sub--Plan_/plan.txt"
+ }
+ ],
+ "test.test[blocks-date_sub--Results]": [
+ {
+ "checksum": "620ab0e85411d5cde65628d92ba6329c",
+ "size": 25169,
+ "uri": "https://{canondata_backend}/1900335/022692338168d2d1b3c06dbd9c2be2ecced30cb7/resource.tar.gz#test.test_blocks-date_sub--Results_/results.txt"
+ }
+ ],
"test.test[blocks-filter_expr--Debug]": [
{
"checksum": "76029bf87b09302f5ed89977bff46bbd",