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]

Reply via email to