From c745a0b64191e8230c9b809dfa708458dcee385d Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Thu, 27 Nov 2025 21:56:28 +0100 Subject: [PATCH] Add uuid_v6 and uuid_v7 functions --- core/trino-main/pom.xml | 6 ++ .../java/io/trino/type/UuidOperators.java | 57 +++++++++++++++++-- 2 files changed, 59 insertions(+), 4 deletions(-) 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); }