mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 16:42:05 +00:00
Split file for better build times
This commit is contained in:
parent
067cf4cc40
commit
8dac30ae95
@ -1,10 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Core/Field.h>
|
#include <Core/Field.h>
|
||||||
#include <Core/AccurateComparison.h>
|
|
||||||
#include <common/demangle.h>
|
#include <common/demangle.h>
|
||||||
#include <IO/ReadBufferFromString.h>
|
|
||||||
#include <IO/ReadHelpers.h>
|
|
||||||
|
|
||||||
|
|
||||||
class SipHash;
|
class SipHash;
|
||||||
@ -16,7 +13,6 @@ namespace DB
|
|||||||
namespace ErrorCodes
|
namespace ErrorCodes
|
||||||
{
|
{
|
||||||
extern const int CANNOT_CONVERT_TYPE;
|
extern const int CANNOT_CONVERT_TYPE;
|
||||||
extern const int BAD_TYPE_OF_FIELD;
|
|
||||||
extern const int LOGICAL_ERROR;
|
extern const int LOGICAL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -179,130 +175,6 @@ template <> constexpr bool isDecimalField<DecimalField<Decimal64>>() { return tr
|
|||||||
template <> constexpr bool isDecimalField<DecimalField<Decimal128>>() { return true; }
|
template <> constexpr bool isDecimalField<DecimalField<Decimal128>>() { return true; }
|
||||||
|
|
||||||
|
|
||||||
/** More precise comparison, used for index.
|
|
||||||
* Differs from Field::operator< and Field::operator== in that it also compares values of different types.
|
|
||||||
* Comparison rules are same as in FunctionsComparison (to be consistent with expression evaluation in query).
|
|
||||||
*/
|
|
||||||
class FieldVisitorAccurateEquals : public StaticVisitor<bool>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
template <typename T, typename U>
|
|
||||||
bool operator() (const T & l, const U & r) const
|
|
||||||
{
|
|
||||||
if constexpr (std::is_same_v<T, Null> || std::is_same_v<U, Null>)
|
|
||||||
return std::is_same_v<T, U>;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if constexpr (std::is_same_v<T, U>)
|
|
||||||
return l == r;
|
|
||||||
|
|
||||||
if constexpr (std::is_arithmetic_v<T> && std::is_arithmetic_v<U>)
|
|
||||||
return accurate::equalsOp(l, r);
|
|
||||||
|
|
||||||
if constexpr (isDecimalField<T>() && isDecimalField<U>())
|
|
||||||
return l == r;
|
|
||||||
|
|
||||||
if constexpr (isDecimalField<T>() && std::is_arithmetic_v<U>)
|
|
||||||
return l == DecimalField<Decimal128>(r, 0);
|
|
||||||
|
|
||||||
if constexpr (std::is_arithmetic_v<T> && isDecimalField<U>())
|
|
||||||
return DecimalField<Decimal128>(l, 0) == r;
|
|
||||||
|
|
||||||
if constexpr (std::is_same_v<T, String>)
|
|
||||||
{
|
|
||||||
if constexpr (std::is_same_v<U, UInt128>)
|
|
||||||
return stringToUUID(l) == r;
|
|
||||||
|
|
||||||
if constexpr (std::is_arithmetic_v<U>)
|
|
||||||
{
|
|
||||||
ReadBufferFromString in(l);
|
|
||||||
T parsed;
|
|
||||||
readText(parsed, in);
|
|
||||||
return operator()(parsed, r);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if constexpr (std::is_same_v<U, String>)
|
|
||||||
{
|
|
||||||
if constexpr (std::is_same_v<T, UInt128>)
|
|
||||||
return l == stringToUUID(r);
|
|
||||||
|
|
||||||
if constexpr (std::is_arithmetic_v<T>)
|
|
||||||
{
|
|
||||||
ReadBufferFromString in(r);
|
|
||||||
T parsed;
|
|
||||||
readText(parsed, in);
|
|
||||||
return operator()(l, parsed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
throw Exception("Cannot compare " + demangle(typeid(T).name()) + " with " + demangle(typeid(U).name()),
|
|
||||||
ErrorCodes::BAD_TYPE_OF_FIELD);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class FieldVisitorAccurateLess : public StaticVisitor<bool>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
template <typename T, typename U>
|
|
||||||
bool operator() (const T & l, const U & r) const
|
|
||||||
{
|
|
||||||
if constexpr (std::is_same_v<T, Null> || std::is_same_v<U, Null>)
|
|
||||||
return false;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if constexpr (std::is_same_v<T, U>)
|
|
||||||
return l < r;
|
|
||||||
|
|
||||||
if constexpr (std::is_arithmetic_v<T> && std::is_arithmetic_v<U>)
|
|
||||||
return accurate::lessOp(l, r);
|
|
||||||
|
|
||||||
if constexpr (isDecimalField<T>() && isDecimalField<U>())
|
|
||||||
return l < r;
|
|
||||||
|
|
||||||
if constexpr (isDecimalField<T>() && std::is_arithmetic_v<U>)
|
|
||||||
return l < DecimalField<Decimal128>(r, 0);
|
|
||||||
|
|
||||||
if constexpr (std::is_arithmetic_v<T> && isDecimalField<U>())
|
|
||||||
return DecimalField<Decimal128>(l, 0) < r;
|
|
||||||
|
|
||||||
if constexpr (std::is_same_v<T, String>)
|
|
||||||
{
|
|
||||||
if constexpr (std::is_same_v<U, UInt128>)
|
|
||||||
return stringToUUID(l) < r;
|
|
||||||
|
|
||||||
if constexpr (std::is_arithmetic_v<U>)
|
|
||||||
{
|
|
||||||
ReadBufferFromString in(l);
|
|
||||||
T parsed;
|
|
||||||
readText(parsed, in);
|
|
||||||
return operator()(parsed, r);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if constexpr (std::is_same_v<U, String>)
|
|
||||||
{
|
|
||||||
if constexpr (std::is_same_v<T, UInt128>)
|
|
||||||
return l < stringToUUID(r);
|
|
||||||
|
|
||||||
if constexpr (std::is_arithmetic_v<T>)
|
|
||||||
{
|
|
||||||
ReadBufferFromString in(r);
|
|
||||||
T parsed;
|
|
||||||
readText(parsed, in);
|
|
||||||
return operator()(l, parsed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
throw Exception("Cannot compare " + demangle(typeid(T).name()) + " with " + demangle(typeid(U).name()),
|
|
||||||
ErrorCodes::BAD_TYPE_OF_FIELD);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/** Implements `+=` operation.
|
/** Implements `+=` operation.
|
||||||
* Returns false if the result is zero.
|
* Returns false if the result is zero.
|
||||||
*/
|
*/
|
||||||
|
142
src/Common/FieldVisitorsAccurateComparison.h
Normal file
142
src/Common/FieldVisitorsAccurateComparison.h
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Core/Field.h>
|
||||||
|
#include <Core/AccurateComparison.h>
|
||||||
|
#include <common/demangle.h>
|
||||||
|
#include <Common/FieldVisitors.h>
|
||||||
|
#include <IO/ReadBufferFromString.h>
|
||||||
|
#include <IO/ReadHelpers.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace DB
|
||||||
|
{
|
||||||
|
|
||||||
|
namespace ErrorCodes
|
||||||
|
{
|
||||||
|
extern const int BAD_TYPE_OF_FIELD;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** More precise comparison, used for index.
|
||||||
|
* Differs from Field::operator< and Field::operator== in that it also compares values of different types.
|
||||||
|
* Comparison rules are same as in FunctionsComparison (to be consistent with expression evaluation in query).
|
||||||
|
*/
|
||||||
|
class FieldVisitorAccurateEquals : public StaticVisitor<bool>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template <typename T, typename U>
|
||||||
|
bool operator() (const T & l, const U & r) const
|
||||||
|
{
|
||||||
|
if constexpr (std::is_same_v<T, Null> || std::is_same_v<U, Null>)
|
||||||
|
return std::is_same_v<T, U>;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if constexpr (std::is_same_v<T, U>)
|
||||||
|
return l == r;
|
||||||
|
|
||||||
|
if constexpr (std::is_arithmetic_v<T> && std::is_arithmetic_v<U>)
|
||||||
|
return accurate::equalsOp(l, r);
|
||||||
|
|
||||||
|
if constexpr (isDecimalField<T>() && isDecimalField<U>())
|
||||||
|
return l == r;
|
||||||
|
|
||||||
|
if constexpr (isDecimalField<T>() && std::is_arithmetic_v<U>)
|
||||||
|
return l == DecimalField<Decimal128>(r, 0);
|
||||||
|
|
||||||
|
if constexpr (std::is_arithmetic_v<T> && isDecimalField<U>())
|
||||||
|
return DecimalField<Decimal128>(l, 0) == r;
|
||||||
|
|
||||||
|
if constexpr (std::is_same_v<T, String>)
|
||||||
|
{
|
||||||
|
if constexpr (std::is_same_v<U, UInt128>)
|
||||||
|
return stringToUUID(l) == r;
|
||||||
|
|
||||||
|
if constexpr (std::is_arithmetic_v<U>)
|
||||||
|
{
|
||||||
|
ReadBufferFromString in(l);
|
||||||
|
T parsed;
|
||||||
|
readText(parsed, in);
|
||||||
|
return operator()(parsed, r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if constexpr (std::is_same_v<U, String>)
|
||||||
|
{
|
||||||
|
if constexpr (std::is_same_v<T, UInt128>)
|
||||||
|
return l == stringToUUID(r);
|
||||||
|
|
||||||
|
if constexpr (std::is_arithmetic_v<T>)
|
||||||
|
{
|
||||||
|
ReadBufferFromString in(r);
|
||||||
|
T parsed;
|
||||||
|
readText(parsed, in);
|
||||||
|
return operator()(l, parsed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw Exception("Cannot compare " + demangle(typeid(T).name()) + " with " + demangle(typeid(U).name()),
|
||||||
|
ErrorCodes::BAD_TYPE_OF_FIELD);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class FieldVisitorAccurateLess : public StaticVisitor<bool>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
template <typename T, typename U>
|
||||||
|
bool operator() (const T & l, const U & r) const
|
||||||
|
{
|
||||||
|
if constexpr (std::is_same_v<T, Null> || std::is_same_v<U, Null>)
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if constexpr (std::is_same_v<T, U>)
|
||||||
|
return l < r;
|
||||||
|
|
||||||
|
if constexpr (std::is_arithmetic_v<T> && std::is_arithmetic_v<U>)
|
||||||
|
return accurate::lessOp(l, r);
|
||||||
|
|
||||||
|
if constexpr (isDecimalField<T>() && isDecimalField<U>())
|
||||||
|
return l < r;
|
||||||
|
|
||||||
|
if constexpr (isDecimalField<T>() && std::is_arithmetic_v<U>)
|
||||||
|
return l < DecimalField<Decimal128>(r, 0);
|
||||||
|
|
||||||
|
if constexpr (std::is_arithmetic_v<T> && isDecimalField<U>())
|
||||||
|
return DecimalField<Decimal128>(l, 0) < r;
|
||||||
|
|
||||||
|
if constexpr (std::is_same_v<T, String>)
|
||||||
|
{
|
||||||
|
if constexpr (std::is_same_v<U, UInt128>)
|
||||||
|
return stringToUUID(l) < r;
|
||||||
|
|
||||||
|
if constexpr (std::is_arithmetic_v<U>)
|
||||||
|
{
|
||||||
|
ReadBufferFromString in(l);
|
||||||
|
T parsed;
|
||||||
|
readText(parsed, in);
|
||||||
|
return operator()(parsed, r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if constexpr (std::is_same_v<U, String>)
|
||||||
|
{
|
||||||
|
if constexpr (std::is_same_v<T, UInt128>)
|
||||||
|
return l < stringToUUID(r);
|
||||||
|
|
||||||
|
if constexpr (std::is_arithmetic_v<T>)
|
||||||
|
{
|
||||||
|
ReadBufferFromString in(r);
|
||||||
|
T parsed;
|
||||||
|
readText(parsed, in);
|
||||||
|
return operator()(l, parsed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw Exception("Cannot compare " + demangle(typeid(T).name()) + " with " + demangle(typeid(U).name()),
|
||||||
|
ErrorCodes::BAD_TYPE_OF_FIELD);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
@ -9,7 +9,7 @@
|
|||||||
#include <Columns/ColumnFixedString.h>
|
#include <Columns/ColumnFixedString.h>
|
||||||
#include <Columns/ColumnsNumber.h>
|
#include <Columns/ColumnsNumber.h>
|
||||||
#include <Columns/ColumnNullable.h>
|
#include <Columns/ColumnNullable.h>
|
||||||
#include <Common/FieldVisitors.h>
|
#include <Common/FieldVisitorsAccurateComparison.h>
|
||||||
#include <Common/memcmpSmall.h>
|
#include <Common/memcmpSmall.h>
|
||||||
#include <Common/assert_cast.h>
|
#include <Common/assert_cast.h>
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
#include <Interpreters/FillingRow.h>
|
#include <Interpreters/FillingRow.h>
|
||||||
|
#include <Common/FieldVisitorsAccurateComparison.h>
|
||||||
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <Core/SortDescription.h>
|
#include <Core/SortDescription.h>
|
||||||
#include <Columns/IColumn.h>
|
#include <Columns/IColumn.h>
|
||||||
#include <Common/FieldVisitors.h>
|
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
#include <Core/Field.h>
|
#include <Core/Field.h>
|
||||||
#include <Core/Types.h>
|
#include <Core/Types.h>
|
||||||
#include <Columns/Collator.h>
|
#include <Columns/Collator.h>
|
||||||
#include <Common/FieldVisitors.h>
|
#include <Common/FieldVisitorsAccurateComparison.h>
|
||||||
#include <Common/typeid_cast.h>
|
#include <Common/typeid_cast.h>
|
||||||
#include <Common/checkStackSize.h>
|
#include <Common/checkStackSize.h>
|
||||||
#include <ext/map.h>
|
#include <ext/map.h>
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include <Interpreters/misc.h>
|
#include <Interpreters/misc.h>
|
||||||
#include <Functions/FunctionFactory.h>
|
#include <Functions/FunctionFactory.h>
|
||||||
#include <Functions/IFunction.h>
|
#include <Functions/IFunction.h>
|
||||||
#include <Common/FieldVisitors.h>
|
#include <Common/FieldVisitorsAccurateComparison.h>
|
||||||
#include <Common/typeid_cast.h>
|
#include <Common/typeid_cast.h>
|
||||||
#include <Interpreters/convertFieldToType.h>
|
#include <Interpreters/convertFieldToType.h>
|
||||||
#include <Interpreters/Set.h>
|
#include <Interpreters/Set.h>
|
||||||
|
Loading…
Reference in New Issue
Block a user