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

mmior pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/master by this push:
     new e0774db  [CALCITE-2804] Fix casting to timestamps in Druid
e0774db is described below

commit e0774db1fad3e0c509cfa9c1a929875015c14c2b
Author: Justin Szeluga <[email protected]>
AuthorDate: Fri Jan 25 14:48:20 2019 -0500

    [CALCITE-2804] Fix casting to timestamps in Druid
    
    Close apache/calcite#1014
---
 .../adapter/druid/DruidSqlCastConverter.java       | 11 ++++++---
 .../org/apache/calcite/test/DruidAdapterIT.java    | 26 ++++++++++++++++++++++
 2 files changed, 34 insertions(+), 3 deletions(-)

diff --git 
a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSqlCastConverter.java
 
b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSqlCastConverter.java
index e73464e..88d5702 100644
--- 
a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSqlCastConverter.java
+++ 
b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSqlCastConverter.java
@@ -51,17 +51,22 @@ public class DruidSqlCastConverter implements 
DruidSqlOperatorConverter {
     }
 
     final SqlTypeName fromType = operand.getType().getSqlTypeName();
+    String fromTypeString = dateTimeFormatString(fromType);
     final SqlTypeName toType = rexNode.getType().getSqlTypeName();
     final String timeZoneConf = druidQuery.getConnectionConfig().timeZone();
     final TimeZone timeZone = TimeZone.getTimeZone(timeZoneConf == null ? 
"UTC" : timeZoneConf);
     final boolean nullEqualToEmpty = 
druidQuery.getConnectionConfig().nullEqualToEmpty();
 
+    if (fromTypeString == null) {
+      fromTypeString = nullEqualToEmpty ? "" :  null;
+    }
+
     if (SqlTypeName.CHAR_TYPES.contains(fromType)
         && SqlTypeName.DATETIME_TYPES.contains(toType)) {
       //case chars to dates
       return castCharToDateTime(toType == 
SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE
               ? timeZone : DateTimeUtils.UTC_ZONE,
-          operandExpression, toType, nullEqualToEmpty ? "" : null);
+          operandExpression, toType, fromTypeString);
     } else if (SqlTypeName.DATETIME_TYPES.contains(fromType)
         && SqlTypeName.CHAR_TYPES.contains(toType)) {
       //case dates to chars
@@ -79,7 +84,7 @@ public class DruidSqlCastConverter implements 
DruidSqlOperatorConverter {
           timeZone,
           castDateTimeToChar(DateTimeUtils.UTC_ZONE, operandExpression, 
fromType),
           toType,
-          nullEqualToEmpty ? "" : null);
+          fromTypeString);
     } else if (fromType == SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE
         && SqlTypeName.DATETIME_TYPES.contains(toType)) {
       if (toType != SqlTypeName.DATE && 
timeZone.equals(DateTimeUtils.UTC_ZONE)) {
@@ -92,7 +97,7 @@ public class DruidSqlCastConverter implements 
DruidSqlOperatorConverter {
           DateTimeUtils.UTC_ZONE,
           castDateTimeToChar(timeZone, operandExpression, fromType),
           toType,
-          nullEqualToEmpty ? "" : null);
+          fromTypeString);
     } else {
       // Handle other casts.
       final DruidType fromExprType = 
DruidExpressions.EXPRESSION_TYPES.get(fromType);
diff --git a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java 
b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
index cfb29e7..5ea1f8f 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
@@ -570,6 +570,32 @@ public class DruidAdapterIT {
         .queryContains(druidChecker(druidQuery));
   }
 
+  /**
+   * Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-2804";>[CALCITE-2804]</a>
+   * Cast does not work in Druid when casting to timestamp
+   */
+  @Test public void testCastToTimestamp() {
+    final String sql = "select cast(\"timestamp\" as timestamp) from 
\"foodmart\"";
+    final String druidQuery = "{'queryType':'scan','dataSource':'foodmart',"
+        + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']',"
+        + "'virtualColumns:[{'type':'expression','name':'vc',"
+        + "'expression':'timestamp_parse("
+        + 
"timestamp_format(\"__time\",'yyyy-MM-dd\\u0027T\\u0027HH:mm:ss.SSS\\u0027Z\\u0027',"
+        + 
"'America/New_York'),'yyyy-MM-dd\\u0027T\\u0027HH:mm:ss.SSS\\u0027Z\\u0027','UTC')',"
+        + "'outputType':'LONG'}],"
+        + "'columns':['vc'],"
+        + "'resultFormat':'compactedList'}";
+
+    CalciteAssert.that()
+         .enable(enabled())
+         .withModel(FOODMART)
+         .with(CalciteConnectionProperty.TIME_ZONE.camelName(), 
"America/New_York")
+         .query(sql)
+         .runs()
+         .queryContains(druidChecker(druidQuery));
+  }
+
   @Test public void testDistinctLimit() {
     final String sql = "select distinct \"gender\", \"state_province\"\n"
         + "from \"foodmart\" fetch next 3 rows only";

Reply via email to