From 3a4f612834f5ae676a9d3da880f96c7fea8005ad Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Wed, 24 Jan 2024 15:43:24 +0100 Subject: [PATCH 1/4] Add real kernels. --- .../invoke_builtins/mkql_builtins_add.cpp | 2 +- .../invoke_builtins/mkql_builtins_div.cpp | 4 +- .../invoke_builtins/mkql_builtins_impl.h.txt | 58 ++++++++++++++++++- .../invoke_builtins/mkql_builtins_mod.cpp | 4 +- .../invoke_builtins/mkql_builtins_mul.cpp | 2 +- .../invoke_builtins/mkql_builtins_sub.cpp | 2 +- 6 files changed, 66 insertions(+), 6 deletions(-) diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_add.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_add.cpp index f50ef29857ea..575ba9c2456b 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_add.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_add.cpp @@ -193,7 +193,7 @@ void RegisterAdd(IBuiltinFunctionRegistry& registry) { } void RegisterAdd(TKernelFamilyMap& kernelFamilyMap) { - kernelFamilyMap["Add"] = std::make_unique>(); + kernelFamilyMap["Add"] = std::make_unique>(); } void RegisterAggrAdd(IBuiltinFunctionRegistry& registry) { diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_div.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_div.cpp index 880321f8f0b0..06cf1005d82d 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_div.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_div.cpp @@ -12,6 +12,8 @@ template struct TDiv : public TSimpleArithmeticBinary> { static_assert(std::is_floating_point::value, "expected floating point"); + static constexpr bool DefaultNulls = true; + static TOutput Do(TOutput left, TOutput right) { return left / right; @@ -167,7 +169,7 @@ void RegisterDiv(IBuiltinFunctionRegistry& registry) { } void RegisterDiv(TKernelFamilyMap& kernelFamilyMap) { - kernelFamilyMap["Div"] = std::make_unique>(TKernelFamily::ENullMode::AlwaysNull); + kernelFamilyMap["Div"] = std::make_unique>(TKernelFamily::ENullMode::AlwaysNull); } } // namespace NMiniKQL 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 b6ab6fcfe685..0495c796f5f5 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 @@ -1188,6 +1188,12 @@ void AddUnaryIntegralKernels(TKernelFamilyBase& owner) { AddUnaryKernel, NUdf::TDataType, TFunc>(owner); } +template class TFunc> +void AddUnaryRealKernels(TKernelFamilyBase& owner) { + AddUnaryKernel, NUdf::TDataType, TFunc>(owner); + AddUnaryKernel, NUdf::TDataType, TFunc>(owner); +} + template class TFunc> void AddBinaryIntegralKernels(TKernelFamilyBase& owner) { AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); @@ -1264,12 +1270,61 @@ void AddBinaryIntegralKernels(TKernelFamilyBase& owner) { } template class TFunc> +void AddBinaryRealKernels(TKernelFamilyBase& owner) { + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); + AddBinaryKernel, NUdf::TDataType, NUdf::TDataType, TFunc>(owner); +} + +template class TFuncForIntegral, template class TFuncForReal> class TBinaryNumericKernelFamily : public TKernelFamilyBase { public: TBinaryNumericKernelFamily(TKernelFamily::ENullMode nullMode = TKernelFamily::ENullMode::Default) : TKernelFamilyBase(nullMode) { - AddBinaryIntegralKernels(*this); + AddBinaryIntegralKernels(*this); + AddBinaryRealKernels(*this); } }; @@ -1280,6 +1335,7 @@ public: : TKernelFamilyBase(nullMode) { AddUnaryIntegralKernels(*this); + AddUnaryRealKernels(*this); } }; diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mod.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mod.cpp index 6e08f29b5efa..5c4dea157eb8 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mod.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mod.cpp @@ -11,6 +11,8 @@ template struct TMod : public TSimpleArithmeticBinary> { static_assert(std::is_floating_point::value, "expected floating point"); + static constexpr bool DefaultNulls = true; + static TOutput Do(TOutput left, TOutput right) { return std::fmod(left, right); @@ -91,7 +93,7 @@ void RegisterMod(IBuiltinFunctionRegistry& registry) { } void RegisterMod(TKernelFamilyMap& kernelFamilyMap) { - kernelFamilyMap["Mod"] = std::make_unique>(TKernelFamily::ENullMode::AlwaysNull); + kernelFamilyMap["Mod"] = std::make_unique>(TKernelFamily::ENullMode::AlwaysNull); } } // namespace NMiniKQL diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mul.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mul.cpp index 36cd070df6a5..cf772c8c7436 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mul.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mul.cpp @@ -98,7 +98,7 @@ void RegisterMul(IBuiltinFunctionRegistry& registry) { } void RegisterMul(TKernelFamilyMap& kernelFamilyMap) { - kernelFamilyMap["Mul"] = std::make_unique>(); + kernelFamilyMap["Mul"] = std::make_unique>(); } } // namespace NMiniKQL 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 2b04e4ea5868..546c11921b25 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_sub.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_sub.cpp @@ -263,7 +263,7 @@ void RegisterSub(IBuiltinFunctionRegistry& registry) { } void RegisterSub(TKernelFamilyMap& kernelFamilyMap) { - kernelFamilyMap["Sub"] = std::make_unique>(); + kernelFamilyMap["Sub"] = std::make_unique>(); } } // namespace NMiniKQL From 040607f90e89663cba7750afd2231c91dd6d134a Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Thu, 25 Jan 2024 11:53:51 +0100 Subject: [PATCH 2/4] Fix null policy for Div/Mod. --- .../yql/minikql/arrow/mkql_functions.cpp | 8 +-- .../minikql/invoke_builtins/mkql_builtins.cpp | 59 ------------------- .../invoke_builtins/mkql_builtins_abs.cpp | 2 + .../invoke_builtins/mkql_builtins_div.cpp | 4 +- .../invoke_builtins/mkql_builtins_impl.h.txt | 25 ++++---- .../invoke_builtins/mkql_builtins_minus.cpp | 2 + .../invoke_builtins/mkql_builtins_mod.cpp | 4 +- .../mkql_builtins_string_kernels.cpp | 8 +-- .../yql/minikql/mkql_function_metadata.cpp | 4 +- .../yql/minikql/mkql_function_metadata.h | 24 ++++---- 10 files changed, 43 insertions(+), 97 deletions(-) diff --git a/ydb/library/yql/minikql/arrow/mkql_functions.cpp b/ydb/library/yql/minikql/arrow/mkql_functions.cpp index 92a553136df6..4e7be0f3ee57 100644 --- a/ydb/library/yql/minikql/arrow/mkql_functions.cpp +++ b/ydb/library/yql/minikql/arrow/mkql_functions.cpp @@ -160,14 +160,14 @@ bool FindArrowFunction(TStringBuf name, const TArrayRef& inputTypes, TTy } bool match = false; - switch (kernel->Family.NullMode) { - case TKernelFamily::ENullMode::Default: + switch (kernel->NullMode) { + case TKernel::ENullMode::Default: match = returnIsOptional == hasOptionals; break; - case TKernelFamily::ENullMode::AlwaysNull: + case TKernel::ENullMode::AlwaysNull: match = returnIsOptional; break; - case TKernelFamily::ENullMode::AlwaysNotNull: + case TKernel::ENullMode::AlwaysNotNull: match = !returnIsOptional; break; } diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins.cpp index afa2ff99c28c..a8d53ff1795e 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins.cpp @@ -19,65 +19,6 @@ namespace NMiniKQL { namespace { -class TForeignKernel : public TKernel { -public: - TForeignKernel(const TKernelFamily& family, const std::vector& argTypes, NUdf::TDataTypeId returnType, - const std::shared_ptr& function) - : TKernel(family, argTypes, returnType) - , Function(function) - , ArrowKernel(ResolveKernel(Function, argTypes)) - {} - - const arrow::compute::ScalarKernel& GetArrowKernel() const final { - return ArrowKernel; - } - -private: - static const arrow::compute::ScalarKernel& ResolveKernel(const std::shared_ptr& function, - const std::vector& argTypes) { - std::vector args; - for (const auto& t : argTypes) { - args.emplace_back(); - auto slot = NUdf::FindDataSlot(t); - MKQL_ENSURE(slot, "Unexpected data type"); - MKQL_ENSURE(ConvertArrowType(*slot, args.back().type), "Can't get arrow type"); - } - - const auto kernel = ARROW_RESULT(function->DispatchExact(args)); - return *static_cast(kernel); - } - -private: - const std::shared_ptr Function; - const arrow::compute::ScalarKernel& ArrowKernel; -}; - -template -void RegisterUnary(const arrow::compute::FunctionRegistry& registry, std::string_view name, TKernelFamilyMap& kernelFamilyMap) { - auto func = ARROW_RESULT(registry.GetFunction(std::string(name))); - - std::vector argTypes({ NUdf::TDataType::Id }); - NUdf::TDataTypeId returnType = NUdf::TDataType::Id; - - auto family = std::make_unique(); - family->Adopt(argTypes, returnType, std::make_unique(*family, argTypes, returnType, func)); - - Y_ENSURE(kernelFamilyMap.emplace(TString(name), std::move(family)).second); -} - -template -void RegisterBinary(const arrow::compute::FunctionRegistry& registry, std::string_view name, TKernelFamilyMap& kernelFamilyMap) { - auto func = ARROW_RESULT(registry.GetFunction(std::string(name))); - - std::vector argTypes({ NUdf::TDataType::Id, NUdf::TDataType::Id }); - NUdf::TDataTypeId returnType = NUdf::TDataType::Id; - - auto family = std::make_unique(); - family->Adopt(argTypes, returnType, std::make_unique(*family, argTypes, returnType, func)); - - Y_ENSURE(kernelFamilyMap.emplace(TString(name), std::move(family)).second); -} - void RegisterDefaultOperations(IBuiltinFunctionRegistry& registry, TKernelFamilyMap& kernelFamilyMap) { RegisterAdd(registry); RegisterAdd(kernelFamilyMap); diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_abs.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_abs.cpp index 6be9662115be..7f28c3672076 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_abs.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_abs.cpp @@ -23,6 +23,8 @@ inline T Abs(T v) { template struct TAbs : public TSimpleArithmeticUnary> { + static constexpr bool DefaultNulls = true; + static TOutput Do(TInput val) { return Abs(val); diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_div.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_div.cpp index 06cf1005d82d..60d4a4625d84 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_div.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_div.cpp @@ -62,7 +62,7 @@ struct TIntegralDiv { const auto result = PHINode::Create(type, 2, "result", done); result->addIncoming(zero, block); - if (std::is_signed() && sizeof(TOutput) <= sizeof(TLeft)) { + if constexpr (std::is_signed() && sizeof(TOutput) <= sizeof(TLeft)) { const auto min = CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, lv, ConstantInt::get(lv->getType(), Min()), "min", block); const auto one = CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, rv, ConstantInt::get(rv->getType(), -1), "one", block); const auto two = BinaryOperator::CreateAnd(min, one, "two", block); @@ -169,7 +169,7 @@ void RegisterDiv(IBuiltinFunctionRegistry& registry) { } void RegisterDiv(TKernelFamilyMap& kernelFamilyMap) { - kernelFamilyMap["Div"] = std::make_unique>(TKernelFamily::ENullMode::AlwaysNull); + kernelFamilyMap["Div"] = std::make_unique>(); } } // namespace NMiniKQL 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 0495c796f5f5..16b572e0d180 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 @@ -1075,8 +1075,8 @@ struct TBinaryKernelExecs : TBi class TPlainKernel : public TKernel { public: - TPlainKernel(const TKernelFamily& family, const std::vector& argTypes, NUdf::TDataTypeId returnType, const arrow::compute::ScalarKernel& arrowKernel) - : TKernel(family, argTypes, returnType) + TPlainKernel(const TKernelFamily& family, const std::vector& argTypes, NUdf::TDataTypeId returnType, const arrow::compute::ScalarKernel& arrowKernel, TKernel::ENullMode nullMode) + : TKernel(family, argTypes, returnType, nullMode) , ArrowKernel(arrowKernel) { } @@ -1133,8 +1133,9 @@ void AddUnaryKernel(TKernelFamilyBase& owner) { NUdf::TDataTypeId returnType = TOutput::Id; arrow::compute::ScalarKernel k({ GetPrimitiveInputArrowType() }, GetPrimitiveOutputArrowType(), &TExecs::Exec); - k.null_handling = owner.NullMode == TKernelFamily::ENullMode::Default ? arrow::compute::NullHandling::INTERSECTION : arrow::compute::NullHandling::COMPUTED_PREALLOCATE; - owner.Adopt(argTypes, returnType, std::make_unique(owner, argTypes, returnType, k)); + k.null_handling = TFuncInstance::DefaultNulls ? arrow::compute::NullHandling::INTERSECTION : arrow::compute::NullHandling::COMPUTED_PREALLOCATE; + const auto nullMode = TFuncInstance::DefaultNulls ? TKernel::ENullMode::Default : TKernel::ENullMode::AlwaysNull; + owner.Adopt(argTypes, returnType, std::make_unique(owner, argTypes, returnType, k, nullMode)); } template(), GetPrimitiveInputArrowType() }, GetPrimitiveOutputArrowType(), &TExecs::Exec); - k.null_handling = owner.NullMode == TKernelFamily::ENullMode::Default ? arrow::compute::NullHandling::INTERSECTION : arrow::compute::NullHandling::COMPUTED_PREALLOCATE; - owner.Adopt(argTypes, returnType, std::make_unique(owner, argTypes, returnType, k)); + k.null_handling = TFuncInstance::DefaultNulls ? arrow::compute::NullHandling::INTERSECTION : arrow::compute::NullHandling::COMPUTED_PREALLOCATE; + const auto nullMode = TFuncInstance::DefaultNulls ? TKernel::ENullMode::Default : TKernel::ENullMode::AlwaysNull; + owner.Adopt(argTypes, returnType, std::make_unique(owner, argTypes, returnType, k, nullMode)); } template(), GetPrimitiveInputArrowType() }, GetPrimitiveOutputArrowType(), &TExecs::Exec); - k.null_handling = owner.NullMode == TKernelFamily::ENullMode::Default ? arrow::compute::NullHandling::INTERSECTION : arrow::compute::NullHandling::COMPUTED_PREALLOCATE; - owner.Adopt(argTypes, returnType, std::make_unique(owner, argTypes, returnType, k)); + k.null_handling = TFuncInstance::DefaultNulls ? arrow::compute::NullHandling::INTERSECTION : arrow::compute::NullHandling::COMPUTED_PREALLOCATE; + const auto nullMode = TFuncInstance::DefaultNulls ? TKernel::ENullMode::Default : TKernel::ENullMode::AlwaysNull; + owner.Adopt(argTypes, returnType, std::make_unique(owner, argTypes, returnType, k, nullMode)); } template class TFunc> @@ -1320,8 +1323,7 @@ void AddBinaryRealKernels(TKernelFamilyBase& owner) { template class TFuncForIntegral, template class TFuncForReal> class TBinaryNumericKernelFamily : public TKernelFamilyBase { public: - TBinaryNumericKernelFamily(TKernelFamily::ENullMode nullMode = TKernelFamily::ENullMode::Default) - : TKernelFamilyBase(nullMode) + TBinaryNumericKernelFamily() { AddBinaryIntegralKernels(*this); AddBinaryRealKernels(*this); @@ -1331,8 +1333,7 @@ public: template class TFunc> class TUnaryNumericKernelFamily : public TKernelFamilyBase { public: - TUnaryNumericKernelFamily(TKernelFamily::ENullMode nullMode = TKernelFamily::ENullMode::Default) - : TKernelFamilyBase(nullMode) + TUnaryNumericKernelFamily() { AddUnaryIntegralKernels(*this); AddUnaryRealKernels(*this); diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_minus.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_minus.cpp index e6f267718c3c..920636ab9f47 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_minus.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_minus.cpp @@ -7,6 +7,8 @@ namespace { template struct TMinus : public TSimpleArithmeticUnary> { + static constexpr bool DefaultNulls = true; + static TOutput Do(TInput val) { return -val; diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mod.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mod.cpp index 5c4dea157eb8..ee5857101b7b 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mod.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mod.cpp @@ -63,7 +63,7 @@ struct TIntegralMod { const auto result = PHINode::Create(type, 2, "result", done); result->addIncoming(zero, block); - if (std::is_signed() && sizeof(TOutput) <= sizeof(TLeft)) { + if constexpr (std::is_signed() && sizeof(TOutput) <= sizeof(TLeft)) { const auto min = CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, lv, ConstantInt::get(lv->getType(), Min()), "min", block); const auto one = CmpInst::Create(Instruction::ICmp, ICmpInst::ICMP_EQ, rv, ConstantInt::get(rv->getType(), -1), "one", block); const auto two = BinaryOperator::CreateAnd(min, one, "two", block); @@ -93,7 +93,7 @@ void RegisterMod(IBuiltinFunctionRegistry& registry) { } void RegisterMod(TKernelFamilyMap& kernelFamilyMap) { - kernelFamilyMap["Mod"] = std::make_unique>(TKernelFamily::ENullMode::AlwaysNull); + kernelFamilyMap["Mod"] = std::make_unique>(); } } // namespace NMiniKQL diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_string_kernels.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_string_kernels.cpp index f7a1b20cb8f7..acf153fefd98 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_string_kernels.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_string_kernels.cpp @@ -298,8 +298,8 @@ void AddCompareStringKernel(TKernelFamilyBase& kernelFamily) { NUdf::TDataTypeId returnType = NUdf::TDataType::Id; arrow::compute::ScalarKernel k({ GetPrimitiveInputArrowType(), GetPrimitiveInputArrowType() }, GetPrimitiveOutputArrowType(), &TExecs::Exec); - k.null_handling = kernelFamily.NullMode == TKernelFamily::ENullMode::Default ? arrow::compute::NullHandling::INTERSECTION : arrow::compute::NullHandling::COMPUTED_PREALLOCATE; - kernelFamily.Adopt(argTypes, returnType, std::make_unique(kernelFamily, argTypes, returnType, k)); + k.null_handling = arrow::compute::NullHandling::INTERSECTION; + kernelFamily.Adopt(argTypes, returnType, std::make_unique(kernelFamily, argTypes, returnType, k, TKernel::ENullMode::Default)); } template @@ -332,8 +332,8 @@ void AddSizeStringKernel(TKernelFamilyBase& kernelFamily) { NUdf::TDataTypeId returnType = NUdf::TDataType::Id; arrow::compute::ScalarKernel k({ GetPrimitiveInputArrowType() }, GetPrimitiveOutputArrowType(), &TExecs::Exec); - k.null_handling = kernelFamily.NullMode == TKernelFamily::ENullMode::Default ? arrow::compute::NullHandling::INTERSECTION : arrow::compute::NullHandling::COMPUTED_PREALLOCATE; - kernelFamily.Adopt(argTypes, returnType, std::make_unique(kernelFamily, argTypes, returnType, k)); + k.null_handling = arrow::compute::NullHandling::INTERSECTION; + kernelFamily.Adopt(argTypes, returnType, std::make_unique(kernelFamily, argTypes, returnType, k, TKernel::ENullMode::Default)); } } // namespace diff --git a/ydb/library/yql/minikql/mkql_function_metadata.cpp b/ydb/library/yql/minikql/mkql_function_metadata.cpp index 2678be3728b5..0d9e821b9512 100644 --- a/ydb/library/yql/minikql/mkql_function_metadata.cpp +++ b/ydb/library/yql/minikql/mkql_function_metadata.cpp @@ -4,8 +4,8 @@ namespace NKikimr { namespace NMiniKQL { -TKernelFamilyBase::TKernelFamilyBase(ENullMode nullMode, const arrow::compute::FunctionOptions* functionOptions) - : TKernelFamily(nullMode, functionOptions) +TKernelFamilyBase::TKernelFamilyBase(const arrow::compute::FunctionOptions* functionOptions) + : TKernelFamily(functionOptions) {} const TKernel* TKernelFamilyBase::FindKernel(const NUdf::TDataTypeId* argTypes, size_t argTypesCount, NUdf::TDataTypeId returnType) const { diff --git a/ydb/library/yql/minikql/mkql_function_metadata.h b/ydb/library/yql/minikql/mkql_function_metadata.h index c6ecabcfddba..e66b8e9c08c5 100644 --- a/ydb/library/yql/minikql/mkql_function_metadata.h +++ b/ydb/library/yql/minikql/mkql_function_metadata.h @@ -56,18 +56,10 @@ class TKernel; class TKernelFamily { public: - enum ENullMode { - Default, - AlwaysNull, - AlwaysNotNull - }; - - const ENullMode NullMode; const arrow::compute::FunctionOptions* FunctionOptions; - TKernelFamily(ENullMode nullMode = ENullMode::Default, const arrow::compute::FunctionOptions* functionOptions = nullptr) - : NullMode(nullMode) - , FunctionOptions(functionOptions) + TKernelFamily(const arrow::compute::FunctionOptions* functionOptions = nullptr) + : FunctionOptions(functionOptions) {} virtual ~TKernelFamily() = default; @@ -77,14 +69,22 @@ class TKernelFamily { class TKernel { public: + enum class ENullMode { + Default, + AlwaysNull, + AlwaysNotNull + }; + const TKernelFamily& Family; const std::vector ArgTypes; const NUdf::TDataTypeId ReturnType; + const ENullMode NullMode; - TKernel(const TKernelFamily& family, const std::vector& argTypes, NUdf::TDataTypeId returnType) + TKernel(const TKernelFamily& family, const std::vector& argTypes, NUdf::TDataTypeId returnType, ENullMode nullMode) : Family(family) , ArgTypes(argTypes) , ReturnType(returnType) + , NullMode(nullMode) { } @@ -113,7 +113,7 @@ using TKernelFamilyMap = std::unordered_map GetAllKernels() const final; From ad4c0c167114a3485f815f36049b1da2b175d0ea Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Thu, 25 Jan 2024 12:41:54 +0100 Subject: [PATCH 3/4] Add tests. --- .../arrow_kernels/registry/ut/registry_ut.cpp | 71 ++++++++++++++++--- 1 file changed, 63 insertions(+), 8 deletions(-) diff --git a/ydb/library/yql/core/arrow_kernels/registry/ut/registry_ut.cpp b/ydb/library/yql/core/arrow_kernels/registry/ut/registry_ut.cpp index f66c4dbe97a1..1b2cf7e3df8c 100644 --- a/ydb/library/yql/core/arrow_kernels/registry/ut/registry_ut.cpp +++ b/ydb/library/yql/core/arrow_kernels/registry/ut/registry_ut.cpp @@ -112,6 +112,57 @@ Y_UNIT_TEST_SUITE(TKernelRegistryTest) { }); } + Y_UNIT_TEST(TestAddSubMulOps) { + for (const auto oper : {TKernelRequestBuilder::EBinaryOp::Add, TKernelRequestBuilder::EBinaryOp::Sub, TKernelRequestBuilder::EBinaryOp::Mul}) { + for (const auto slot : {EDataSlot::Int8, EDataSlot::Int16, EDataSlot::Int32, EDataSlot::Int64, EDataSlot::Uint8, EDataSlot::Uint16, EDataSlot::Uint32, EDataSlot::Uint64, EDataSlot::Float, EDataSlot::Double}) { + TestOne([slot, oper](auto& b,auto& ctx) { + const auto blockUint8Type = ctx.template MakeType(ctx.template MakeType(EDataSlot::Uint8)); + const auto blockType = ctx.template MakeType(ctx.template MakeType(slot)); + return b.AddBinaryOp(oper, blockUint8Type, blockType, blockType); + }); + TestOne([slot, oper](auto& b,auto& ctx) { + const auto blockUint8Type = ctx.template MakeType(ctx.template MakeType(EDataSlot::Uint8)); + const auto blockType = ctx.template MakeType(ctx.template MakeType(slot)); + return b.AddBinaryOp(oper, blockType, blockUint8Type, blockType); + }); + TestOne([slot, oper](auto& b,auto& ctx) { + const auto blockType = ctx.template MakeType(ctx.template MakeType(slot)); + return b.AddBinaryOp(oper, blockType, blockType, blockType); + }); + } + } + } + + Y_UNIT_TEST(TestDivModOps) { + for (const auto oper : {TKernelRequestBuilder::EBinaryOp::Div, TKernelRequestBuilder::EBinaryOp::Mod}) { + for (const auto slot : {EDataSlot::Int8, EDataSlot::Int16, EDataSlot::Int32, EDataSlot::Int64, EDataSlot::Uint8, EDataSlot::Uint16, EDataSlot::Uint32, EDataSlot::Uint64, EDataSlot::Float, EDataSlot::Double}) { + TestOne([slot, oper](auto& b,auto& ctx) { + const auto blockUint8Type = ctx.template MakeType(ctx.template MakeType(EDataSlot::Uint8)); + const auto rawType = ctx.template MakeType(slot); + const auto blockType = ctx.template MakeType(rawType); + const auto returnType = EDataSlot::Float != slot && EDataSlot::Double != slot ? + ctx.template MakeType(ctx.template MakeType(rawType)) : blockType; + return b.AddBinaryOp(oper, blockUint8Type, blockType, returnType); + }); + TestOne([slot, oper](auto& b,auto& ctx) { + const auto blockUint8Type = ctx.template MakeType(ctx.template MakeType(EDataSlot::Uint8)); + const auto rawType = ctx.template MakeType(slot); + const auto blockType = ctx.template MakeType(rawType); + const auto returnType = EDataSlot::Float != slot && EDataSlot::Double != slot ? + ctx.template MakeType(ctx.template MakeType(rawType)) : blockType; + return b.AddBinaryOp(oper, blockType, blockUint8Type, returnType); + }); + TestOne([slot, oper](auto& b,auto& ctx) { + const auto rawType = ctx.template MakeType(slot); + const auto blockType = ctx.template MakeType(rawType); + const auto returnType = EDataSlot::Float != slot && EDataSlot::Double != slot ? + ctx.template MakeType(ctx.template MakeType(rawType)) : blockType; + return b.AddBinaryOp(oper, blockType, blockType, returnType); + }); + } + } + } + Y_UNIT_TEST(TestSize) { TestOne([](auto& b,auto& ctx) { auto blockStrType = ctx.template MakeType(ctx.template MakeType(EDataSlot::String)); @@ -121,17 +172,21 @@ Y_UNIT_TEST_SUITE(TKernelRegistryTest) { } Y_UNIT_TEST(TestMinus) { - TestOne([](auto& b,auto& ctx) { - auto blockInt32Type = ctx.template MakeType(ctx.template MakeType(EDataSlot::Int32)); - return b.AddUnaryOp(TKernelRequestBuilder::EUnaryOp::Minus, blockInt32Type, blockInt32Type); - }); + for (const auto slot : {EDataSlot::Int8, EDataSlot::Int16, EDataSlot::Int32, EDataSlot::Int64, EDataSlot::Float, EDataSlot::Double}) { + TestOne([slot](auto& b,auto& ctx) { + const auto blockType = ctx.template MakeType(ctx.template MakeType(slot)); + return b.AddUnaryOp(TKernelRequestBuilder::EUnaryOp::Minus, blockType, blockType); + }); + } } Y_UNIT_TEST(TestAbs) { - TestOne([](auto& b,auto& ctx) { - auto blockInt32Type = ctx.template MakeType(ctx.template MakeType(EDataSlot::Int32)); - return b.AddUnaryOp(TKernelRequestBuilder::EUnaryOp::Abs, blockInt32Type, blockInt32Type); - }); + for (const auto slot : {EDataSlot::Int8, EDataSlot::Int16, EDataSlot::Int32, EDataSlot::Int64, EDataSlot::Float, EDataSlot::Double}) { + TestOne([slot](auto& b,auto& ctx) { + const auto blockType = ctx.template MakeType(ctx.template MakeType(slot)); + return b.AddUnaryOp(TKernelRequestBuilder::EUnaryOp::Abs, blockType, blockType); + }); + } } Y_UNIT_TEST(TestCoalesece) { From acb38f1799596c396691ba6b6c946708526d0265 Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Thu, 25 Jan 2024 16:48:34 +0100 Subject: [PATCH 4/4] Replace boolean null policy on target enum. --- .../invoke_builtins/mkql_builtins_abs.cpp | 2 +- .../invoke_builtins/mkql_builtins_add.cpp | 2 +- .../invoke_builtins/mkql_builtins_div.cpp | 4 +- .../invoke_builtins/mkql_builtins_equals.cpp | 4 +- .../invoke_builtins/mkql_builtins_greater.cpp | 4 +- .../mkql_builtins_greater_or_equal.cpp | 4 +- .../invoke_builtins/mkql_builtins_impl.h.txt | 55 ++++++++++++++----- .../invoke_builtins/mkql_builtins_less.cpp | 4 +- .../mkql_builtins_less_or_equal.cpp | 4 +- .../invoke_builtins/mkql_builtins_minus.cpp | 2 +- .../invoke_builtins/mkql_builtins_mod.cpp | 4 +- .../invoke_builtins/mkql_builtins_mul.cpp | 2 +- .../mkql_builtins_not_equals.cpp | 4 +- .../invoke_builtins/mkql_builtins_sub.cpp | 2 +- 14 files changed, 62 insertions(+), 35 deletions(-) diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_abs.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_abs.cpp index 7f28c3672076..d81878aa0983 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_abs.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_abs.cpp @@ -23,7 +23,7 @@ inline T Abs(T v) { template struct TAbs : public TSimpleArithmeticUnary> { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; static TOutput Do(TInput val) { diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_add.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_add.cpp index 575ba9c2456b..2c23fedd681c 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_add.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_add.cpp @@ -11,7 +11,7 @@ namespace { template struct TAdd : public TSimpleArithmeticBinary> { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; static TOutput Do(TOutput left, TOutput right) { diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_div.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_div.cpp index 60d4a4625d84..baea609b5e93 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_div.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_div.cpp @@ -12,7 +12,7 @@ template struct TDiv : public TSimpleArithmeticBinary> { static_assert(std::is_floating_point::value, "expected floating point"); - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; static TOutput Do(TOutput left, TOutput right) { @@ -31,7 +31,7 @@ template struct TIntegralDiv { static_assert(std::is_integral::value, "integral type expected"); - static constexpr bool DefaultNulls = false; + static constexpr auto NullMode = TKernel::ENullMode::AlwaysNull; static NUdf::TUnboxedValuePod Execute(const NUdf::TUnboxedValuePod& left, const NUdf::TUnboxedValuePod& right) { diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_equals.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_equals.cpp index 806f9152b6b6..08695d6ca241 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_equals.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_equals.cpp @@ -162,7 +162,7 @@ struct TEqualsOp; template struct TEqualsOp : public TEquals { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; }; template @@ -190,7 +190,7 @@ struct TDiffDateEqualsOp; template struct TDiffDateEqualsOp> : public TDiffDateEquals { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; }; template diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_greater.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_greater.cpp index 95bf8db40c72..4177e1c9f6ae 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_greater.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_greater.cpp @@ -155,7 +155,7 @@ struct TGreaterOp; template struct TGreaterOp : public TGreater { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; }; template @@ -183,7 +183,7 @@ struct TDiffDateGreaterOp; template struct TDiffDateGreaterOp> : public TDiffDateGreater { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; }; template diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_greater_or_equal.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_greater_or_equal.cpp index 26b29e75f0e1..b1adc30bdfe6 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_greater_or_equal.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_greater_or_equal.cpp @@ -155,7 +155,7 @@ struct TGreaterOrEqualOp; template struct TGreaterOrEqualOp : public TGreaterOrEqual { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; }; template @@ -183,7 +183,7 @@ struct TDiffDateGreaterOrEqualOp; template struct TDiffDateGreaterOrEqualOp> : public TDiffDateGreaterOrEqual { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; }; template 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 16b572e0d180..566135820cd8 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 @@ -866,12 +866,12 @@ struct TBinaryKernelExecsBase { }; template + typename TFuncInstance, TKernel::ENullMode NullMode> struct TBinaryKernelExecs; template -struct TBinaryKernelExecs : TBinaryKernelExecsBase> +struct TBinaryKernelExecs : TBinaryKernelExecsBase> { static arrow::Status ExecScalarScalar(arrow::compute::KernelContext*, const arrow::compute::ExecBatch& batch, arrow::Datum* res) { MKQL_ENSURE(batch.values.size() == 2, "Expected 2 args"); @@ -948,7 +948,7 @@ struct TBinaryKernelExecs : TBin template -struct TBinaryKernelExecs : TBinaryKernelExecsBase> +struct TBinaryKernelExecs : TBinaryKernelExecsBase> { static arrow::Status ExecScalarScalar(arrow::compute::KernelContext*, const arrow::compute::ExecBatch& batch, arrow::Datum* res) { MKQL_ENSURE(batch.values.size() == 2, "Expected 2 args"); @@ -1133,9 +1133,18 @@ void AddUnaryKernel(TKernelFamilyBase& owner) { NUdf::TDataTypeId returnType = TOutput::Id; arrow::compute::ScalarKernel k({ GetPrimitiveInputArrowType() }, GetPrimitiveOutputArrowType(), &TExecs::Exec); - k.null_handling = TFuncInstance::DefaultNulls ? arrow::compute::NullHandling::INTERSECTION : arrow::compute::NullHandling::COMPUTED_PREALLOCATE; - const auto nullMode = TFuncInstance::DefaultNulls ? TKernel::ENullMode::Default : TKernel::ENullMode::AlwaysNull; - owner.Adopt(argTypes, returnType, std::make_unique(owner, argTypes, returnType, k, nullMode)); + switch (TFuncInstance::NullMode) { + case TKernel::ENullMode::Default: + k.null_handling = arrow::compute::NullHandling::INTERSECTION; + break; + case TKernel::ENullMode::AlwaysNull: + k.null_handling = arrow::compute::NullHandling::COMPUTED_PREALLOCATE; + break; + case TKernel::ENullMode::AlwaysNotNull: + k.null_handling = arrow::compute::NullHandling::OUTPUT_NOT_NULL; + break; + } + owner.Adopt(argTypes, returnType, std::make_unique(owner, argTypes, returnType, k, TFuncInstance::NullMode)); } template; - using TExecs = TBinaryKernelExecs; + using TExecs = TBinaryKernelExecs; std::vector argTypes({ TInput1::Id, TInput2::Id }); NUdf::TDataTypeId returnType = TOutput::Id; arrow::compute::ScalarKernel k({ GetPrimitiveInputArrowType(), GetPrimitiveInputArrowType() }, GetPrimitiveOutputArrowType(), &TExecs::Exec); - k.null_handling = TFuncInstance::DefaultNulls ? arrow::compute::NullHandling::INTERSECTION : arrow::compute::NullHandling::COMPUTED_PREALLOCATE; - const auto nullMode = TFuncInstance::DefaultNulls ? TKernel::ENullMode::Default : TKernel::ENullMode::AlwaysNull; - owner.Adopt(argTypes, returnType, std::make_unique(owner, argTypes, returnType, k, nullMode)); + switch (TFuncInstance::NullMode) { + case TKernel::ENullMode::Default: + k.null_handling = arrow::compute::NullHandling::INTERSECTION; + break; + case TKernel::ENullMode::AlwaysNull: + k.null_handling = arrow::compute::NullHandling::COMPUTED_PREALLOCATE; + break; + case TKernel::ENullMode::AlwaysNotNull: + k.null_handling = arrow::compute::NullHandling::OUTPUT_NOT_NULL; + break; + } + owner.Adopt(argTypes, returnType, std::make_unique(owner, argTypes, returnType, k, TFuncInstance::NullMode)); } template; - using TExecs = TBinaryKernelExecs; + using TExecs = TBinaryKernelExecs; std::vector argTypes({ TInput1::Id, TInput2::Id }); NUdf::TDataTypeId returnType = TOutput::Id; arrow::compute::ScalarKernel k({ GetPrimitiveInputArrowType(), GetPrimitiveInputArrowType() }, GetPrimitiveOutputArrowType(), &TExecs::Exec); - k.null_handling = TFuncInstance::DefaultNulls ? arrow::compute::NullHandling::INTERSECTION : arrow::compute::NullHandling::COMPUTED_PREALLOCATE; - const auto nullMode = TFuncInstance::DefaultNulls ? TKernel::ENullMode::Default : TKernel::ENullMode::AlwaysNull; - owner.Adopt(argTypes, returnType, std::make_unique(owner, argTypes, returnType, k, nullMode)); + switch (TFuncInstance::NullMode) { + case TKernel::ENullMode::Default: + k.null_handling = arrow::compute::NullHandling::INTERSECTION; + break; + case TKernel::ENullMode::AlwaysNull: + k.null_handling = arrow::compute::NullHandling::COMPUTED_PREALLOCATE; + break; + case TKernel::ENullMode::AlwaysNotNull: + k.null_handling = arrow::compute::NullHandling::OUTPUT_NOT_NULL; + break; + } + owner.Adopt(argTypes, returnType, std::make_unique(owner, argTypes, returnType, k, TFuncInstance::NullMode)); } template class TFunc> diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_less.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_less.cpp index 5923d93f7a0c..55cc9d2898ad 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_less.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_less.cpp @@ -155,7 +155,7 @@ struct TLessOp; template struct TLessOp : public TLess { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; }; template @@ -183,7 +183,7 @@ struct TDiffDateLessOp; template struct TDiffDateLessOp> : public TDiffDateLess { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; }; template diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_less_or_equal.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_less_or_equal.cpp index 27d5c0d7a3d0..0b2d849dee46 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_less_or_equal.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_less_or_equal.cpp @@ -155,7 +155,7 @@ struct TLessOrEqualOp; template struct TLessOrEqualOp : public TLessOrEqual { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; }; template @@ -183,7 +183,7 @@ struct TDiffDateLessOrEqualOp; template struct TDiffDateLessOrEqualOp> : public TDiffDateLessOrEqual { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; }; template diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_minus.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_minus.cpp index 920636ab9f47..738426b7269b 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_minus.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_minus.cpp @@ -7,7 +7,7 @@ namespace { template struct TMinus : public TSimpleArithmeticUnary> { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; static TOutput Do(TInput val) { diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mod.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mod.cpp index ee5857101b7b..18e696f6c23d 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mod.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mod.cpp @@ -11,7 +11,7 @@ template struct TMod : public TSimpleArithmeticBinary> { static_assert(std::is_floating_point::value, "expected floating point"); - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; static TOutput Do(TOutput left, TOutput right) { @@ -32,7 +32,7 @@ template struct TIntegralMod { static_assert(std::is_integral::value, "integral type expected"); - static constexpr bool DefaultNulls = false; + static constexpr auto NullMode = TKernel::ENullMode::AlwaysNull; static NUdf::TUnboxedValuePod Execute(const NUdf::TUnboxedValuePod& left, const NUdf::TUnboxedValuePod& right) { diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mul.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mul.cpp index cf772c8c7436..6872bed7c124 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mul.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_mul.cpp @@ -10,7 +10,7 @@ namespace { template struct TMul : public TSimpleArithmeticBinary> { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; static TOutput Do(TOutput left, TOutput right) { diff --git a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_not_equals.cpp b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_not_equals.cpp index 7cd305b76e8f..e12df3143a15 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_not_equals.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_not_equals.cpp @@ -162,7 +162,7 @@ struct TNotEqualsOp; template struct TNotEqualsOp : public TNotEquals { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; }; template @@ -190,7 +190,7 @@ struct TDiffDateNotEqualsOp; template struct TDiffDateNotEqualsOp> : public TDiffDateNotEquals { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; }; template 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 546c11921b25..95f2c8cf13ca 100644 --- a/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_sub.cpp +++ b/ydb/library/yql/minikql/invoke_builtins/mkql_builtins_sub.cpp @@ -11,7 +11,7 @@ namespace { template struct TSub : public TSimpleArithmeticBinary> { - static constexpr bool DefaultNulls = true; + static constexpr auto NullMode = TKernel::ENullMode::Default; static TOutput Do(TOutput left, TOutput right) {