mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 16:42:05 +00:00
Merge branch 'simPod-uuid-fix'
This commit is contained in:
commit
8ae0186e5b
@ -4,6 +4,7 @@
|
||||
#include <IO/WriteHelpers.h>
|
||||
#include <IO/ReadBufferFromString.h>
|
||||
#include <IO/WriteBufferFromString.h>
|
||||
#include <IO/Operators.h>
|
||||
#include <Common/FieldVisitors.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 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
|
||||
{
|
||||
@ -47,14 +55,14 @@ String FieldVisitorDump::operator() (const Array & x) const
|
||||
{
|
||||
WriteBufferFromOwnString wb;
|
||||
|
||||
wb.write("Array_[", 7);
|
||||
wb << "Array_[";
|
||||
for (auto it = x.begin(); it != x.end(); ++it)
|
||||
{
|
||||
if (it != x.begin())
|
||||
wb.write(", ", 2);
|
||||
writeString(applyVisitor(*this, *it), wb);
|
||||
wb << ", ";
|
||||
wb << applyVisitor(*this, *it);
|
||||
}
|
||||
writeChar(']', wb);
|
||||
wb << ']';
|
||||
|
||||
return wb.str();
|
||||
}
|
||||
@ -64,14 +72,14 @@ String FieldVisitorDump::operator() (const Tuple & x_def) const
|
||||
auto & x = x_def.toUnderType();
|
||||
WriteBufferFromOwnString wb;
|
||||
|
||||
wb.write("Tuple_(", 7);
|
||||
wb << "Tuple_(";
|
||||
for (auto it = x.begin(); it != x.end(); ++it)
|
||||
{
|
||||
if (it != x.begin())
|
||||
wb.write(", ", 2);
|
||||
writeString(applyVisitor(*this, *it), wb);
|
||||
wb << ", ";
|
||||
wb << applyVisitor(*this, *it);
|
||||
}
|
||||
writeChar(')', wb);
|
||||
wb << ')';
|
||||
|
||||
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 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
|
||||
{
|
||||
WriteBufferFromOwnString wb;
|
||||
|
||||
writeChar('[', wb);
|
||||
wb << '[';
|
||||
for (Array::const_iterator it = x.begin(); it != x.end(); ++it)
|
||||
{
|
||||
if (it != x.begin())
|
||||
wb.write(", ", 2);
|
||||
writeString(applyVisitor(*this, *it), wb);
|
||||
wb << applyVisitor(*this, *it);
|
||||
}
|
||||
writeChar(']', wb);
|
||||
wb << ']';
|
||||
|
||||
return wb.str();
|
||||
}
|
||||
@ -127,14 +140,14 @@ String FieldVisitorToString::operator() (const Tuple & x_def) const
|
||||
auto & x = x_def.toUnderType();
|
||||
WriteBufferFromOwnString wb;
|
||||
|
||||
writeChar('(', wb);
|
||||
wb << '(';
|
||||
for (auto it = x.begin(); it != x.end(); ++it)
|
||||
{
|
||||
if (it != x.begin())
|
||||
wb.write(", ", 2);
|
||||
writeString(applyVisitor(*this, *it), wb);
|
||||
wb << ", ";
|
||||
wb << applyVisitor(*this, *it);
|
||||
}
|
||||
writeChar(')', wb);
|
||||
wb << ')';
|
||||
|
||||
return wb.str();
|
||||
}
|
||||
@ -155,6 +168,13 @@ void FieldVisitorHash::operator() (const UInt64 & x) const
|
||||
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
|
||||
{
|
||||
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::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::Float64: return visitor(field.template get<Float64>());
|
||||
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::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::Float64: return visitor(field1, field2.template get<Float64>());
|
||||
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:
|
||||
return applyBinaryVisitorImpl(
|
||||
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:
|
||||
return applyBinaryVisitorImpl(
|
||||
std::forward<Visitor>(visitor), field1.template get<Int64>(), std::forward<F2>(field2));
|
||||
@ -107,6 +112,7 @@ class FieldVisitorToString : public StaticVisitor<String>
|
||||
public:
|
||||
String operator() (const Null & x) const;
|
||||
String operator() (const UInt64 & x) const;
|
||||
String operator() (const UInt128 & x) const;
|
||||
String operator() (const Int64 & x) const;
|
||||
String operator() (const Float64 & x) const;
|
||||
String operator() (const String & x) const;
|
||||
@ -121,6 +127,7 @@ class FieldVisitorDump : public StaticVisitor<String>
|
||||
public:
|
||||
String operator() (const Null & x) const;
|
||||
String operator() (const UInt64 & x) const;
|
||||
String operator() (const UInt128 & x) const;
|
||||
String operator() (const Int64 & x) const;
|
||||
String operator() (const Float64 & x) const;
|
||||
String operator() (const String & x) const;
|
||||
@ -157,6 +164,11 @@ public:
|
||||
T operator() (const UInt64 & x) const { return x; }
|
||||
T operator() (const Int64 & 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 UInt64 & x) const;
|
||||
void operator() (const UInt128 & x) const;
|
||||
void operator() (const Int64 & x) const;
|
||||
void operator() (const Float64 & x) const;
|
||||
void operator() (const String & x) const;
|
||||
@ -180,12 +193,15 @@ public:
|
||||
/** 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).
|
||||
*
|
||||
* TODO Comparisons of UInt128 with different type are incorrect.
|
||||
*/
|
||||
class FieldVisitorAccurateEquals : public StaticVisitor<bool>
|
||||
{
|
||||
public:
|
||||
bool operator() (const Null &, const Null &) const { return true; }
|
||||
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 Float64 &) const { return false; }
|
||||
bool operator() (const Null &, const String &) const { return false; }
|
||||
@ -194,14 +210,25 @@ public:
|
||||
|
||||
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 &, 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 Float64 & r) const { return accurate::equalsOp(l, r); }
|
||||
bool operator() (const UInt64 &, const String &) const { return false; }
|
||||
bool operator() (const UInt64 &, const Array &) const { return false; }
|
||||
bool operator() (const UInt64 &, const Tuple &) 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 &, const UInt128) const { return false; }
|
||||
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 &, const String &) const { return false; }
|
||||
@ -210,6 +237,7 @@ public:
|
||||
|
||||
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 &, 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 Float64 & r) const { return l == r; }
|
||||
bool operator() (const Float64 &, const String &) const { return false; }
|
||||
@ -218,6 +246,7 @@ public:
|
||||
|
||||
bool operator() (const String &, const Null &) 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 Float64 &) const { return false; }
|
||||
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 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 Float64 &) 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 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 Float64 &) const { return false; }
|
||||
bool operator() (const Tuple &, const String &) const { return false; }
|
||||
@ -247,6 +278,7 @@ public:
|
||||
bool operator() (const Null &, const Null &) const { return false; }
|
||||
bool operator() (const Null &, const UInt64 &) 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 String &) const { return true; }
|
||||
bool operator() (const Null &, const Array &) const { return true; }
|
||||
@ -254,14 +286,25 @@ public:
|
||||
|
||||
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 &, 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 Float64 & r) const { return accurate::lessOp(l, r); }
|
||||
bool operator() (const UInt64 &, const String &) const { return true; }
|
||||
bool operator() (const UInt64 &, const Array &) const { return true; }
|
||||
bool operator() (const UInt64 &, const Tuple &) const { return true; }
|
||||
|
||||
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 &, const UInt128 &) const { return false; }
|
||||
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 &, const String &) const { return true; }
|
||||
@ -270,6 +313,7 @@ public:
|
||||
|
||||
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, 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 Float64 & r) const { return l < r; }
|
||||
bool operator() (const Float64 &, const String &) const { return true; }
|
||||
@ -278,6 +322,7 @@ public:
|
||||
|
||||
bool operator() (const String &, const Null &) 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 Float64 &) const { return false; }
|
||||
bool operator() (const String & l, const String & r) const { return l < r; }
|
||||
@ -286,6 +331,7 @@ public:
|
||||
|
||||
bool operator() (const Array &, const Null &) 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 Float64 &) 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 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 Float64 &) 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() (String &) const { throw Exception("Cannot sum Strings", 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
|
||||
{
|
||||
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>();
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
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:
|
||||
DataTypePtr operator() (const Null & x) const;
|
||||
DataTypePtr operator() (const UInt64 & x) const;
|
||||
DataTypePtr operator() (const UInt128 & x) const;
|
||||
DataTypePtr operator() (const Int64 & x) const;
|
||||
DataTypePtr operator() (const Float64 & 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