This is an automated email from the ASF dual-hosted git repository.
abhishek pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push:
new 81c37c6515 Add validation for invalid partitioned by granularities
(#12589)
81c37c6515 is described below
commit 81c37c651586b774a226e147d463c743928cdb8a
Author: Laksh Singla <[email protected]>
AuthorDate: Mon Jun 6 22:00:29 2022 +0530
Add validation for invalid partitioned by granularities (#12589)
* Add validation for invalid partitioned by granularities
* review comments
* improve error message, change location of the method
* remove imports
* use StringUtils.lowercase
Co-authored-by: Adarsh Sanjeev <[email protected]>
---
sql/src/main/codegen/includes/common.ftl | 1 +
.../sql/calcite/parser/DruidSqlParserUtils.java | 23 ++++++++++++++++++++++
.../druid/sql/calcite/CalciteInsertDmlTest.java | 17 ++++++++++++++++
3 files changed, 41 insertions(+)
diff --git a/sql/src/main/codegen/includes/common.ftl
b/sql/src/main/codegen/includes/common.ftl
index 5b74df6332..95ad1b509c 100644
--- a/sql/src/main/codegen/includes/common.ftl
+++ b/sql/src/main/codegen/includes/common.ftl
@@ -65,6 +65,7 @@ org.apache.druid.java.util.common.Pair<Granularity, String>
PartitionGranularity
e = Expression(ExprContext.ACCEPT_SUB_QUERY)
{
granularity =
DruidSqlParserUtils.convertSqlNodeToGranularityThrowingParseExceptions(e);
+
DruidSqlParserUtils.throwIfUnsupportedGranularityInPartitionedBy(granularity);
unparseString = e.toString();
}
)
diff --git
a/sql/src/main/java/org/apache/druid/sql/calcite/parser/DruidSqlParserUtils.java
b/sql/src/main/java/org/apache/druid/sql/calcite/parser/DruidSqlParserUtils.java
index 3100fbb880..cc67cff119 100644
---
a/sql/src/main/java/org/apache/druid/sql/calcite/parser/DruidSqlParserUtils.java
+++
b/sql/src/main/java/org/apache/druid/sql/calcite/parser/DruidSqlParserUtils.java
@@ -32,8 +32,10 @@ import org.apache.calcite.sql.SqlNodeList;
import org.apache.calcite.sql.SqlOrderBy;
import org.apache.calcite.sql.SqlTimestampLiteral;
import org.apache.calcite.tools.ValidationException;
+import org.apache.druid.java.util.common.IAE;
import org.apache.druid.java.util.common.StringUtils;
import org.apache.druid.java.util.common.granularity.Granularity;
+import org.apache.druid.java.util.common.granularity.GranularityType;
import org.apache.druid.java.util.common.granularity.PeriodGranularity;
import org.apache.druid.java.util.common.logger.Logger;
import org.apache.druid.query.filter.AndDimFilter;
@@ -56,6 +58,7 @@ import org.joda.time.base.AbstractInterval;
import java.sql.Timestamp;
import java.time.ZonedDateTime;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@@ -413,4 +416,24 @@ public class DruidSqlParserUtils
ZonedDateTime zonedTimestamp =
sqlTimestamp.toLocalDateTime().atZone(timeZone.toTimeZone().toZoneId());
return String.valueOf(zonedTimestamp.toInstant().toEpochMilli());
}
+
+ /**
+ * Throws an IAE with appropriate message if the granularity supplied is not
present in
+ * {@link org.apache.druid.java.util.common.granularity.Granularities}. It
also filters out NONE as it is not a valid
+ * granularity that can be supplied in PARTITIONED BY
+ */
+ public static void throwIfUnsupportedGranularityInPartitionedBy(Granularity
granularity)
+ {
+ if (!GranularityType.isStandard(granularity)) {
+ throw new IAE(
+ "The granularity specified in PARTITIONED BY is not supported. "
+ + "Please use an equivalent of these granularities: %s.",
+ Arrays.stream(GranularityType.values())
+ .filter(granularityType ->
!granularityType.equals(GranularityType.NONE))
+ .map(Enum::name)
+ .map(StringUtils::toLowerCase)
+ .collect(Collectors.joining(", "))
+ );
+ }
+ }
}
diff --git
a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteInsertDmlTest.java
b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteInsertDmlTest.java
index 0a14ea3e53..aa7a8eb885 100644
--- a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteInsertDmlTest.java
+++ b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteInsertDmlTest.java
@@ -738,4 +738,21 @@ public class CalciteInsertDmlTest extends
CalciteIngestionDmlTest
)
.verify();
}
+
+ @Test
+ public void testInsertQueryWithInvalidGranularity()
+ {
+ testIngestionQuery()
+ .sql("insert into foo1 select __time, dim1 FROM foo partitioned by
time_floor(__time, 'PT2H')")
+ .expectValidationError(
+ CoreMatchers.allOf(
+ CoreMatchers.instanceOf(SqlPlanningException.class),
+ ThrowableMessageMatcher.hasMessage(CoreMatchers.containsString(
+ "The granularity specified in PARTITIONED BY is not
supported. "
+ + "Please use an equivalent of these granularities:
second, minute, five_minute, ten_minute, "
+ + "fifteen_minute, thirty_minute, hour, six_hour, day,
week, month, quarter, year, all."))
+ )
+ )
+ .verify();
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]