未验证 提交 8b4e5846 编写于 作者: A alexey-milovidov 提交者: GitHub

Merge pull request #3366 from 4ertus2/decimal

Conditional for UUID [CLICKHOUSE-4016]
#pragma once #pragma once
#include <Core/Types.h>
#include <type_traits> #include <type_traits>
#include <Core/Types.h>
#include <Common/UInt128.h>
namespace DB namespace DB
{ {
...@@ -146,6 +148,7 @@ template <typename A> struct ResultOfBitNot ...@@ -146,6 +148,7 @@ template <typename A> struct ResultOfBitNot
* UInt<x>, Int<y> -> Int<max(x*2, y)> * UInt<x>, Int<y> -> Int<max(x*2, y)>
* Float<x>, [U]Int<y> -> Float<max(x, y*2)> * Float<x>, [U]Int<y> -> Float<max(x, y*2)>
* Decimal<x>, Decimal<y> -> Decimal<max(x,y)> * Decimal<x>, Decimal<y> -> Decimal<max(x,y)>
* UUID, UUID -> UUID
* UInt64 , Int<x> -> Error * UInt64 , Int<x> -> Error
* Float<x>, [U]Int64 -> Error * Float<x>, [U]Int64 -> Error
*/ */
...@@ -168,7 +171,9 @@ struct ResultOfIf ...@@ -168,7 +171,9 @@ struct ResultOfIf
? max(sizeof(A), sizeof(B)) * 2 ? max(sizeof(A), sizeof(B)) * 2
: max(sizeof(A), sizeof(B))>::Type; : max(sizeof(A), sizeof(B))>::Type;
using Type = std::conditional_t<!IsDecimalNumber<A> && !IsDecimalNumber<B>, ConstructedType, using ConstructedWithUUID = std::conditional_t<std::is_same_v<A, UInt128> && std::is_same_v<B, UInt128>, A, ConstructedType>;
using Type = std::conditional_t<!IsDecimalNumber<A> && !IsDecimalNumber<B>, ConstructedWithUUID,
std::conditional_t<IsDecimalNumber<A> && IsDecimalNumber<B>, std::conditional_t<(sizeof(A) > sizeof(B)), A, B>, Error>>; std::conditional_t<IsDecimalNumber<A> && IsDecimalNumber<B>, std::conditional_t<(sizeof(A) > sizeof(B)), A, B>, Error>>;
}; };
......
...@@ -230,6 +230,11 @@ public: ...@@ -230,6 +230,11 @@ public:
static FunctionPtr create(const Context &) { return std::make_shared<FunctionIf>(); } static FunctionPtr create(const Context &) { return std::make_shared<FunctionIf>(); }
private: private:
template <typename T0, typename T1>
static constexpr bool allow_arrays =
!IsDecimalNumber<T0> && !IsDecimalNumber<T1> &&
!std::is_same_v<T0, UInt128> && !std::is_same_v<T1, UInt128>;
template <typename T0, typename T1> template <typename T0, typename T1>
static UInt32 decimalScale(Block & block [[maybe_unused]], const ColumnNumbers & arguments [[maybe_unused]]) static UInt32 decimalScale(Block & block [[maybe_unused]], const ColumnNumbers & arguments [[maybe_unused]])
{ {
...@@ -314,7 +319,7 @@ private: ...@@ -314,7 +319,7 @@ private:
{ {
if constexpr (std::is_same_v<NumberTraits::Error, typename NumberTraits::ResultOfIf<T0, T1>::Type>) if constexpr (std::is_same_v<NumberTraits::Error, typename NumberTraits::ResultOfIf<T0, T1>::Type>)
return false; return false;
else if constexpr (!IsDecimalNumber<T0> && !IsDecimalNumber<T1>) else if constexpr (allow_arrays<T0, T1>)
{ {
using ResultType = typename NumberTraits::ResultOfIf<T0, T1>::Type; using ResultType = typename NumberTraits::ResultOfIf<T0, T1>::Type;
...@@ -370,7 +375,7 @@ private: ...@@ -370,7 +375,7 @@ private:
{ {
if constexpr (std::is_same_v<NumberTraits::Error, typename NumberTraits::ResultOfIf<T0, T1>::Type>) if constexpr (std::is_same_v<NumberTraits::Error, typename NumberTraits::ResultOfIf<T0, T1>::Type>)
return false; return false;
else if constexpr (!IsDecimalNumber<T0> && !IsDecimalNumber<T1>) else if constexpr (allow_arrays<T0, T1>)
{ {
using ResultType = typename NumberTraits::ResultOfIf<T0, T1>::Type; using ResultType = typename NumberTraits::ResultOfIf<T0, T1>::Type;
...@@ -978,6 +983,7 @@ public: ...@@ -978,6 +983,7 @@ public:
bool executed_with_nums = callOnBasicTypes<true, true, true, true>(left_id, right_id, call); bool executed_with_nums = callOnBasicTypes<true, true, true, true>(left_id, right_id, call);
if (!( executed_with_nums if (!( executed_with_nums
|| executeTyped<UInt128, UInt128>(cond_col, block, arguments, result, input_rows_count)
|| executeString(cond_col, block, arguments, result) || executeString(cond_col, block, arguments, result)
|| executeGenericArray(cond_col, block, arguments, result) || executeGenericArray(cond_col, block, arguments, result)
|| executeTuple(block, arguments, result, input_rows_count))) || executeTuple(block, arguments, result, input_rows_count)))
......
value vs value
0 1 1 Int8 Int8 Int8
0 1 1 Int8 Int16 Int16
0 1 1 Int8 Int32 Int32
0 1 1 Int8 Int64 Int64
0 1 1 Int8 UInt8 Int16
0 1 1 Int8 UInt16 Int32
0 1 1 Int8 UInt32 Int64
0 1 1 Int8 Float32 Float32
0 1 1 Int8 Float64 Float64
0 1 1 Int16 Int8 Int16
0 1 1 Int16 Int16 Int16
0 1 1 Int16 Int32 Int32
0 1 1 Int16 Int64 Int64
0 1 1 Int16 UInt8 Int16
0 1 1 Int16 UInt16 Int32
0 1 1 Int16 UInt32 Int64
0 1 1 Int16 Float32 Float32
0 1 1 Int16 Float64 Float64
0 1 1 Int32 Int8 Int32
0 1 1 Int32 Int16 Int32
0 1 1 Int32 Int32 Int32
0 1 1 Int32 Int64 Int64
0 1 1 Int32 UInt8 Int32
0 1 1 Int32 UInt16 Int32
0 1 1 Int32 UInt32 Int64
0 1 1 Int32 Float32 Float64
0 1 1 Int32 Float64 Float64
0 1 1 Int64 Int8 Int64
0 1 1 Int64 Int16 Int64
0 1 1 Int64 Int32 Int64
0 1 1 Int64 Int64 Int64
0 1 1 Int64 UInt8 Int64
0 1 1 Int64 UInt16 Int64
0 1 1 Int64 UInt32 Int64
0 1 1 UInt8 Int8 Int16
0 1 1 UInt8 Int16 Int16
0 1 1 UInt8 Int32 Int32
0 1 1 UInt8 Int64 Int64
0 1 1 UInt8 UInt8 UInt8
0 1 1 UInt8 UInt16 UInt16
0 1 1 UInt8 UInt32 UInt32
0 1 1 UInt8 UInt64 UInt64
0 1 1 UInt8 Float32 Float32
0 1 1 UInt8 Float64 Float64
0 1 1 UInt16 Int8 Int32
0 1 1 UInt16 Int16 Int32
0 1 1 UInt16 Int32 Int32
0 1 1 UInt16 Int64 Int64
0 1 1 UInt16 UInt8 UInt16
0 1 1 UInt16 UInt16 UInt16
0 1 1 UInt16 UInt32 UInt32
0 1 1 UInt16 UInt64 UInt64
0 1 1 UInt16 Float32 Float32
0 1 1 UInt16 Float64 Float64
0 1 1 UInt32 Int8 Int64
0 1 1 UInt32 Int16 Int64
0 1 1 UInt32 Int32 Int64
0 1 1 UInt32 Int64 Int64
0 1 1 UInt32 UInt8 UInt32
0 1 1 UInt32 UInt16 UInt32
0 1 1 UInt32 UInt32 UInt32
0 1 1 UInt32 UInt64 UInt64
0 1 1 UInt32 Float32 Float64
0 1 1 UInt32 Float64 Float64
0 1 1 UInt64 UInt8 UInt64
0 1 1 UInt64 UInt16 UInt64
0 1 1 UInt64 UInt32 UInt64
0 1 1 UInt64 UInt64 UInt64
0000-00-00 1970-01-02 1970-01-02 Date Date Date
0000-00-00 1970-01-01 03:00:01 1970-01-01 03:00:01 Date DateTime DateTime
0000-00-00 00:00:00 1970-01-02 1970-01-01 03:00:01 DateTime Date DateTime
0000-00-00 00:00:00 1970-01-01 03:00:01 1970-01-01 03:00:01 DateTime DateTime DateTime
00000000-0000-0000-0000-000000000000 00000000-0000-0001-0000-000000000000 00000000-0000-0001-0000-000000000000 UUID UUID UUID
column vs value
0 1 1 Int8 Int8 Int8
0 1 1 Int8 Int16 Int16
0 1 1 Int8 Int32 Int32
0 1 1 Int8 Int64 Int64
0 1 1 Int8 UInt8 Int16
0 1 1 Int8 UInt16 Int32
0 1 1 Int8 UInt32 Int64
0 1 1 Int8 Float32 Float32
0 1 1 Int8 Float64 Float64
0 1 1 Int16 Int8 Int16
0 1 1 Int16 Int16 Int16
0 1 1 Int16 Int32 Int32
0 1 1 Int16 Int64 Int64
0 1 1 Int16 UInt8 Int16
0 1 1 Int16 UInt16 Int32
0 1 1 Int16 UInt32 Int64
0 1 1 Int16 Float32 Float32
0 1 1 Int16 Float64 Float64
0 1 1 Int32 Int8 Int32
0 1 1 Int32 Int16 Int32
0 1 1 Int32 Int32 Int32
0 1 1 Int32 Int64 Int64
0 1 1 Int32 UInt8 Int32
0 1 1 Int32 UInt16 Int32
0 1 1 Int32 UInt32 Int64
0 1 1 Int32 Float32 Float64
0 1 1 Int32 Float64 Float64
0 1 1 Int64 Int8 Int64
0 1 1 Int64 Int16 Int64
0 1 1 Int64 Int32 Int64
0 1 1 Int64 Int64 Int64
0 1 1 Int64 UInt8 Int64
0 1 1 Int64 UInt16 Int64
0 1 1 Int64 UInt32 Int64
0 1 1 UInt8 Int8 Int16
0 1 1 UInt8 Int16 Int16
0 1 1 UInt8 Int32 Int32
0 1 1 UInt8 Int64 Int64
0 1 1 UInt8 UInt8 UInt8
0 1 1 UInt8 UInt16 UInt16
0 1 1 UInt8 UInt32 UInt32
0 1 1 UInt8 UInt64 UInt64
0 1 1 UInt8 Float32 Float32
0 1 1 UInt8 Float64 Float64
0 1 1 UInt16 Int8 Int32
0 1 1 UInt16 Int16 Int32
0 1 1 UInt16 Int32 Int32
0 1 1 UInt16 Int64 Int64
0 1 1 UInt16 UInt8 UInt16
0 1 1 UInt16 UInt16 UInt16
0 1 1 UInt16 UInt32 UInt32
0 1 1 UInt16 UInt64 UInt64
0 1 1 UInt16 Float32 Float32
0 1 1 UInt16 Float64 Float64
0 1 1 UInt32 Int8 Int64
0 1 1 UInt32 Int16 Int64
0 1 1 UInt32 Int32 Int64
0 1 1 UInt32 Int64 Int64
0 1 1 UInt32 UInt8 UInt32
0 1 1 UInt32 UInt16 UInt32
0 1 1 UInt32 UInt32 UInt32
0 1 1 UInt32 UInt64 UInt64
0 1 1 UInt32 Float32 Float64
0 1 1 UInt32 Float64 Float64
0 1 1 UInt64 UInt8 UInt64
0 1 1 UInt64 UInt16 UInt64
0 1 1 UInt64 UInt32 UInt64
0 1 1 UInt64 UInt64 UInt64
0000-00-00 1970-01-02 1970-01-02 Date Date Date
0000-00-00 1970-01-01 03:00:01 1970-01-01 03:00:01 Date DateTime DateTime
0000-00-00 00:00:00 1970-01-02 1970-01-01 03:00:01 DateTime Date DateTime
0000-00-00 00:00:00 1970-01-01 03:00:01 1970-01-01 03:00:01 DateTime DateTime DateTime
00000000-0000-0000-0000-000000000000 00000000-0000-0001-0000-000000000000 00000000-0000-0001-0000-000000000000 UUID UUID UUID
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册