You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by lq...@apache.org on 2025/09/02 06:49:24 UTC

(pinot) branch release-1.4.0-rc updated: Make VARIANT/UUID non reserved keyword (#16471)

This is an automated email from the ASF dual-hosted git repository.

lqc pushed a commit to branch release-1.4.0-rc
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/release-1.4.0-rc by this push:
     new c22287e184b Make VARIANT/UUID non reserved keyword (#16471)
c22287e184b is described below

commit c22287e184b817da9cf86c44d9e82195a660c21c
Author: Xiaotian (Jackie) Jiang <17...@users.noreply.github.com>
AuthorDate: Wed Jul 30 14:57:59 2025 -0600

    Make VARIANT/UUID non reserved keyword (#16471)
---
 pinot-common/src/main/codegen/config.fmpp          | 21 +++++---
 .../pinot/sql/parsers/CalciteSqlParserTest.java    | 56 ++++++++++++++++------
 .../transform/function/CastTransformFunction.java  | 14 +++---
 3 files changed, 63 insertions(+), 28 deletions(-)

diff --git a/pinot-common/src/main/codegen/config.fmpp b/pinot-common/src/main/codegen/config.fmpp
index 65de367c242..29f10c29198 100644
--- a/pinot-common/src/main/codegen/config.fmpp
+++ b/pinot-common/src/main/codegen/config.fmpp
@@ -44,10 +44,15 @@ data: {
     keywords: [
       "FILE"
       "ARCHIVE"
-      "BIG_DECIMAL"
-      "BYTES"
+      # Pinot types allowed in CAST function
+      # LONG - for BIGINT
+      # BIG_DECIMAL - for DECIMAL
+      # STRING - for VARCHAR
+      # BYTES - for VARBINARY
       "LONG"
+      "BIG_DECIMAL"
       "STRING"
+      "BYTES"
     ]
 
     # List of non-reserved keywords to add;
@@ -55,14 +60,16 @@ data: {
     nonReservedKeywordsToAdd: [
       "FILE"
       "ARCHIVE"
-      "BIG_DECIMAL"
-      "BYTES"
-      "LONG"
-      "STRING"
       # Pinot allows using DEFAULT as the catalog name
       "DEFAULT_"
-      # Pinot allows using DATETIME as column name
+      # Pinot allows using LONG/BIG_DECIMAL/STRING/BYTES/DATETIME/VARIANT/UUID as column name
+      "LONG"
+      "BIG_DECIMAL"
+      "STRING"
+      "BYTES"
       "DATETIME"
+      "VARIANT"
+      "UUID"
 
       # The following keywords are reserved in core Calcite,
       # are reserved in some version of SQL,
diff --git a/pinot-common/src/test/java/org/apache/pinot/sql/parsers/CalciteSqlParserTest.java b/pinot-common/src/test/java/org/apache/pinot/sql/parsers/CalciteSqlParserTest.java
index e0ec9f18c12..64479b8c313 100644
--- a/pinot-common/src/test/java/org/apache/pinot/sql/parsers/CalciteSqlParserTest.java
+++ b/pinot-common/src/test/java/org/apache/pinot/sql/parsers/CalciteSqlParserTest.java
@@ -18,38 +18,66 @@
  */
 package org.apache.pinot.sql.parsers;
 
+import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import static org.apache.pinot.sql.parsers.CalciteSqlParser.CALCITE_SQL_PARSER_IDENTIFIER_MAX_LENGTH;
 import static org.testng.Assert.assertThrows;
-import static org.testng.Assert.fail;
+
 
 public class CalciteSqlParserTest {
   private static final String SINGLE_CHAR = "a";
+  private static final String QUERY_TEMPLATE = "SELECT %s FROM %s";
 
   @Test
   public void testIdentifierLength() {
     String tableName = extendIdentifierToMaxLength("exampleTable");
     String columnName = extendIdentifierToMaxLength("exampleColumn");
 
-    try {
-      final String validQuery = "SELECT count(" + columnName + ") FROM " + tableName + " WHERE " + columnName
-          + " IS NOT NULL";
-      CalciteSqlParser.compileToPinotQuery(validQuery);
-    } catch (Exception ignore) {
-      // Should not reach this line
-      fail();
-    }
-
-    final String invalidTableNameQuery = "SELECT count(" + columnName + ") FROM " + tableName + SINGLE_CHAR + " WHERE "
-        + columnName + " IS NOT NULL";
-    final String invalidColumnNameQuery = "SELECT count(" + columnName + SINGLE_CHAR + ") FROM " + tableName + " WHERE "
-        + columnName + SINGLE_CHAR + " IS NOT NULL";
+    String validQuery = createQuery(tableName, columnName);
+    CalciteSqlParser.compileToPinotQuery(validQuery);
+
+    String invalidTableNameQuery = createQuery(columnName, tableName + SINGLE_CHAR);
     assertThrows(SqlCompilationException.class, () -> CalciteSqlParser.compileToPinotQuery(invalidTableNameQuery));
+    String invalidColumnNameQuery = createQuery(columnName + SINGLE_CHAR, tableName);
     assertThrows(SqlCompilationException.class, () -> CalciteSqlParser.compileToPinotQuery(invalidColumnNameQuery));
   }
 
   private String extendIdentifierToMaxLength(String identifier) {
     return identifier + SINGLE_CHAR.repeat(CALCITE_SQL_PARSER_IDENTIFIER_MAX_LENGTH - identifier.length());
   }
+
+  private String createQuery(String columnName, String tableName) {
+    return String.format(QUERY_TEMPLATE, columnName, tableName);
+  }
+
+  @Test(dataProvider = "nonReservedKeywords")
+  public void testNonReservedKeywords(String keyword) {
+    CalciteSqlParser.compileToPinotQuery(createQuery(keyword, "testTable"));
+    CalciteSqlParser.compileToPinotQuery(createQuery(keyword.toUpperCase(), "testTable"));
+  }
+
+  @DataProvider
+  public static Object[][] nonReservedKeywords() {
+    return new Object[][]{
+        new Object[]{"int"},
+        new Object[]{"integer"},
+        new Object[]{"long"},
+        new Object[]{"bigint"},
+        new Object[]{"float"},
+        new Object[]{"double"},
+        new Object[]{"big_decimal"},
+        new Object[]{"decimal"},
+        new Object[]{"boolean"},
+        // TODO: Revisit if we should make "timestamp" non reserved
+//        new Object[]{"timestamp"},
+        new Object[]{"string"},
+        new Object[]{"varchar"},
+        new Object[]{"bytes"},
+        new Object[]{"binary"},
+        new Object[]{"varbinary"},
+        new Object[]{"variant"},
+        new Object[]{"uuid"}
+    };
+  }
 }
diff --git a/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/function/CastTransformFunction.java b/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/function/CastTransformFunction.java
index fd51113f06b..0c2bd7e1d64 100644
--- a/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/function/CastTransformFunction.java
+++ b/pinot-core/src/main/java/org/apache/pinot/core/operator/transform/function/CastTransformFunction.java
@@ -57,10 +57,6 @@ public class CastTransformFunction extends BaseTransformFunction {
     if (castFormatTransformFunction instanceof LiteralTransformFunction) {
       String targetType = ((LiteralTransformFunction) castFormatTransformFunction).getStringLiteral().toUpperCase();
       switch (targetType) {
-        case "BYTES":
-        case "VARBINARY":
-          _resultMetadata = sourceSV ? BYTES_SV_NO_DICTIONARY_METADATA : BYTES_MV_NO_DICTIONARY_METADATA;
-          break;
         case "INT":
         case "INTEGER":
           _resultMetadata = sourceSV ? INT_SV_NO_DICTIONARY_METADATA : INT_MV_NO_DICTIONARY_METADATA;
@@ -93,6 +89,13 @@ public class CastTransformFunction extends BaseTransformFunction {
         case "VARCHAR":
           _resultMetadata = sourceSV ? STRING_SV_NO_DICTIONARY_METADATA : STRING_MV_NO_DICTIONARY_METADATA;
           break;
+        case "JSON":
+          _resultMetadata = sourceSV ? JSON_SV_NO_DICTIONARY_METADATA : JSON_MV_NO_DICTIONARY_METADATA;
+          break;
+        case "BYTES":
+        case "VARBINARY":
+          _resultMetadata = sourceSV ? BYTES_SV_NO_DICTIONARY_METADATA : BYTES_MV_NO_DICTIONARY_METADATA;
+          break;
         case "INT_ARRAY":
         case "INTEGER_ARRAY":
           _resultMetadata = INT_MV_NO_DICTIONARY_METADATA;
@@ -110,9 +113,6 @@ public class CastTransformFunction extends BaseTransformFunction {
         case "VARCHAR_ARRAY":
           _resultMetadata = STRING_MV_NO_DICTIONARY_METADATA;
           break;
-        case "JSON":
-          _resultMetadata = sourceSV ? JSON_SV_NO_DICTIONARY_METADATA : JSON_MV_NO_DICTIONARY_METADATA;
-          break;
         default:
           throw new IllegalArgumentException("Unable to cast expression to type - " + targetType);
       }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org