mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-10 09:32:06 +00:00
Merge pull request #52758 from ClickHouse/nullable-num-intdiv
Add modulo, intDiv, intDivOrZero for tuple
This commit is contained in:
commit
4953208adc
@ -755,6 +755,9 @@ class FunctionBinaryArithmetic : public IFunction
|
|||||||
static constexpr bool is_multiply = IsOperation<Op>::multiply;
|
static constexpr bool is_multiply = IsOperation<Op>::multiply;
|
||||||
static constexpr bool is_division = IsOperation<Op>::division;
|
static constexpr bool is_division = IsOperation<Op>::division;
|
||||||
static constexpr bool is_bit_hamming_distance = IsOperation<Op>::bit_hamming_distance;
|
static constexpr bool is_bit_hamming_distance = IsOperation<Op>::bit_hamming_distance;
|
||||||
|
static constexpr bool is_modulo = IsOperation<Op>::modulo;
|
||||||
|
static constexpr bool is_div_int = IsOperation<Op>::div_int;
|
||||||
|
static constexpr bool is_div_int_or_zero = IsOperation<Op>::div_int_or_zero;
|
||||||
|
|
||||||
ContextPtr context;
|
ContextPtr context;
|
||||||
bool check_decimal_overflow = true;
|
bool check_decimal_overflow = true;
|
||||||
@ -964,13 +967,28 @@ class FunctionBinaryArithmetic : public IFunction
|
|||||||
"argument of numeric type cannot be first", name);
|
"argument of numeric type cannot be first", name);
|
||||||
|
|
||||||
std::string function_name;
|
std::string function_name;
|
||||||
if (is_multiply)
|
if constexpr (is_multiply)
|
||||||
{
|
{
|
||||||
function_name = "tupleMultiplyByNumber";
|
function_name = "tupleMultiplyByNumber";
|
||||||
}
|
}
|
||||||
else
|
else // is_division
|
||||||
{
|
{
|
||||||
function_name = "tupleDivideByNumber";
|
if constexpr (is_modulo)
|
||||||
|
{
|
||||||
|
function_name = "tupleModuloByNumber";
|
||||||
|
}
|
||||||
|
else if constexpr (is_div_int)
|
||||||
|
{
|
||||||
|
function_name = "tupleIntDivByNumber";
|
||||||
|
}
|
||||||
|
else if constexpr (is_div_int_or_zero)
|
||||||
|
{
|
||||||
|
function_name = "tupleIntDivOrZeroByNumber";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
function_name = "tupleDivideByNumber";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return FunctionFactory::instance().get(function_name, context);
|
return FunctionFactory::instance().get(function_name, context);
|
||||||
|
@ -60,7 +60,7 @@ struct IsOperation
|
|||||||
|
|
||||||
static constexpr bool bit_hamming_distance = IsSameOperation<Op, BitHammingDistanceImpl>::value;
|
static constexpr bool bit_hamming_distance = IsSameOperation<Op, BitHammingDistanceImpl>::value;
|
||||||
|
|
||||||
static constexpr bool division = div_floating || div_int || div_int_or_zero;
|
static constexpr bool division = div_floating || div_int || div_int_or_zero || modulo;
|
||||||
|
|
||||||
static constexpr bool allow_decimal = plus || minus || multiply || division || least || greatest;
|
static constexpr bool allow_decimal = plus || minus || multiply || division || least || greatest;
|
||||||
};
|
};
|
||||||
|
@ -23,6 +23,9 @@ struct PlusName { static constexpr auto name = "plus"; };
|
|||||||
struct MinusName { static constexpr auto name = "minus"; };
|
struct MinusName { static constexpr auto name = "minus"; };
|
||||||
struct MultiplyName { static constexpr auto name = "multiply"; };
|
struct MultiplyName { static constexpr auto name = "multiply"; };
|
||||||
struct DivideName { static constexpr auto name = "divide"; };
|
struct DivideName { static constexpr auto name = "divide"; };
|
||||||
|
struct ModuloName { static constexpr auto name = "modulo"; };
|
||||||
|
struct IntDivName { static constexpr auto name = "intDiv"; };
|
||||||
|
struct IntDivOrZeroName { static constexpr auto name = "intDivOrZero"; };
|
||||||
|
|
||||||
struct L1Label { static constexpr auto name = "1"; };
|
struct L1Label { static constexpr auto name = "1"; };
|
||||||
struct L2Label { static constexpr auto name = "2"; };
|
struct L2Label { static constexpr auto name = "2"; };
|
||||||
@ -141,6 +144,12 @@ using FunctionTupleMultiply = FunctionTupleOperator<MultiplyName>;
|
|||||||
|
|
||||||
using FunctionTupleDivide = FunctionTupleOperator<DivideName>;
|
using FunctionTupleDivide = FunctionTupleOperator<DivideName>;
|
||||||
|
|
||||||
|
using FunctionTupleModulo = FunctionTupleOperator<ModuloName>;
|
||||||
|
|
||||||
|
using FunctionTupleIntDiv = FunctionTupleOperator<IntDivName>;
|
||||||
|
|
||||||
|
using FunctionTupleIntDivOrZero = FunctionTupleOperator<IntDivOrZeroName>;
|
||||||
|
|
||||||
class FunctionTupleNegate : public ITupleFunction
|
class FunctionTupleNegate : public ITupleFunction
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -297,6 +306,12 @@ using FunctionTupleMultiplyByNumber = FunctionTupleOperatorByNumber<MultiplyName
|
|||||||
|
|
||||||
using FunctionTupleDivideByNumber = FunctionTupleOperatorByNumber<DivideName>;
|
using FunctionTupleDivideByNumber = FunctionTupleOperatorByNumber<DivideName>;
|
||||||
|
|
||||||
|
using FunctionTupleModuloByNumber = FunctionTupleOperatorByNumber<ModuloName>;
|
||||||
|
|
||||||
|
using FunctionTupleIntDivByNumber = FunctionTupleOperatorByNumber<IntDivName>;
|
||||||
|
|
||||||
|
using FunctionTupleIntDivOrZeroByNumber = FunctionTupleOperatorByNumber<IntDivOrZeroName>;
|
||||||
|
|
||||||
class FunctionDotProduct : public ITupleFunction
|
class FunctionDotProduct : public ITupleFunction
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -1563,6 +1578,9 @@ REGISTER_FUNCTION(VectorFunctions)
|
|||||||
factory.registerAlias("vectorDifference", FunctionTupleMinus::name, FunctionFactory::CaseInsensitive);
|
factory.registerAlias("vectorDifference", FunctionTupleMinus::name, FunctionFactory::CaseInsensitive);
|
||||||
factory.registerFunction<FunctionTupleMultiply>();
|
factory.registerFunction<FunctionTupleMultiply>();
|
||||||
factory.registerFunction<FunctionTupleDivide>();
|
factory.registerFunction<FunctionTupleDivide>();
|
||||||
|
factory.registerFunction<FunctionTupleModulo>();
|
||||||
|
factory.registerFunction<FunctionTupleIntDiv>();
|
||||||
|
factory.registerFunction<FunctionTupleIntDivOrZero>();
|
||||||
factory.registerFunction<FunctionTupleNegate>();
|
factory.registerFunction<FunctionTupleNegate>();
|
||||||
|
|
||||||
factory.registerFunction<FunctionAddTupleOfIntervals>(FunctionDocumentation
|
factory.registerFunction<FunctionAddTupleOfIntervals>(FunctionDocumentation
|
||||||
@ -1626,6 +1644,9 @@ If the types of the first interval (or the interval in the tuple) and the second
|
|||||||
|
|
||||||
factory.registerFunction<FunctionTupleMultiplyByNumber>();
|
factory.registerFunction<FunctionTupleMultiplyByNumber>();
|
||||||
factory.registerFunction<FunctionTupleDivideByNumber>();
|
factory.registerFunction<FunctionTupleDivideByNumber>();
|
||||||
|
factory.registerFunction<FunctionTupleModuloByNumber>();
|
||||||
|
factory.registerFunction<FunctionTupleIntDivByNumber>();
|
||||||
|
factory.registerFunction<FunctionTupleIntDivOrZeroByNumber>();
|
||||||
|
|
||||||
factory.registerFunction<TupleOrArrayFunctionDotProduct>();
|
factory.registerFunction<TupleOrArrayFunctionDotProduct>();
|
||||||
factory.registerAlias("scalarProduct", TupleOrArrayFunctionDotProduct::name, FunctionFactory::CaseInsensitive);
|
factory.registerAlias("scalarProduct", TupleOrArrayFunctionDotProduct::name, FunctionFactory::CaseInsensitive);
|
||||||
|
@ -885,7 +885,13 @@ tupleDivide
|
|||||||
tupleDivideByNumber
|
tupleDivideByNumber
|
||||||
tupleElement
|
tupleElement
|
||||||
tupleHammingDistance
|
tupleHammingDistance
|
||||||
|
tupleIntDiv
|
||||||
|
tupleIntDivByNumber
|
||||||
|
tupleIntDivOrZero
|
||||||
|
tupleIntDivOrZeroByNumber
|
||||||
tupleMinus
|
tupleMinus
|
||||||
|
tupleModulo
|
||||||
|
tupleModuloByNumber
|
||||||
tupleMultiply
|
tupleMultiply
|
||||||
tupleMultiplyByNumber
|
tupleMultiplyByNumber
|
||||||
tupleNegate
|
tupleNegate
|
||||||
|
4
tests/queries/0_stateless/02841_tuple_modulo.reference
Normal file
4
tests/queries/0_stateless/02841_tuple_modulo.reference
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
(1,0)
|
||||||
|
(2,2)
|
||||||
|
(2,2)
|
||||||
|
(0,0)
|
4
tests/queries/0_stateless/02841_tuple_modulo.sql
Normal file
4
tests/queries/0_stateless/02841_tuple_modulo.sql
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
SELECT (5,4) % 2;
|
||||||
|
SELECT intDiv((5,4), 2);
|
||||||
|
SELECT intDivOrZero((5,4), 2);
|
||||||
|
SELECT intDivOrZero((5,4), 0);
|
Loading…
Reference in New Issue
Block a user