From 330053959ed319a6c1525716689afe80743626aa Mon Sep 17 00:00:00 2001 From: Xiang Fu Date: Tue, 4 Aug 2026 01:13:35 -0700 Subject: [PATCH 1/2] Support UUID literals in request context --- .../request/context/LiteralContext.java | 3 +++ .../common/utils/request/RequestUtils.java | 5 +++++ .../request/context/LiteralContextTest.java | 11 ++++++++++ .../utils/request/RequestUtilsTest.java | 22 +++++++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/pinot-common/src/main/java/org/apache/pinot/common/request/context/LiteralContext.java b/pinot-common/src/main/java/org/apache/pinot/common/request/context/LiteralContext.java index 744cdca228f8..8ac681fe3fe0 100644 --- a/pinot-common/src/main/java/org/apache/pinot/common/request/context/LiteralContext.java +++ b/pinot-common/src/main/java/org/apache/pinot/common/request/context/LiteralContext.java @@ -174,6 +174,9 @@ private static PinotDataType getPinotDataType(DataType type, @Nullable Object va return PinotDataType.BIG_DECIMAL; case STRING: return singleValue ? PinotDataType.STRING : PinotDataType.STRING_ARRAY; + case UUID: + Preconditions.checkState(singleValue, "UUID array is not supported"); + return PinotDataType.UUID; default: throw new IllegalStateException("Unsupported DataType: " + type); } diff --git a/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java b/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java index 9545275d8209..10e0ccfd565d 100644 --- a/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java +++ b/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java @@ -36,6 +36,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.stream.Collectors; import javax.annotation.Nullable; import org.apache.calcite.sql.SqlKind; @@ -58,6 +59,7 @@ import org.apache.pinot.spi.utils.CommonConstants; import org.apache.pinot.spi.utils.CommonConstants.Broker.Request; import org.apache.pinot.spi.utils.TimestampIndexUtils; +import org.apache.pinot.spi.utils.UuidUtils; import org.apache.pinot.sql.FilterKind; import org.apache.pinot.sql.parsers.CalciteSqlParser; import org.apache.pinot.sql.parsers.SqlCompilationException; @@ -202,6 +204,9 @@ public static Literal getLiteral(@Nullable Object object) { if (object instanceof Timestamp) { return getLiteral(((Timestamp) object).getTime()); } + if (object instanceof UUID) { + return getLiteral(UuidUtils.toBytes((UUID) object)); + } if (object instanceof String) { return getLiteral((String) object); } diff --git a/pinot-common/src/test/java/org/apache/pinot/common/request/context/LiteralContextTest.java b/pinot-common/src/test/java/org/apache/pinot/common/request/context/LiteralContextTest.java index 9a1b9bf7feae..e1ac283c4401 100644 --- a/pinot-common/src/test/java/org/apache/pinot/common/request/context/LiteralContextTest.java +++ b/pinot-common/src/test/java/org/apache/pinot/common/request/context/LiteralContextTest.java @@ -20,11 +20,13 @@ import java.math.BigDecimal; import java.sql.Timestamp; +import java.util.UUID; import org.apache.pinot.common.request.Literal; import org.apache.pinot.spi.data.FieldSpec.DataType; import org.apache.pinot.spi.utils.BigDecimalUtils; import org.apache.pinot.spi.utils.BytesUtils; import org.apache.pinot.spi.utils.CommonConstants.NullValuePlaceHolder; +import org.apache.pinot.spi.utils.UuidUtils; import org.testng.annotations.Test; import static org.testng.Assert.*; @@ -222,4 +224,13 @@ public void testBytesLiteral() { assertFalse(literalContext.isNull()); assertEquals(literalContext.toString(), "'deadbeef'"); } + + @Test + public void testUuidLiteral() { + UUID uuid = UUID.fromString("550e8400-e29b-41d4-a716-446655440000"); + LiteralContext literalContext = new LiteralContext(DataType.UUID, uuid); + + assertEquals(literalContext.getStringValue(), uuid.toString()); + assertEquals(literalContext.getBytesValue(), UuidUtils.toBytes(uuid)); + } } diff --git a/pinot-common/src/test/java/org/apache/pinot/common/utils/request/RequestUtilsTest.java b/pinot-common/src/test/java/org/apache/pinot/common/utils/request/RequestUtilsTest.java index 2ab30c9603a0..c489740fb073 100644 --- a/pinot-common/src/test/java/org/apache/pinot/common/utils/request/RequestUtilsTest.java +++ b/pinot-common/src/test/java/org/apache/pinot/common/utils/request/RequestUtilsTest.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.Set; +import java.util.UUID; import org.apache.calcite.sql.SqlDialect; import org.apache.calcite.sql.SqlKind; import org.apache.calcite.sql.SqlLiteral; @@ -28,6 +29,8 @@ import org.apache.pinot.common.request.ExpressionType; import org.apache.pinot.common.request.Function; import org.apache.pinot.common.request.Identifier; +import org.apache.pinot.common.request.Literal; +import org.apache.pinot.spi.utils.UuidUtils; import org.apache.pinot.sql.parsers.CalciteSqlParser; import org.apache.pinot.sql.parsers.PinotSqlType; import org.apache.pinot.sql.parsers.SqlNodeAndOptions; @@ -88,6 +91,25 @@ public void testGetLiteralExpressionForPrimitiveLong() { assertEquals(literalExpression.getLiteral().getLongValue(), 4500L); } + @Test + public void testGetLiteralForUuid() { + UUID uuid = UUID.fromString("550e8400-e29b-41d4-a716-446655440000"); + Literal literal = RequestUtils.getLiteral(uuid); + + assertTrue(literal.isSetBinaryValue()); + assertEquals(literal.getBinaryValue(), UuidUtils.toBytes(uuid)); + } + + @Test + public void testUuidCastFoldsToBinaryLiteral() { + UUID uuid = UUID.fromString("550e8400-e29b-41d4-a716-446655440000"); + Expression expression = CalciteSqlParser.compileToPinotQuery( + "SELECT CAST('" + uuid + "' AS UUID) FROM myTable").getSelectList().get(0); + + assertTrue(expression.isSetLiteral()); + assertEquals(expression.getLiteral().getBinaryValue(), UuidUtils.toBytes(uuid)); + } + @Test public void testParseQuery() { SqlNodeAndOptions result = RequestUtils.parseQuery("select foo from countries where bar > 1"); From 09a8e93506b7ea6ea06eea5bd15decabf8ebf5cb Mon Sep 17 00:00:00 2001 From: Xiang Fu Date: Tue, 4 Aug 2026 11:25:27 -0700 Subject: [PATCH 2/2] Address UUID literal review comments --- .../apache/pinot/common/request/context/LiteralContext.java | 1 + .../org/apache/pinot/common/utils/request/RequestUtils.java | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pinot-common/src/main/java/org/apache/pinot/common/request/context/LiteralContext.java b/pinot-common/src/main/java/org/apache/pinot/common/request/context/LiteralContext.java index 8ac681fe3fe0..15c56cffddc2 100644 --- a/pinot-common/src/main/java/org/apache/pinot/common/request/context/LiteralContext.java +++ b/pinot-common/src/main/java/org/apache/pinot/common/request/context/LiteralContext.java @@ -147,6 +147,7 @@ public LiteralContext(DataType type, @Nullable Object value) { _pinotDataType = getPinotDataType(type, value); } + // TODO: Revisit MV support for BOOLEAN, BIG_DECIMAL, BYTES and UUID. @Nullable private static PinotDataType getPinotDataType(DataType type, @Nullable Object value) { if (value == null) { diff --git a/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java b/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java index 10e0ccfd565d..20e1765d0f17 100644 --- a/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java +++ b/pinot-common/src/main/java/org/apache/pinot/common/utils/request/RequestUtils.java @@ -204,15 +204,15 @@ public static Literal getLiteral(@Nullable Object object) { if (object instanceof Timestamp) { return getLiteral(((Timestamp) object).getTime()); } - if (object instanceof UUID) { - return getLiteral(UuidUtils.toBytes((UUID) object)); - } if (object instanceof String) { return getLiteral((String) object); } if (object instanceof byte[]) { return getLiteral((byte[]) object); } + if (object instanceof UUID) { + return getLiteral(UuidUtils.toBytes((UUID) object)); + } if (object instanceof int[]) { return getLiteral((int[]) object); }