Fix generateUUIDv4

This commit is contained in:
Alexey Milovidov 2021-05-04 20:47:35 +03:00
parent 617a58b857
commit a9a885bc43

View File

@ -32,21 +32,22 @@ public:
ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t input_rows_count) const override ColumnPtr executeImpl(const ColumnsWithTypeAndName &, const DataTypePtr &, size_t input_rows_count) const override
{ {
auto col_res = ColumnVector<UInt128>::create(); auto col_res = ColumnVector<UUID>::create();
typename ColumnVector<UInt128>::Container & vec_to = col_res->getData(); typename ColumnVector<UUID>::Container & vec_to = col_res->getData();
size_t size = input_rows_count; size_t size = input_rows_count;
vec_to.resize(size); vec_to.resize(size);
/// RandImpl is target-dependent and is not the same in different TargetSpecific namespaces. /// RandImpl is target-dependent and is not the same in different TargetSpecific namespaces.
RandImpl::execute(reinterpret_cast<char *>(vec_to.data()), vec_to.size() * sizeof(UInt128)); RandImpl::execute(reinterpret_cast<char *>(vec_to.data()), vec_to.size() * sizeof(UUID));
for (UInt128 & uuid: vec_to) for (UUID & uuid : vec_to)
{ {
/** https://tools.ietf.org/html/rfc4122#section-4.4 /// https://tools.ietf.org/html/rfc4122#section-4.4
*/
uuid.items[0] = (uuid.items[0] & 0xffffffffffff0fffull) | 0x0000000000004000ull; UInt128 & impl = uuid.toUnderType();
uuid.items[1] = (uuid.items[1] & 0x3fffffffffffffffull) | 0x8000000000000000ull; impl.items[0] = (impl.items[0] & 0xffffffffffff0fffull) | 0x0000000000004000ull;
impl.items[1] = (impl.items[1] & 0x3fffffffffffffffull) | 0x8000000000000000ull;
} }
return col_res; return col_res;