diff --git a/core/trino-main/pom.xml b/core/trino-main/pom.xml
index 834aaf1bf6a7..1e2cf9fd75b5 100644
--- a/core/trino-main/pom.xml
+++ b/core/trino-main/pom.xml
@@ -44,6 +44,12 @@
jackson-databind
+
+ com.fasterxml.uuid
+ java-uuid-generator
+ 5.1.0
+
+
com.github.oshi
oshi-core
diff --git a/core/trino-main/src/main/java/io/trino/type/UuidOperators.java b/core/trino-main/src/main/java/io/trino/type/UuidOperators.java
index e2fc127365f3..d275c7433acd 100644
--- a/core/trino-main/src/main/java/io/trino/type/UuidOperators.java
+++ b/core/trino-main/src/main/java/io/trino/type/UuidOperators.java
@@ -13,8 +13,13 @@
*/
package io.trino.type;
+import com.fasterxml.uuid.Generators;
+import com.fasterxml.uuid.impl.RandomBasedGenerator;
+import com.fasterxml.uuid.impl.TimeBasedEpochRandomGenerator;
+import com.fasterxml.uuid.impl.TimeBasedReorderedGenerator;
import io.airlift.slice.Slice;
import io.trino.spi.TrinoException;
+import io.trino.spi.function.Constraint;
import io.trino.spi.function.Description;
import io.trino.spi.function.LiteralParameters;
import io.trino.spi.function.ScalarFunction;
@@ -28,18 +33,62 @@
import static io.trino.spi.function.OperatorType.CAST;
import static io.trino.spi.type.UuidType.javaUuidToTrinoUuid;
import static io.trino.spi.type.UuidType.trinoUuidToJavaUuid;
-import static java.util.UUID.randomUUID;
public final class UuidOperators
{
+ // All generators are thread safe
+ private static final RandomBasedGenerator V4_GENERATOR = Generators.randomBasedGenerator();
+ private static final TimeBasedReorderedGenerator V6_GENERATOR = Generators.timeBasedReorderedGenerator();
+ private static final TimeBasedEpochRandomGenerator V7_GENERATOR = Generators.timeBasedEpochRandomGenerator();
+
private UuidOperators() {}
- @Description("Generates a random UUID")
- @ScalarFunction(deterministic = false)
+ @Description("Generates a random UUID v4 (RFC 4122)")
+ @ScalarFunction(deterministic = false, alias = "uuid_v4")
@SqlType(StandardTypes.UUID)
public static Slice uuid()
{
- java.util.UUID uuid = randomUUID();
+ java.util.UUID uuid = V4_GENERATOR.generate();
+ return javaUuidToTrinoUuid(uuid);
+ }
+
+ @Description("Generates a random UUID v6 (RFC-9562)")
+ @ScalarFunction(deterministic = false)
+ @SqlType(StandardTypes.UUID)
+ public static Slice uuid_v6()
+ {
+ java.util.UUID uuid = V6_GENERATOR.generate();
+ return javaUuidToTrinoUuid(uuid);
+ }
+
+ @Description("Generates a random UUID v6 from a given timestamp (RFC-9562)")
+ @ScalarFunction
+ @SqlType(StandardTypes.UUID)
+ @LiteralParameters("u")
+ @Constraint(variable = "u", expression = "min(u, 6)")
+ public static Slice uuid_v6(@SqlType("timestamp(u) with time zone") long rawTimestamp)
+ {
+ java.util.UUID uuid = V6_GENERATOR.construct(rawTimestamp);
+ return javaUuidToTrinoUuid(uuid);
+ }
+
+ @Description("Generates a random UUID v7 (RFC-9562)")
+ @ScalarFunction(deterministic = false)
+ @SqlType(StandardTypes.UUID)
+ public static Slice uuid_v7()
+ {
+ java.util.UUID uuid = V7_GENERATOR.generate();
+ return javaUuidToTrinoUuid(uuid);
+ }
+
+ @Description("Generates a random UUID v7 from a given timestamp (RFC-9562)")
+ @ScalarFunction(deterministic = false)
+ @SqlType(StandardTypes.UUID)
+ @LiteralParameters("u")
+ @Constraint(variable = "u", expression = "min(u, 6)")
+ public static Slice uuid_v7(@SqlType("timestamp(u) with time zone") long rawTimestamp)
+ {
+ java.util.UUID uuid = V7_GENERATOR.construct(rawTimestamp);
return javaUuidToTrinoUuid(uuid);
}