mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
Merge branch 'simPod-uuid-fix'
This commit is contained in:
commit
8ae0186e5b
@ -4,6 +4,7 @@
|
|||||||
#include <IO/WriteHelpers.h>
|
#include <IO/WriteHelpers.h>
|
||||||
#include <IO/ReadBufferFromString.h>
|
#include <IO/ReadBufferFromString.h>
|
||||||
#include <IO/WriteBufferFromString.h>
|
#include <IO/WriteBufferFromString.h>
|
||||||
|
#include <IO/Operators.h>
|
||||||
#include <Common/FieldVisitors.h>
|
#include <Common/FieldVisitors.h>
|
||||||
#include <Common/SipHash.h>
|
#include <Common/SipHash.h>
|
||||||
|
|
||||||
@ -35,6 +36,13 @@ String FieldVisitorDump::operator() (const UInt64 & x) const { return formatQuot
|
|||||||
String FieldVisitorDump::operator() (const Int64 & x) const { return formatQuotedWithPrefix(x, "Int64_"); }
|
String FieldVisitorDump::operator() (const Int64 & x) const { return formatQuotedWithPrefix(x, "Int64_"); }
|
||||||
String FieldVisitorDump::operator() (const Float64 & x) const { return formatQuotedWithPrefix(x, "Float64_"); }
|
String FieldVisitorDump::operator() (const Float64 & x) const { return formatQuotedWithPrefix(x, "Float64_"); }
|
||||||
|
|
||||||
|
String FieldVisitorDump::operator() (const UInt128 & x) const
|
||||||
|
{
|
||||||
|
WriteBufferFromOwnString wb;
|
||||||
|
wb << "UInt128_" << x.low << "_" << x.high;
|
||||||
|
return wb.str();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
String FieldVisitorDump::operator() (const String & x) const
|
String FieldVisitorDump::operator() (const String & x) const
|
||||||
{
|
{
|
||||||
@ -47,14 +55,14 @@ String FieldVisitorDump::operator() (const Array & x) const
|
|||||||
{
|
{
|
||||||
WriteBufferFromOwnString wb;
|
WriteBufferFromOwnString wb;
|
||||||
|
|
||||||
wb.write("Array_[", 7);
|
wb << "Array_[";
|
||||||
for (auto it = x.begin(); it != x.end(); ++it)
|
for (auto it = x.begin(); it != x.end(); ++it)
|
||||||
{
|
{
|
||||||
if (it != x.begin())
|
if (it != x.begin())
|
||||||
wb.write(", ", 2);
|
wb << ", ";
|
||||||
writeString(applyVisitor(*this, *it), wb);
|
wb << applyVisitor(*this, *it);
|
||||||
}
|
}
|
||||||
writeChar(']', wb);
|
wb << ']';
|
||||||
|
|
||||||
return wb.str();
|
return wb.str();
|
||||||
}
|
}
|
||||||
@ -64,14 +72,14 @@ String FieldVisitorDump::operator() (const Tuple & x_def) const
|
|||||||
auto & x = x_def.toUnderType();
|
auto & x = x_def.toUnderType();
|
||||||
WriteBufferFromOwnString wb;
|
WriteBufferFromOwnString wb;
|
||||||
|
|
||||||
wb.write("Tuple_(", 7);
|
wb << "Tuple_(";
|
||||||
for (auto it = x.begin(); it != x.end(); ++it)
|
for (auto it = x.begin(); it != x.end(); ++it)
|
||||||
{
|
{
|
||||||
if (it != x.begin())
|
if (it != x.begin())
|
||||||
wb.write(", ", 2);
|
wb << ", ";
|
||||||
writeString(applyVisitor(*this, *it), wb);
|
wb << applyVisitor(*this, *it);
|
||||||
}
|
}
|
||||||
writeChar(')', wb);
|
wb << ')';
|
||||||
|
|
||||||
return wb.str();
|
return wb.str();
|
||||||
}
|
}
|
||||||
@ -105,19 +113,24 @@ String FieldVisitorToString::operator() (const Int64 & x) const { return formatQ
|
|||||||
String FieldVisitorToString::operator() (const Float64 & x) const { return formatFloat(x); }
|
String FieldVisitorToString::operator() (const Float64 & x) const { return formatFloat(x); }
|
||||||
String FieldVisitorToString::operator() (const String & x) const { return formatQuoted(x); }
|
String FieldVisitorToString::operator() (const String & x) const { return formatQuoted(x); }
|
||||||
|
|
||||||
|
String FieldVisitorToString::operator() (const UInt128 & x) const
|
||||||
|
{
|
||||||
|
/// Dummy implementation. There is no UInt128 literals in SQL.
|
||||||
|
return FieldVisitorDump()(x);
|
||||||
|
}
|
||||||
|
|
||||||
String FieldVisitorToString::operator() (const Array & x) const
|
String FieldVisitorToString::operator() (const Array & x) const
|
||||||
{
|
{
|
||||||
WriteBufferFromOwnString wb;
|
WriteBufferFromOwnString wb;
|
||||||
|
|
||||||
writeChar('[', wb);
|
wb << '[';
|
||||||
for (Array::const_iterator it = x.begin(); it != x.end(); ++it)
|
for (Array::const_iterator it = x.begin(); it != x.end(); ++it)
|
||||||
{
|
{
|
||||||
if (it != x.begin())
|
if (it != x.begin())
|
||||||
wb.write(", ", 2);
|
wb.write(", ", 2);
|
||||||
writeString(applyVisitor(*this, *it), wb);
|
wb << applyVisitor(*this, *it);
|
||||||
}
|
}
|
||||||
writeChar(']', wb);
|
wb << ']';
|
||||||
|
|
||||||
return wb.str();
|
return wb.str();
|
||||||
}
|
}
|
||||||
@ -127,14 +140,14 @@ String FieldVisitorToString::operator() (const Tuple & x_def) const
|
|||||||
auto & x = x_def.toUnderType();
|
auto & x = x_def.toUnderType();
|
||||||
WriteBufferFromOwnString wb;
|
WriteBufferFromOwnString wb;
|
||||||
|
|
||||||
writeChar('(', wb);
|
wb << '(';
|
||||||
for (auto it = x.begin(); it != x.end(); ++it)
|
for (auto it = x.begin(); it != x.end(); ++it)
|
||||||
{
|
{
|
||||||
if (it != x.begin())
|
if (it != x.begin())
|
||||||
wb.write(", ", 2);
|
wb << ", ";
|
||||||
writeString(applyVisitor(*this, *it), wb);
|
wb << applyVisitor(*this, *it);
|
||||||
}
|
}
|
||||||
writeChar(')', wb);
|
wb << ')';
|
||||||
|
|
||||||
return wb.str();
|
return wb.str();
|
||||||
}
|
}
|
||||||
@ -155,6 +168,13 @@ void FieldVisitorHash::operator() (const UInt64 & x) const
|
|||||||
hash.update(x);
|
hash.update(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FieldVisitorHash::operator() (const UInt128 & x) const
|
||||||
|
{
|
||||||
|
UInt8 type = Field::Types::UInt128;
|
||||||
|
hash.update(type);
|
||||||
|
hash.update(x);
|
||||||
|
}
|
||||||
|
|
||||||
void FieldVisitorHash::operator() (const Int64 & x) const
|
void FieldVisitorHash::operator() (const Int64 & x) const
|
||||||
{
|
{
|
||||||
UInt8 type = Field::Types::Int64;
|
UInt8 type = Field::Types::Int64;
|
||||||
|
@ -38,6 +38,7 @@ typename std::decay_t<Visitor>::ResultType applyVisitor(Visitor && visitor, F &&
|
|||||||
{
|
{
|
||||||
case Field::Types::Null: return visitor(field.template get<Null>());
|
case Field::Types::Null: return visitor(field.template get<Null>());
|
||||||
case Field::Types::UInt64: return visitor(field.template get<UInt64>());
|
case Field::Types::UInt64: return visitor(field.template get<UInt64>());
|
||||||
|
case Field::Types::UInt128: return visitor(field.template get<UInt128>());
|
||||||
case Field::Types::Int64: return visitor(field.template get<Int64>());
|
case Field::Types::Int64: return visitor(field.template get<Int64>());
|
||||||
case Field::Types::Float64: return visitor(field.template get<Float64>());
|
case Field::Types::Float64: return visitor(field.template get<Float64>());
|
||||||
case Field::Types::String: return visitor(field.template get<String>());
|
case Field::Types::String: return visitor(field.template get<String>());
|
||||||
@ -57,6 +58,7 @@ static typename std::decay_t<Visitor>::ResultType applyBinaryVisitorImpl(Visitor
|
|||||||
{
|
{
|
||||||
case Field::Types::Null: return visitor(field1, field2.template get<Null>());
|
case Field::Types::Null: return visitor(field1, field2.template get<Null>());
|
||||||
case Field::Types::UInt64: return visitor(field1, field2.template get<UInt64>());
|
case Field::Types::UInt64: return visitor(field1, field2.template get<UInt64>());
|
||||||
|
case Field::Types::UInt128: return visitor(field1, field2.template get<UInt128>());
|
||||||
case Field::Types::Int64: return visitor(field1, field2.template get<Int64>());
|
case Field::Types::Int64: return visitor(field1, field2.template get<Int64>());
|
||||||
case Field::Types::Float64: return visitor(field1, field2.template get<Float64>());
|
case Field::Types::Float64: return visitor(field1, field2.template get<Float64>());
|
||||||
case Field::Types::String: return visitor(field1, field2.template get<String>());
|
case Field::Types::String: return visitor(field1, field2.template get<String>());
|
||||||
@ -79,6 +81,9 @@ typename std::decay_t<Visitor>::ResultType applyVisitor(Visitor && visitor, F1 &
|
|||||||
case Field::Types::UInt64:
|
case Field::Types::UInt64:
|
||||||
return applyBinaryVisitorImpl(
|
return applyBinaryVisitorImpl(
|
||||||
std::forward<Visitor>(visitor), field1.template get<UInt64>(), std::forward<F2>(field2));
|
std::forward<Visitor>(visitor), field1.template get<UInt64>(), std::forward<F2>(field2));
|
||||||
|
case Field::Types::UInt128:
|
||||||
|
return applyBinaryVisitorImpl(
|
||||||
|
std::forward<Visitor>(visitor), field1.template get<UInt128>(), std::forward<F2>(field2));
|
||||||
case Field::Types::Int64:
|
case Field::Types::Int64:
|
||||||
return applyBinaryVisitorImpl(
|
return applyBinaryVisitorImpl(
|
||||||
std::forward<Visitor>(visitor), field1.template get<Int64>(), std::forward<F2>(field2));
|
std::forward<Visitor>(visitor), field1.template get<Int64>(), std::forward<F2>(field2));
|
||||||
@ -107,6 +112,7 @@ class FieldVisitorToString : public StaticVisitor<String>
|
|||||||
public:
|
public:
|
||||||
String operator() (const Null & x) const;
|
String operator() (const Null & x) const;
|
||||||
String operator() (const UInt64 & x) const;
|
String operator() (const UInt64 & x) const;
|
||||||
|
String operator() (const UInt128 & x) const;
|
||||||
String operator() (const Int64 & x) const;
|
String operator() (const Int64 & x) const;
|
||||||
String operator() (const Float64 & x) const;
|
String operator() (const Float64 & x) const;
|
||||||
String operator() (const String & x) const;
|
String operator() (const String & x) const;
|
||||||
@ -121,6 +127,7 @@ class FieldVisitorDump : public StaticVisitor<String>
|
|||||||
public:
|
public:
|
||||||
String operator() (const Null & x) const;
|
String operator() (const Null & x) const;
|
||||||
String operator() (const UInt64 & x) const;
|
String operator() (const UInt64 & x) const;
|
||||||
|
String operator() (const UInt128 & x) const;
|
||||||
String operator() (const Int64 & x) const;
|
String operator() (const Int64 & x) const;
|
||||||
String operator() (const Float64 & x) const;
|
String operator() (const Float64 & x) const;
|
||||||
String operator() (const String & x) const;
|
String operator() (const String & x) const;
|
||||||
@ -157,6 +164,11 @@ public:
|
|||||||
T operator() (const UInt64 & x) const { return x; }
|
T operator() (const UInt64 & x) const { return x; }
|
||||||
T operator() (const Int64 & x) const { return x; }
|
T operator() (const Int64 & x) const { return x; }
|
||||||
T operator() (const Float64 & x) const { return x; }
|
T operator() (const Float64 & x) const { return x; }
|
||||||
|
|
||||||
|
T operator() (const UInt128 &) const
|
||||||
|
{
|
||||||
|
throw Exception("Cannot convert UInt128 to " + demangle(typeid(T).name()), ErrorCodes::CANNOT_CONVERT_TYPE);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -170,6 +182,7 @@ public:
|
|||||||
|
|
||||||
void operator() (const Null & x) const;
|
void operator() (const Null & x) const;
|
||||||
void operator() (const UInt64 & x) const;
|
void operator() (const UInt64 & x) const;
|
||||||
|
void operator() (const UInt128 & x) const;
|
||||||
void operator() (const Int64 & x) const;
|
void operator() (const Int64 & x) const;
|
||||||
void operator() (const Float64 & x) const;
|
void operator() (const Float64 & x) const;
|
||||||
void operator() (const String & x) const;
|
void operator() (const String & x) const;
|
||||||
@ -180,44 +193,60 @@ public:
|
|||||||
/** More precise comparison, used for index.
|
/** More precise comparison, used for index.
|
||||||
* Differs from Field::operator< and Field::operator== in that it also compares values of different types.
|
* 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).
|
* Comparison rules are same as in FunctionsComparison (to be consistent with expression evaluation in query).
|
||||||
|
*
|
||||||
|
* TODO Comparisons of UInt128 with different type are incorrect.
|
||||||
*/
|
*/
|
||||||
class FieldVisitorAccurateEquals : public StaticVisitor<bool>
|
class FieldVisitorAccurateEquals : public StaticVisitor<bool>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool operator() (const Null &, const Null &) const { return true; }
|
bool operator() (const Null &, const Null &) const { return true; }
|
||||||
bool operator() (const Null &, const UInt64 &) const { return false; }
|
bool operator() (const Null &, const UInt64 &) const { return false; }
|
||||||
|
bool operator() (const Null &, const UInt128 &) const { return false; }
|
||||||
bool operator() (const Null &, const Int64 &) const { return false; }
|
bool operator() (const Null &, const Int64 &) const { return false; }
|
||||||
bool operator() (const Null &, const Float64 &) const { return false; }
|
bool operator() (const Null &, const Float64 &) const { return false; }
|
||||||
bool operator() (const Null &, const String &) const { return false; }
|
bool operator() (const Null &, const String &) const { return false; }
|
||||||
bool operator() (const Null &, const Array &) const { return false; }
|
bool operator() (const Null &, const Array &) const { return false; }
|
||||||
bool operator() (const Null &, const Tuple &) const { return false; }
|
bool operator() (const Null &, const Tuple &) const { return false; }
|
||||||
|
|
||||||
bool operator() (const UInt64 &, const Null &) const { return false; }
|
bool operator() (const UInt64 &, const Null &) const { return false; }
|
||||||
bool operator() (const UInt64 & l, const UInt64 & r) const { return l == r; }
|
bool operator() (const UInt64 & l, const UInt64 & r) const { return l == r; }
|
||||||
|
bool operator() (const UInt64 &, const UInt128) const { return true; }
|
||||||
bool operator() (const UInt64 & l, const Int64 & r) const { return accurate::equalsOp(l, r); }
|
bool operator() (const UInt64 & l, const Int64 & r) const { return accurate::equalsOp(l, r); }
|
||||||
bool operator() (const UInt64 & l, const Float64 & r) const { return accurate::equalsOp(l, r); }
|
bool operator() (const UInt64 & l, const Float64 & r) const { return accurate::equalsOp(l, r); }
|
||||||
bool operator() (const UInt64 &, const String &) const { return false; }
|
bool operator() (const UInt64 &, const String &) const { return false; }
|
||||||
bool operator() (const UInt64 &, const Array &) const { return false; }
|
bool operator() (const UInt64 &, const Array &) const { return false; }
|
||||||
bool operator() (const UInt64 &, const Tuple &) const { return false; }
|
bool operator() (const UInt64 &, const Tuple &) const { return false; }
|
||||||
|
|
||||||
bool operator() (const Int64 &, const Null &) const { return false; }
|
bool operator() (const UInt128 &, const Null &) const { return false; }
|
||||||
|
bool operator() (const UInt128 &, const UInt64) const { return false; }
|
||||||
|
bool operator() (const UInt128 & l, const UInt128 & r) const { return l == r; }
|
||||||
|
bool operator() (const UInt128 &, const Int64) const { return false; }
|
||||||
|
bool operator() (const UInt128 &, const Float64) const { return false; }
|
||||||
|
bool operator() (const UInt128 &, const String &) const { return false; }
|
||||||
|
bool operator() (const UInt128 &, const Array &) const { return false; }
|
||||||
|
bool operator() (const UInt128 &, const Tuple &) const { return false; }
|
||||||
|
|
||||||
|
bool operator() (const Int64 &, const Null &) const { return false; }
|
||||||
bool operator() (const Int64 & l, const UInt64 & r) const { return accurate::equalsOp(l, r); }
|
bool operator() (const Int64 & l, const UInt64 & r) const { return accurate::equalsOp(l, r); }
|
||||||
|
bool operator() (const Int64 &, const UInt128) const { return false; }
|
||||||
bool operator() (const Int64 & l, const Int64 & r) const { return l == r; }
|
bool operator() (const Int64 & l, const Int64 & r) const { return l == r; }
|
||||||
bool operator() (const Int64 & l, const Float64 & r) const { return accurate::equalsOp(l, r); }
|
bool operator() (const Int64 & l, const Float64 & r) const { return accurate::equalsOp(l, r); }
|
||||||
bool operator() (const Int64 &, const String &) const { return false; }
|
bool operator() (const Int64 &, const String &) const { return false; }
|
||||||
bool operator() (const Int64 &, const Array &) const { return false; }
|
bool operator() (const Int64 &, const Array &) const { return false; }
|
||||||
bool operator() (const Int64 &, const Tuple &) const { return false; }
|
bool operator() (const Int64 &, const Tuple &) const { return false; }
|
||||||
|
|
||||||
bool operator() (const Float64 &, const Null &) const { return false; }
|
bool operator() (const Float64 &, const Null &) const { return false; }
|
||||||
bool operator() (const Float64 & l, const UInt64 & r) const { return accurate::equalsOp(l, r); }
|
bool operator() (const Float64 & l, const UInt64 & r) const { return accurate::equalsOp(l, r); }
|
||||||
|
bool operator() (const Float64 &, const UInt128) const { return false; }
|
||||||
bool operator() (const Float64 & l, const Int64 & r) const { return accurate::equalsOp(l, r); }
|
bool operator() (const Float64 & l, const Int64 & r) const { return accurate::equalsOp(l, r); }
|
||||||
bool operator() (const Float64 & l, const Float64 & r) const { return l == r; }
|
bool operator() (const Float64 & l, const Float64 & r) const { return l == r; }
|
||||||
bool operator() (const Float64 &, const String &) const { return false; }
|
bool operator() (const Float64 &, const String &) const { return false; }
|
||||||
bool operator() (const Float64 &, const Array &) const { return false; }
|
bool operator() (const Float64 &, const Array &) const { return false; }
|
||||||
bool operator() (const Float64 &, const Tuple &) const { return false; }
|
bool operator() (const Float64 &, const Tuple &) const { return false; }
|
||||||
|
|
||||||
bool operator() (const String &, const Null &) const { return false; }
|
bool operator() (const String &, const Null &) const { return false; }
|
||||||
bool operator() (const String &, const UInt64 &) const { return false; }
|
bool operator() (const String &, const UInt64 &) const { return false; }
|
||||||
|
bool operator() (const String &, const UInt128 &) const { return false; }
|
||||||
bool operator() (const String &, const Int64 &) const { return false; }
|
bool operator() (const String &, const Int64 &) const { return false; }
|
||||||
bool operator() (const String &, const Float64 &) const { return false; }
|
bool operator() (const String &, const Float64 &) const { return false; }
|
||||||
bool operator() (const String & l, const String & r) const { return l == r; }
|
bool operator() (const String & l, const String & r) const { return l == r; }
|
||||||
@ -226,6 +255,7 @@ public:
|
|||||||
|
|
||||||
bool operator() (const Array &, const Null &) const { return false; }
|
bool operator() (const Array &, const Null &) const { return false; }
|
||||||
bool operator() (const Array &, const UInt64 &) const { return false; }
|
bool operator() (const Array &, const UInt64 &) const { return false; }
|
||||||
|
bool operator() (const Array &, const UInt128 &) const { return false; }
|
||||||
bool operator() (const Array &, const Int64 &) const { return false; }
|
bool operator() (const Array &, const Int64 &) const { return false; }
|
||||||
bool operator() (const Array &, const Float64 &) const { return false; }
|
bool operator() (const Array &, const Float64 &) const { return false; }
|
||||||
bool operator() (const Array &, const String &) const { return false; }
|
bool operator() (const Array &, const String &) const { return false; }
|
||||||
@ -234,6 +264,7 @@ public:
|
|||||||
|
|
||||||
bool operator() (const Tuple &, const Null &) const { return false; }
|
bool operator() (const Tuple &, const Null &) const { return false; }
|
||||||
bool operator() (const Tuple &, const UInt64 &) const { return false; }
|
bool operator() (const Tuple &, const UInt64 &) const { return false; }
|
||||||
|
bool operator() (const Tuple &, const UInt128 &) const { return false; }
|
||||||
bool operator() (const Tuple &, const Int64 &) const { return false; }
|
bool operator() (const Tuple &, const Int64 &) const { return false; }
|
||||||
bool operator() (const Tuple &, const Float64 &) const { return false; }
|
bool operator() (const Tuple &, const Float64 &) const { return false; }
|
||||||
bool operator() (const Tuple &, const String &) const { return false; }
|
bool operator() (const Tuple &, const String &) const { return false; }
|
||||||
@ -247,45 +278,60 @@ public:
|
|||||||
bool operator() (const Null &, const Null &) const { return false; }
|
bool operator() (const Null &, const Null &) const { return false; }
|
||||||
bool operator() (const Null &, const UInt64 &) const { return true; }
|
bool operator() (const Null &, const UInt64 &) const { return true; }
|
||||||
bool operator() (const Null &, const Int64 &) const { return true; }
|
bool operator() (const Null &, const Int64 &) const { return true; }
|
||||||
|
bool operator() (const Null &, const UInt128 &) const { return true; }
|
||||||
bool operator() (const Null &, const Float64 &) const { return true; }
|
bool operator() (const Null &, const Float64 &) const { return true; }
|
||||||
bool operator() (const Null &, const String &) const { return true; }
|
bool operator() (const Null &, const String &) const { return true; }
|
||||||
bool operator() (const Null &, const Array &) const { return true; }
|
bool operator() (const Null &, const Array &) const { return true; }
|
||||||
bool operator() (const Null &, const Tuple &) const { return true; }
|
bool operator() (const Null &, const Tuple &) const { return true; }
|
||||||
|
|
||||||
bool operator() (const UInt64 &, const Null &) const { return false; }
|
bool operator() (const UInt64 &, const Null &) const { return false; }
|
||||||
bool operator() (const UInt64 & l, const UInt64 & r) const { return l < r; }
|
bool operator() (const UInt64 & l, const UInt64 & r) const { return l < r; }
|
||||||
|
bool operator() (const UInt64 &, const UInt128 &) const { return true; }
|
||||||
bool operator() (const UInt64 & l, const Int64 & r) const { return accurate::lessOp(l, r); }
|
bool operator() (const UInt64 & l, const Int64 & r) const { return accurate::lessOp(l, r); }
|
||||||
bool operator() (const UInt64 & l, const Float64 & r) const { return accurate::lessOp(l, r); }
|
bool operator() (const UInt64 & l, const Float64 & r) const { return accurate::lessOp(l, r); }
|
||||||
bool operator() (const UInt64 &, const String &) const { return true; }
|
bool operator() (const UInt64 &, const String &) const { return true; }
|
||||||
bool operator() (const UInt64 &, const Array &) const { return true; }
|
bool operator() (const UInt64 &, const Array &) const { return true; }
|
||||||
bool operator() (const UInt64 &, const Tuple &) const { return true; }
|
bool operator() (const UInt64 &, const Tuple &) const { return true; }
|
||||||
|
|
||||||
bool operator() (const Int64 &, const Null &) const { return false; }
|
bool operator() (const UInt128 &, const Null &) const { return false; }
|
||||||
|
bool operator() (const UInt128 &, const UInt64) const { return false; }
|
||||||
|
bool operator() (const UInt128 & l, const UInt128 & r) const { return l < r; }
|
||||||
|
bool operator() (const UInt128 &, const Int64) const { return false; }
|
||||||
|
bool operator() (const UInt128 &, const Float64) const { return false; }
|
||||||
|
bool operator() (const UInt128 &, const String &) const { return false; }
|
||||||
|
bool operator() (const UInt128 &, const Array &) const { return false; }
|
||||||
|
bool operator() (const UInt128 &, const Tuple &) const { return false; }
|
||||||
|
|
||||||
|
bool operator() (const Int64 &, const Null &) const { return false; }
|
||||||
bool operator() (const Int64 & l, const UInt64 & r) const { return accurate::lessOp(l, r); }
|
bool operator() (const Int64 & l, const UInt64 & r) const { return accurate::lessOp(l, r); }
|
||||||
|
bool operator() (const Int64 &, const UInt128 &) const { return false; }
|
||||||
bool operator() (const Int64 & l, const Int64 & r) const { return l < r; }
|
bool operator() (const Int64 & l, const Int64 & r) const { return l < r; }
|
||||||
bool operator() (const Int64 & l, const Float64 & r) const { return accurate::lessOp(l, r); }
|
bool operator() (const Int64 & l, const Float64 & r) const { return accurate::lessOp(l, r); }
|
||||||
bool operator() (const Int64 &, const String &) const { return true; }
|
bool operator() (const Int64 &, const String &) const { return true; }
|
||||||
bool operator() (const Int64 &, const Array &) const { return true; }
|
bool operator() (const Int64 &, const Array &) const { return true; }
|
||||||
bool operator() (const Int64 &, const Tuple &) const { return true; }
|
bool operator() (const Int64 &, const Tuple &) const { return true; }
|
||||||
|
|
||||||
bool operator() (const Float64 &, const Null &) const { return false; }
|
bool operator() (const Float64 &, const Null &) const { return false; }
|
||||||
bool operator() (const Float64 & l, const UInt64 & r) const { return accurate::lessOp(l, r); }
|
bool operator() (const Float64 & l, const UInt64 & r) const { return accurate::lessOp(l, r); }
|
||||||
|
bool operator() (const Float64, const UInt128 &) const { return false; }
|
||||||
bool operator() (const Float64 & l, const Int64 & r) const { return accurate::lessOp(l, r); }
|
bool operator() (const Float64 & l, const Int64 & r) const { return accurate::lessOp(l, r); }
|
||||||
bool operator() (const Float64 & l, const Float64 & r) const { return l < r; }
|
bool operator() (const Float64 & l, const Float64 & r) const { return l < r; }
|
||||||
bool operator() (const Float64 &, const String &) const { return true; }
|
bool operator() (const Float64 &, const String &) const { return true; }
|
||||||
bool operator() (const Float64 &, const Array &) const { return true; }
|
bool operator() (const Float64 &, const Array &) const { return true; }
|
||||||
bool operator() (const Float64 &, const Tuple &) const { return true; }
|
bool operator() (const Float64 &, const Tuple &) const { return true; }
|
||||||
|
|
||||||
bool operator() (const String &, const Null &) const { return false; }
|
bool operator() (const String &, const Null &) const { return false; }
|
||||||
bool operator() (const String &, const UInt64 &) const { return false; }
|
bool operator() (const String &, const UInt64 &) const { return false; }
|
||||||
bool operator() (const String &, const Int64 &) const { return false; }
|
bool operator() (const String &, const UInt128 &) const { return false; }
|
||||||
bool operator() (const String &, const Float64 &) const { return false; }
|
bool operator() (const String &, const Int64 &) const { return false; }
|
||||||
|
bool operator() (const String &, const Float64 &) const { return false; }
|
||||||
bool operator() (const String & l, const String & r) const { return l < r; }
|
bool operator() (const String & l, const String & r) const { return l < r; }
|
||||||
bool operator() (const String &, const Array &) const { return true; }
|
bool operator() (const String &, const Array &) const { return true; }
|
||||||
bool operator() (const String &, const Tuple &) const { return true; }
|
bool operator() (const String &, const Tuple &) const { return true; }
|
||||||
|
|
||||||
bool operator() (const Array &, const Null &) const { return false; }
|
bool operator() (const Array &, const Null &) const { return false; }
|
||||||
bool operator() (const Array &, const UInt64 &) const { return false; }
|
bool operator() (const Array &, const UInt64 &) const { return false; }
|
||||||
|
bool operator() (const Array &, const UInt128 &) const { return false; }
|
||||||
bool operator() (const Array &, const Int64 &) const { return false; }
|
bool operator() (const Array &, const Int64 &) const { return false; }
|
||||||
bool operator() (const Array &, const Float64 &) const { return false; }
|
bool operator() (const Array &, const Float64 &) const { return false; }
|
||||||
bool operator() (const Array &, const String &) const { return false; }
|
bool operator() (const Array &, const String &) const { return false; }
|
||||||
@ -294,6 +340,7 @@ public:
|
|||||||
|
|
||||||
bool operator() (const Tuple &, const Null &) const { return false; }
|
bool operator() (const Tuple &, const Null &) const { return false; }
|
||||||
bool operator() (const Tuple &, const UInt64 &) const { return false; }
|
bool operator() (const Tuple &, const UInt64 &) const { return false; }
|
||||||
|
bool operator() (const Tuple &, const UInt128 &) const { return false; }
|
||||||
bool operator() (const Tuple &, const Int64 &) const { return false; }
|
bool operator() (const Tuple &, const Int64 &) const { return false; }
|
||||||
bool operator() (const Tuple &, const Float64 &) const { return false; }
|
bool operator() (const Tuple &, const Float64 &) const { return false; }
|
||||||
bool operator() (const Tuple &, const String &) const { return false; }
|
bool operator() (const Tuple &, const String &) const { return false; }
|
||||||
@ -318,6 +365,7 @@ public:
|
|||||||
bool operator() (Null &) const { throw Exception("Cannot sum Nulls", ErrorCodes::LOGICAL_ERROR); }
|
bool operator() (Null &) const { throw Exception("Cannot sum Nulls", ErrorCodes::LOGICAL_ERROR); }
|
||||||
bool operator() (String &) const { throw Exception("Cannot sum Strings", ErrorCodes::LOGICAL_ERROR); }
|
bool operator() (String &) const { throw Exception("Cannot sum Strings", ErrorCodes::LOGICAL_ERROR); }
|
||||||
bool operator() (Array &) const { throw Exception("Cannot sum Arrays", ErrorCodes::LOGICAL_ERROR); }
|
bool operator() (Array &) const { throw Exception("Cannot sum Arrays", ErrorCodes::LOGICAL_ERROR); }
|
||||||
|
bool operator() (UInt128 &) const { throw Exception("Cannot sum UUIDs", ErrorCodes::LOGICAL_ERROR); }
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ namespace DB
|
|||||||
namespace ErrorCodes
|
namespace ErrorCodes
|
||||||
{
|
{
|
||||||
extern const int EMPTY_DATA_PASSED;
|
extern const int EMPTY_DATA_PASSED;
|
||||||
|
extern const int NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -34,6 +35,11 @@ DataTypePtr FieldToDataType::operator() (const UInt64 & x) const
|
|||||||
return std::make_shared<DataTypeUInt64>();
|
return std::make_shared<DataTypeUInt64>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DataTypePtr FieldToDataType::operator() (const UInt128 &) const
|
||||||
|
{
|
||||||
|
throw Exception("There are no UInt128 literals in SQL", ErrorCodes::NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
DataTypePtr FieldToDataType::operator() (const Int64 & x) const
|
DataTypePtr FieldToDataType::operator() (const Int64 & x) const
|
||||||
{
|
{
|
||||||
if (x <= std::numeric_limits<Int8>::max() && x >= std::numeric_limits<Int8>::min()) return std::make_shared<DataTypeInt8>();
|
if (x <= std::numeric_limits<Int8>::max() && x >= std::numeric_limits<Int8>::min()) return std::make_shared<DataTypeInt8>();
|
||||||
|
@ -19,6 +19,7 @@ class FieldToDataType : public StaticVisitor<DataTypePtr>
|
|||||||
public:
|
public:
|
||||||
DataTypePtr operator() (const Null & x) const;
|
DataTypePtr operator() (const Null & x) const;
|
||||||
DataTypePtr operator() (const UInt64 & x) const;
|
DataTypePtr operator() (const UInt64 & x) const;
|
||||||
|
DataTypePtr operator() (const UInt128 & x) const;
|
||||||
DataTypePtr operator() (const Int64 & x) const;
|
DataTypePtr operator() (const Int64 & x) const;
|
||||||
DataTypePtr operator() (const Float64 & x) const;
|
DataTypePtr operator() (const Float64 & x) const;
|
||||||
DataTypePtr operator() (const String & x) const;
|
DataTypePtr operator() (const String & x) const;
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
1
|
||||||
|
0
|
||||||
|
0
|
||||||
|
0
|
||||||
|
1
|
||||||
|
1
|
21
dbms/tests/queries/0_stateless/00679_uuid_in_key.sql
Normal file
21
dbms/tests/queries/0_stateless/00679_uuid_in_key.sql
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
USE test;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS uuid
|
||||||
|
(
|
||||||
|
created_at DateTime,
|
||||||
|
id UUID
|
||||||
|
)
|
||||||
|
ENGINE = MergeTree
|
||||||
|
PARTITION BY toDate(created_at)
|
||||||
|
ORDER BY (created_at, id);
|
||||||
|
|
||||||
|
INSERT INTO uuid (created_at, id) VALUES ('2018-01-01 01:02:03', '00000000-0000-03f8-9cb8-cb1b82fb3900');
|
||||||
|
|
||||||
|
SELECT count() FROM uuid WHERE id = '00000000-0000-03f8-9cb8-cb1b82fb3900';
|
||||||
|
SELECT count() FROM uuid WHERE id != '00000000-0000-03f8-9cb8-cb1b82fb3900';
|
||||||
|
SELECT count() FROM uuid WHERE id < '00000000-0000-03f8-9cb8-cb1b82fb3900';
|
||||||
|
SELECT count() FROM uuid WHERE id > '00000000-0000-03f8-9cb8-cb1b82fb3900';
|
||||||
|
SELECT count() FROM uuid WHERE id <= '00000000-0000-03f8-9cb8-cb1b82fb3900';
|
||||||
|
SELECT count() FROM uuid WHERE id >= '00000000-0000-03f8-9cb8-cb1b82fb3900';
|
||||||
|
|
||||||
|
DROP TABLE uuid;
|
Loading…
Reference in New Issue
Block a user