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