diff options
| author | Vitaly Stoyan <[email protected]> | 2024-06-10 15:39:07 +0300 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-06-10 17:39:07 +0500 |
| commit | 4ed43f378b03afa11450876ee25ba2cdf675dce6 (patch) | |
| tree | 3d102c39c87085ecfc5794bda778d92ed49e8028 | |
| parent | 986b35715d12e0d634cd1bfedb7c6e57ecdc04f4 (diff) | |
[block] subtraction for datetime, interval (#5341)
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", |
