mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-17 13:13:36 +00:00
Better nullable primary key implementation.
This commit is contained in:
parent
703101fe4d
commit
f2374a6916
@ -459,8 +459,6 @@ public:
|
||||
explicit FieldVisitorMax(const Field & rhs_) : rhs(rhs_) {}
|
||||
|
||||
bool operator() (Null &) const { throw Exception("Cannot compare Nulls", ErrorCodes::LOGICAL_ERROR); }
|
||||
bool operator() (NegativeInfinity &) const { throw Exception("Cannot compare -Inf", ErrorCodes::LOGICAL_ERROR); }
|
||||
bool operator() (PositiveInfinity &) const { throw Exception("Cannot compare +Inf", ErrorCodes::LOGICAL_ERROR); }
|
||||
bool operator() (AggregateFunctionStateData &) const { throw Exception("Cannot compare AggregateFunctionStates", ErrorCodes::LOGICAL_ERROR); }
|
||||
|
||||
bool operator() (Array & x) const { return compareImpl<Array>(x); }
|
||||
@ -496,8 +494,6 @@ public:
|
||||
explicit FieldVisitorMin(const Field & rhs_) : rhs(rhs_) {}
|
||||
|
||||
bool operator() (Null &) const { throw Exception("Cannot compare Nulls", ErrorCodes::LOGICAL_ERROR); }
|
||||
bool operator() (NegativeInfinity &) const { throw Exception("Cannot compare -Inf", ErrorCodes::LOGICAL_ERROR); }
|
||||
bool operator() (PositiveInfinity &) const { throw Exception("Cannot compare +Inf", ErrorCodes::LOGICAL_ERROR); }
|
||||
bool operator() (AggregateFunctionStateData &) const { throw Exception("Cannot sum AggregateFunctionStates", ErrorCodes::LOGICAL_ERROR); }
|
||||
|
||||
bool operator() (Array & x) const { return compareImpl<Array>(x); }
|
||||
|
@ -577,15 +577,15 @@ void getExtremesWithNulls(const IColumn & nested_column, const NullMap & null_ar
|
||||
}
|
||||
else if (number_of_nulls == n)
|
||||
{
|
||||
min = PositiveInfinity();
|
||||
max = PositiveInfinity();
|
||||
min = POSITIVE_INFINITY;
|
||||
max = POSITIVE_INFINITY;
|
||||
}
|
||||
else
|
||||
{
|
||||
auto filtered_column = nested_column.filter(not_null_array, -1);
|
||||
filtered_column->getExtremes(min, max);
|
||||
if (null_last)
|
||||
max = PositiveInfinity();
|
||||
max = POSITIVE_INFINITY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,16 +26,6 @@ public:
|
||||
throw Exception("Cannot convert NULL to " + demangle(typeid(T).name()), ErrorCodes::CANNOT_CONVERT_TYPE);
|
||||
}
|
||||
|
||||
T operator() (const NegativeInfinity &) const
|
||||
{
|
||||
throw Exception("Cannot convert -Inf to " + demangle(typeid(T).name()), ErrorCodes::CANNOT_CONVERT_TYPE);
|
||||
}
|
||||
|
||||
T operator() (const PositiveInfinity &) const
|
||||
{
|
||||
throw Exception("Cannot convert +Inf to " + demangle(typeid(T).name()), ErrorCodes::CANNOT_CONVERT_TYPE);
|
||||
}
|
||||
|
||||
T operator() (const String &) const
|
||||
{
|
||||
throw Exception("Cannot convert String to " + demangle(typeid(T).name()), ErrorCodes::CANNOT_CONVERT_TYPE);
|
||||
|
@ -24,9 +24,7 @@ static inline void writeQuoted(const DecimalField<T> & x, WriteBuffer & buf)
|
||||
writeChar('\'', buf);
|
||||
}
|
||||
|
||||
String FieldVisitorDump::operator() (const Null &) const { return "NULL"; }
|
||||
String FieldVisitorDump::operator() (const NegativeInfinity &) const { return "-Inf"; }
|
||||
String FieldVisitorDump::operator() (const PositiveInfinity &) const { return "+Inf"; }
|
||||
String FieldVisitorDump::operator() (const Null & x) const { return x.is_negative_infinity ? "-Inf" : (x.is_positive_infinity ? "+Inf" : "NULL"); }
|
||||
String FieldVisitorDump::operator() (const UInt64 & x) const { return formatQuotedWithPrefix(x, "UInt64_"); }
|
||||
String FieldVisitorDump::operator() (const Int64 & x) const { return formatQuotedWithPrefix(x, "Int64_"); }
|
||||
String FieldVisitorDump::operator() (const Float64 & x) const { return formatQuotedWithPrefix(x, "Float64_"); }
|
||||
|
@ -10,8 +10,6 @@ class FieldVisitorDump : public StaticVisitor<String>
|
||||
{
|
||||
public:
|
||||
String operator() (const Null & x) const;
|
||||
String operator() (const NegativeInfinity & x) const;
|
||||
String operator() (const PositiveInfinity & x) const;
|
||||
String operator() (const UInt64 & x) const;
|
||||
String operator() (const UInt128 & x) const;
|
||||
String operator() (const UInt256 & x) const;
|
||||
|
@ -14,18 +14,6 @@ void FieldVisitorHash::operator() (const Null &) const
|
||||
hash.update(type);
|
||||
}
|
||||
|
||||
void FieldVisitorHash::operator() (const NegativeInfinity &) const
|
||||
{
|
||||
UInt8 type = Field::Types::NegativeInfinity;
|
||||
hash.update(type);
|
||||
}
|
||||
|
||||
void FieldVisitorHash::operator() (const PositiveInfinity &) const
|
||||
{
|
||||
UInt8 type = Field::Types::PositiveInfinity;
|
||||
hash.update(type);
|
||||
}
|
||||
|
||||
void FieldVisitorHash::operator() (const UInt64 & x) const
|
||||
{
|
||||
UInt8 type = Field::Types::UInt64;
|
||||
|
@ -16,8 +16,6 @@ public:
|
||||
FieldVisitorHash(SipHash & hash_);
|
||||
|
||||
void operator() (const Null & x) const;
|
||||
void operator() (const NegativeInfinity & x) const;
|
||||
void operator() (const PositiveInfinity & x) const;
|
||||
void operator() (const UInt64 & x) const;
|
||||
void operator() (const UInt128 & x) const;
|
||||
void operator() (const UInt256 & x) const;
|
||||
|
@ -22,8 +22,6 @@ bool FieldVisitorSum::operator() (UInt64 & x) const
|
||||
bool FieldVisitorSum::operator() (Float64 & x) const { x += get<Float64>(rhs); return x != 0; }
|
||||
|
||||
bool FieldVisitorSum::operator() (Null &) const { throw Exception("Cannot sum Nulls", ErrorCodes::LOGICAL_ERROR); }
|
||||
bool FieldVisitorSum::operator() (NegativeInfinity &) const { throw Exception("Cannot sum -Inf", ErrorCodes::LOGICAL_ERROR); }
|
||||
bool FieldVisitorSum::operator() (PositiveInfinity &) const { throw Exception("Cannot sum +Inf", ErrorCodes::LOGICAL_ERROR); }
|
||||
bool FieldVisitorSum::operator() (String &) const { throw Exception("Cannot sum Strings", ErrorCodes::LOGICAL_ERROR); }
|
||||
bool FieldVisitorSum::operator() (Array &) const { throw Exception("Cannot sum Arrays", ErrorCodes::LOGICAL_ERROR); }
|
||||
bool FieldVisitorSum::operator() (Tuple &) const { throw Exception("Cannot sum Tuples", ErrorCodes::LOGICAL_ERROR); }
|
||||
|
@ -21,8 +21,6 @@ public:
|
||||
bool operator() (UInt64 & x) const;
|
||||
bool operator() (Float64 & x) const;
|
||||
bool operator() (Null &) const;
|
||||
bool operator() (NegativeInfinity & x) const;
|
||||
bool operator() (PositiveInfinity & x) const;
|
||||
bool operator() (String &) const;
|
||||
bool operator() (Array &) const;
|
||||
bool operator() (Tuple &) const;
|
||||
|
@ -52,9 +52,7 @@ static String formatFloat(const Float64 x)
|
||||
}
|
||||
|
||||
|
||||
String FieldVisitorToString::operator() (const Null &) const { return "NULL"; }
|
||||
String FieldVisitorToString::operator() (const NegativeInfinity &) const { return "-Inf"; }
|
||||
String FieldVisitorToString::operator() (const PositiveInfinity &) const { return "+Inf"; }
|
||||
String FieldVisitorToString::operator() (const Null & x) const { return x.is_negative_infinity ? "-Inf" : (x.is_positive_infinity ? "+Inf" : "NULL"); }
|
||||
String FieldVisitorToString::operator() (const UInt64 & x) const { return formatQuoted(x); }
|
||||
String FieldVisitorToString::operator() (const Int64 & x) const { return formatQuoted(x); }
|
||||
String FieldVisitorToString::operator() (const Float64 & x) const { return formatFloat(x); }
|
||||
|
@ -10,8 +10,6 @@ class FieldVisitorToString : public StaticVisitor<String>
|
||||
{
|
||||
public:
|
||||
String operator() (const Null & x) const;
|
||||
String operator() (const NegativeInfinity & x) const;
|
||||
String operator() (const PositiveInfinity & x) const;
|
||||
String operator() (const UInt64 & x) const;
|
||||
String operator() (const UInt128 & x) const;
|
||||
String operator() (const UInt256 & x) const;
|
||||
|
@ -6,9 +6,7 @@
|
||||
namespace DB
|
||||
{
|
||||
|
||||
void FieldVisitorWriteBinary::operator() (const Null &, WriteBuffer &) const { }
|
||||
void FieldVisitorWriteBinary::operator() (const NegativeInfinity &, WriteBuffer &) const { }
|
||||
void FieldVisitorWriteBinary::operator() (const PositiveInfinity &, WriteBuffer &) const { }
|
||||
void FieldVisitorWriteBinary::operator() (const Null &, WriteBuffer &) const {}
|
||||
void FieldVisitorWriteBinary::operator() (const UInt64 & x, WriteBuffer & buf) const { writeVarUInt(x, buf); }
|
||||
void FieldVisitorWriteBinary::operator() (const Int64 & x, WriteBuffer & buf) const { writeVarInt(x, buf); }
|
||||
void FieldVisitorWriteBinary::operator() (const Float64 & x, WriteBuffer & buf) const { writeFloatBinary(x, buf); }
|
||||
|
@ -9,8 +9,6 @@ class FieldVisitorWriteBinary
|
||||
{
|
||||
public:
|
||||
void operator() (const Null & x, WriteBuffer & buf) const;
|
||||
void operator() (const NegativeInfinity & x, WriteBuffer & buf) const;
|
||||
void operator() (const PositiveInfinity & x, WriteBuffer & buf) const;
|
||||
void operator() (const UInt64 & x, WriteBuffer & buf) const;
|
||||
void operator() (const UInt128 & x, WriteBuffer & buf) const;
|
||||
void operator() (const UInt256 & x, WriteBuffer & buf) const;
|
||||
|
@ -26,11 +26,11 @@ 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>
|
||||
|| std::is_same_v<T, NegativeInfinity> || std::is_same_v<T, PositiveInfinity>
|
||||
|| std::is_same_v<U, NegativeInfinity> || std::is_same_v<U, PositiveInfinity>)
|
||||
if constexpr (std::is_same_v<T, Null> || std::is_same_v<U, Null>)
|
||||
{
|
||||
return std::is_same_v<T, U>;
|
||||
if constexpr (std::is_same_v<T, Null> && std::is_same_v<U, Null>)
|
||||
return l == r;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -79,12 +79,18 @@ 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, NegativeInfinity> || std::is_same_v<U, PositiveInfinity>)
|
||||
return !std::is_same_v<T, U>;
|
||||
else if constexpr (std::is_same_v<U, NegativeInfinity> || std::is_same_v<T, PositiveInfinity>)
|
||||
return false;
|
||||
if constexpr (std::is_same_v<T, Null> && std::is_same_v<U, Null>)
|
||||
{
|
||||
return l.is_negative_infinity && r.is_positive_infinity;
|
||||
}
|
||||
else if constexpr (std::is_same_v<T, Null>)
|
||||
{
|
||||
return l.is_negative_infinity;
|
||||
}
|
||||
else if constexpr (std::is_same_v<U, Null>)
|
||||
{
|
||||
return r.is_positive_infinity;
|
||||
}
|
||||
else
|
||||
{
|
||||
if constexpr (std::is_same_v<T, U>)
|
||||
|
@ -484,19 +484,14 @@ template bool decimalLessOrEqual<Decimal256>(Decimal256 x, Decimal256 y, UInt32
|
||||
template bool decimalLessOrEqual<DateTime64>(DateTime64 x, DateTime64 y, UInt32 x_scale, UInt32 y_scale);
|
||||
|
||||
|
||||
inline void writeText(const Null &, WriteBuffer & buf)
|
||||
inline void writeText(const Null & x, WriteBuffer & buf)
|
||||
{
|
||||
writeText(std::string("NULL"), buf);
|
||||
}
|
||||
|
||||
inline void writeText(const NegativeInfinity &, WriteBuffer & buf)
|
||||
{
|
||||
writeText(std::string("-Inf"), buf);
|
||||
}
|
||||
|
||||
inline void writeText(const PositiveInfinity &, WriteBuffer & buf)
|
||||
{
|
||||
writeText(std::string("+Inf"), buf);
|
||||
if (x.is_negative_infinity)
|
||||
writeText(std::string("-Inf"), buf);
|
||||
if (x.is_positive_infinity)
|
||||
writeText(std::string("+Inf"), buf);
|
||||
else
|
||||
writeText(std::string("NULL"), buf);
|
||||
}
|
||||
|
||||
String toString(const Field & x)
|
||||
|
@ -28,6 +28,9 @@ namespace ErrorCodes
|
||||
extern const int ILLEGAL_TYPE_OF_ARGUMENT;
|
||||
}
|
||||
|
||||
constexpr Null NEGATIVE_INFINITY{true, false};
|
||||
constexpr Null POSITIVE_INFINITY{false, true};
|
||||
|
||||
class Field;
|
||||
using FieldVector = std::vector<Field, AllocatorWithMemoryTracking<Field>>;
|
||||
|
||||
@ -218,8 +221,6 @@ template <> struct NearestFieldTypeImpl<Tuple> { using Type = Tuple; };
|
||||
template <> struct NearestFieldTypeImpl<Map> { using Type = Map; };
|
||||
template <> struct NearestFieldTypeImpl<bool> { using Type = UInt64; };
|
||||
template <> struct NearestFieldTypeImpl<Null> { using Type = Null; };
|
||||
template <> struct NearestFieldTypeImpl<NegativeInfinity> { using Type = NegativeInfinity; };
|
||||
template <> struct NearestFieldTypeImpl<PositiveInfinity> { using Type = PositiveInfinity; };
|
||||
|
||||
template <> struct NearestFieldTypeImpl<AggregateFunctionStateData> { using Type = AggregateFunctionStateData; };
|
||||
|
||||
@ -281,10 +282,6 @@ public:
|
||||
Int256 = 25,
|
||||
Map = 26,
|
||||
UUID = 27,
|
||||
|
||||
// Special types for index analysis
|
||||
NegativeInfinity = 254,
|
||||
PositiveInfinity = 255,
|
||||
};
|
||||
|
||||
static const char * toString(Which which)
|
||||
@ -292,8 +289,6 @@ public:
|
||||
switch (which)
|
||||
{
|
||||
case Null: return "Null";
|
||||
case NegativeInfinity: return "-Inf";
|
||||
case PositiveInfinity: return "+Inf";
|
||||
case UInt64: return "UInt64";
|
||||
case UInt128: return "UInt128";
|
||||
case UInt256: return "UInt256";
|
||||
@ -337,10 +332,7 @@ public:
|
||||
!std::is_same_v<std::decay_t<T>, bool> &&
|
||||
!std::is_same_v<NearestFieldType<std::decay_t<T>>, String>, Z>;
|
||||
|
||||
Field() //-V730
|
||||
: which(Types::Null)
|
||||
{
|
||||
}
|
||||
Field() : Field(Null{}) {}
|
||||
|
||||
/** Despite the presence of a template constructor, this constructor is still needed,
|
||||
* since, in its absence, the compiler will still generate the default constructor.
|
||||
@ -427,12 +419,7 @@ public:
|
||||
Types::Which getType() const { return which; }
|
||||
const char * getTypeName() const { return Types::toString(which); }
|
||||
|
||||
// Non-valued field are all denoted as Null
|
||||
bool isNull() const { return which == Types::Null || which == Types::NegativeInfinity || which == Types::PositiveInfinity; }
|
||||
bool isNegativeInfinity() const { return which == Types::NegativeInfinity; }
|
||||
bool isPositiveInfinity() const { return which == Types::PositiveInfinity; }
|
||||
|
||||
|
||||
bool isNull() const { return which == Types::Null; }
|
||||
template <typename T>
|
||||
NearestFieldType<std::decay_t<T>> & get();
|
||||
|
||||
@ -443,6 +430,9 @@ public:
|
||||
return mutable_this->get<T>();
|
||||
}
|
||||
|
||||
bool isNegativeInfinity() const { return which == Types::Null && get<Null>().is_negative_infinity; }
|
||||
bool isPositiveInfinity() const { return which == Types::Null && get<Null>().is_positive_infinity; }
|
||||
|
||||
template <typename T>
|
||||
T & reinterpret();
|
||||
|
||||
@ -485,10 +475,7 @@ public:
|
||||
|
||||
switch (which)
|
||||
{
|
||||
case Types::Null:
|
||||
case Types::NegativeInfinity:
|
||||
case Types::PositiveInfinity:
|
||||
return false;
|
||||
case Types::Null: return false;
|
||||
case Types::UInt64: return get<UInt64>() < rhs.get<UInt64>();
|
||||
case Types::UInt128: return get<UInt128>() < rhs.get<UInt128>();
|
||||
case Types::UInt256: return get<UInt256>() < rhs.get<UInt256>();
|
||||
@ -525,10 +512,7 @@ public:
|
||||
|
||||
switch (which)
|
||||
{
|
||||
case Types::Null:
|
||||
case Types::NegativeInfinity:
|
||||
case Types::PositiveInfinity:
|
||||
return true;
|
||||
case Types::Null: return true;
|
||||
case Types::UInt64: return get<UInt64>() <= rhs.get<UInt64>();
|
||||
case Types::UInt128: return get<UInt128>() <= rhs.get<UInt128>();
|
||||
case Types::UInt256: return get<UInt256>() <= rhs.get<UInt256>();
|
||||
@ -565,10 +549,7 @@ public:
|
||||
|
||||
switch (which)
|
||||
{
|
||||
case Types::Null:
|
||||
case Types::NegativeInfinity:
|
||||
case Types::PositiveInfinity:
|
||||
return true;
|
||||
case Types::Null: return true;
|
||||
case Types::UInt64: return get<UInt64>() == rhs.get<UInt64>();
|
||||
case Types::Int64: return get<Int64>() == rhs.get<Int64>();
|
||||
case Types::Float64:
|
||||
@ -608,8 +589,6 @@ public:
|
||||
switch (field.which)
|
||||
{
|
||||
case Types::Null: return f(field.template get<Null>());
|
||||
case Types::NegativeInfinity: return f(field.template get<NegativeInfinity>());
|
||||
case Types::PositiveInfinity: return f(field.template get<PositiveInfinity>());
|
||||
// gcc 8.2.1
|
||||
#if !defined(__clang__)
|
||||
#pragma GCC diagnostic push
|
||||
@ -767,9 +746,7 @@ private:
|
||||
using Row = std::vector<Field>;
|
||||
|
||||
|
||||
template <> struct Field::TypeToEnum<Null> { static const Types::Which value = Types::Null; };
|
||||
template <> struct Field::TypeToEnum<NegativeInfinity> { static const Types::Which value = Types::NegativeInfinity; };
|
||||
template <> struct Field::TypeToEnum<PositiveInfinity> { static const Types::Which value = Types::PositiveInfinity; };
|
||||
template <> struct Field::TypeToEnum<Null> { static const Types::Which value = Types::Null; };
|
||||
template <> struct Field::TypeToEnum<UInt64> { static const Types::Which value = Types::UInt64; };
|
||||
template <> struct Field::TypeToEnum<UInt128> { static const Types::Which value = Types::UInt128; };
|
||||
template <> struct Field::TypeToEnum<UInt256> { static const Types::Which value = Types::UInt256; };
|
||||
@ -790,8 +767,6 @@ template <> struct Field::TypeToEnum<DecimalField<DateTime64>>{ static const Typ
|
||||
template <> struct Field::TypeToEnum<AggregateFunctionStateData>{ static const Types::Which value = Types::AggregateFunctionState; };
|
||||
|
||||
template <> struct Field::EnumToType<Field::Types::Null> { using Type = Null; };
|
||||
template <> struct Field::EnumToType<Field::Types::NegativeInfinity> { using Type = NegativeInfinity; };
|
||||
template <> struct Field::EnumToType<Field::Types::PositiveInfinity> { using Type = PositiveInfinity; };
|
||||
template <> struct Field::EnumToType<Field::Types::UInt64> { using Type = UInt64; };
|
||||
template <> struct Field::EnumToType<Field::Types::UInt128> { using Type = UInt128; };
|
||||
template <> struct Field::EnumToType<Field::Types::UInt256> { using Type = UInt256; };
|
||||
|
@ -13,9 +13,23 @@ namespace DB
|
||||
|
||||
/// Data types for representing elementary values from a database in RAM.
|
||||
|
||||
struct Null {};
|
||||
struct NegativeInfinity {};
|
||||
struct PositiveInfinity {};
|
||||
/// Hold a null value for untyped calculation. It can also store infinities to handle nullable
|
||||
/// comparison which is used for nullable KeyCondition.
|
||||
struct Null
|
||||
{
|
||||
bool is_negative_infinity = false;
|
||||
bool is_positive_infinity = false;
|
||||
|
||||
bool operator==(const Null & other) const
|
||||
{
|
||||
return is_negative_infinity == other.is_negative_infinity && is_positive_infinity == other.is_positive_infinity;
|
||||
}
|
||||
|
||||
bool operator!=(const Null & other) const
|
||||
{
|
||||
return !(*this == other);
|
||||
}
|
||||
};
|
||||
|
||||
/// Ignore strange gcc warning https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55776
|
||||
#if !defined(__clang__)
|
||||
|
@ -19,7 +19,6 @@ namespace DB
|
||||
namespace ErrorCodes
|
||||
{
|
||||
extern const int EMPTY_DATA_PASSED;
|
||||
extern const int LOGICAL_ERROR;
|
||||
}
|
||||
|
||||
|
||||
@ -28,16 +27,6 @@ DataTypePtr FieldToDataType::operator() (const Null &) const
|
||||
return std::make_shared<DataTypeNullable>(std::make_shared<DataTypeNothing>());
|
||||
}
|
||||
|
||||
DataTypePtr FieldToDataType::operator() (const NegativeInfinity &) const
|
||||
{
|
||||
throw Exception("It's invalid to have -inf literals in SQL", ErrorCodes::LOGICAL_ERROR);
|
||||
}
|
||||
|
||||
DataTypePtr FieldToDataType::operator() (const PositiveInfinity &) const
|
||||
{
|
||||
throw Exception("It's invalid to have +inf literals in SQL", ErrorCodes::LOGICAL_ERROR);
|
||||
}
|
||||
|
||||
DataTypePtr FieldToDataType::operator() (const UInt64 & x) const
|
||||
{
|
||||
if (x <= std::numeric_limits<UInt8>::max()) return std::make_shared<DataTypeUInt8>();
|
||||
|
@ -21,8 +21,6 @@ class FieldToDataType : public StaticVisitor<DataTypePtr>
|
||||
{
|
||||
public:
|
||||
DataTypePtr operator() (const Null & x) const;
|
||||
DataTypePtr operator() (const NegativeInfinity & x) const;
|
||||
DataTypePtr operator() (const PositiveInfinity & x) const;
|
||||
DataTypePtr operator() (const UInt64 & x) const;
|
||||
DataTypePtr operator() (const UInt128 & x) const;
|
||||
DataTypePtr operator() (const UInt256 & x) const;
|
||||
|
@ -81,9 +81,9 @@ void IMergeTreeDataPart::MinMaxIndex::load(const MergeTreeData & data, const Dis
|
||||
|
||||
// NULL_LAST
|
||||
if (min_val.isNull())
|
||||
min_val = PositiveInfinity();
|
||||
min_val = POSITIVE_INFINITY;
|
||||
if (max_val.isNull())
|
||||
max_val = PositiveInfinity();
|
||||
max_val = POSITIVE_INFINITY;
|
||||
|
||||
hyperrectangle.emplace_back(min_val, true, max_val, true);
|
||||
}
|
||||
|
@ -334,7 +334,7 @@ const KeyCondition::AtomMap KeyCondition::atom_map
|
||||
{
|
||||
out.function = RPNElement::FUNCTION_IS_NULL;
|
||||
// When using NULL_LAST, isNull means [+Inf, +Inf]
|
||||
out.range = Range(Field(PositiveInfinity{}));
|
||||
out.range = Range(Field(POSITIVE_INFINITY));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -1733,8 +1733,6 @@ KeyCondition::Description KeyCondition::getDescription() const
|
||||
* over at least one hyperrectangle from which this range consists.
|
||||
*/
|
||||
|
||||
FieldRef negativeInfinity(NegativeInfinity{}), positiveInfinity(PositiveInfinity{});
|
||||
|
||||
template <typename F>
|
||||
static BoolMask forAnyHyperrectangle(
|
||||
size_t key_size,
|
||||
|
@ -55,8 +55,8 @@ private:
|
||||
static bool less(const Field & lhs, const Field & rhs);
|
||||
|
||||
public:
|
||||
FieldRef left = NegativeInfinity{}; /// the left border
|
||||
FieldRef right = PositiveInfinity{}; /// the right border
|
||||
FieldRef left = NEGATIVE_INFINITY; /// the left border
|
||||
FieldRef right = POSITIVE_INFINITY; /// the right border
|
||||
bool left_included = false; /// includes the left border
|
||||
bool right_included = false; /// includes the right border
|
||||
|
||||
@ -185,9 +185,9 @@ public:
|
||||
{
|
||||
std::swap(left, right);
|
||||
if (left.isPositiveInfinity())
|
||||
left = NegativeInfinity{};
|
||||
left = NEGATIVE_INFINITY;
|
||||
if (right.isNegativeInfinity())
|
||||
right = PositiveInfinity{};
|
||||
right = POSITIVE_INFINITY;
|
||||
std::swap(left_included, right_included);
|
||||
}
|
||||
|
||||
|
@ -1258,7 +1258,7 @@ MarkRanges MergeTreeDataSelectExecutor::markRangesFromPKRange(
|
||||
field = {index_columns.get(), row, column};
|
||||
// NULL_LAST
|
||||
if (field.isNull())
|
||||
field = PositiveInfinity{};
|
||||
field = POSITIVE_INFINITY;
|
||||
};
|
||||
}
|
||||
else
|
||||
@ -1268,7 +1268,7 @@ MarkRanges MergeTreeDataSelectExecutor::markRangesFromPKRange(
|
||||
index[column]->get(row, field);
|
||||
// NULL_LAST
|
||||
if (field.isNull())
|
||||
field = PositiveInfinity{};
|
||||
field = POSITIVE_INFINITY;
|
||||
};
|
||||
}
|
||||
|
||||
@ -1283,7 +1283,7 @@ MarkRanges MergeTreeDataSelectExecutor::markRangesFromPKRange(
|
||||
for (size_t i = 0; i < used_key_size; ++i)
|
||||
{
|
||||
create_field_ref(range.begin, i, index_left[i]);
|
||||
index_right[i] = PositiveInfinity{};
|
||||
index_right[i] = POSITIVE_INFINITY;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -94,9 +94,9 @@ void MergeTreeIndexGranuleMinMax::deserializeBinary(ReadBuffer & istr, MergeTree
|
||||
|
||||
// NULL_LAST
|
||||
if (min_val.isNull())
|
||||
min_val = PositiveInfinity();
|
||||
min_val = POSITIVE_INFINITY;
|
||||
if (max_val.isNull())
|
||||
max_val = PositiveInfinity();
|
||||
max_val = POSITIVE_INFINITY;
|
||||
|
||||
break;
|
||||
default:
|
||||
|
@ -43,16 +43,6 @@ namespace
|
||||
UInt8 type = Field::Types::Null;
|
||||
hash.update(type);
|
||||
}
|
||||
void operator() (const NegativeInfinity &) const
|
||||
{
|
||||
UInt8 type = Field::Types::NegativeInfinity;
|
||||
hash.update(type);
|
||||
}
|
||||
void operator() (const PositiveInfinity &) const
|
||||
{
|
||||
UInt8 type = Field::Types::PositiveInfinity;
|
||||
hash.update(type);
|
||||
}
|
||||
void operator() (const UInt64 & x) const
|
||||
{
|
||||
UInt8 type = Field::Types::UInt64;
|
||||
|
Loading…
Reference in New Issue
Block a user