You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jc...@apache.org on 2018/06/28 22:45:47 UTC

calcite git commit: [CALCITE-2387] Fix for date/timestamp cast expressions in Druid adapter

Repository: calcite
Updated Branches:
  refs/heads/master a7e8fb84c -> 8a91c8dd4


[CALCITE-2387] Fix for date/timestamp cast expressions in Druid adapter


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/8a91c8dd
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/8a91c8dd
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/8a91c8dd

Branch: refs/heads/master
Commit: 8a91c8dd4510f0741242f89c1a988e46036a2139
Parents: a7e8fb8
Author: Jesus Camacho Rodriguez <jc...@apache.org>
Authored: Thu Jun 28 13:07:10 2018 -0700
Committer: Jesus Camacho Rodriguez <jc...@apache.org>
Committed: Thu Jun 28 15:45:31 2018 -0700

----------------------------------------------------------------------
 .../adapter/druid/DruidSqlCastConverter.java     | 19 +++++++++++--------
 .../org/apache/calcite/test/DruidAdapterIT2.java | 11 +++++++++++
 2 files changed, 22 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/8a91c8dd/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSqlCastConverter.java
----------------------------------------------------------------------
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 def28c6..65a2ab4 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
@@ -56,16 +56,19 @@ public class DruidSqlCastConverter implements DruidSqlOperatorConverter {
     final TimeZone timeZone = TimeZone.getTimeZone(timeZoneConf == null ? "UTC" : timeZoneConf);
     final boolean nullEqualToEmpty = druidQuery.getConnectionConfig().nullEqualToEmpty();
 
-    if (SqlTypeName.CHAR_TYPES.contains(fromType) && SqlTypeName.DATETIME_TYPES.contains(toType)) {
+    if (SqlTypeName.CHAR_TYPES.contains(fromType)
+        && SqlTypeName.DATETIME_TYPES.contains(toType)) {
       //case chars to dates
-      return castCharToDateTime(timeZone, operandExpression, toType,
-          nullEqualToEmpty ? "" : null);
-    } else if (SqlTypeName.DATETIME_TYPES.contains(fromType) && SqlTypeName.CHAR_TYPES.contains
-        (toType)) {
+      return castCharToDateTime(toType == SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE
+              ? timeZone : DateTimeUtils.UTC_ZONE,
+          operandExpression, toType, nullEqualToEmpty ? "" : null);
+    } else if (SqlTypeName.DATETIME_TYPES.contains(fromType)
+        && SqlTypeName.CHAR_TYPES.contains(toType)) {
       //case dates to chars
-      return castDateTimeToChar(timeZone, operandExpression, fromType);
-    } else if (toType == SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE
-        && SqlTypeName.DATETIME_TYPES.contains(fromType)) {
+      return castDateTimeToChar(fromType == SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE
+          ? timeZone : DateTimeUtils.UTC_ZONE, operandExpression, fromType);
+    } else if (SqlTypeName.DATETIME_TYPES.contains(fromType)
+        && toType == SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE) {
       if (timeZone.equals(DateTimeUtils.UTC_ZONE)) {
         // bail out, internal representation is the same,
         // we do not need to do anything

http://git-wip-us.apache.org/repos/asf/calcite/blob/8a91c8dd/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT2.java
----------------------------------------------------------------------
diff --git a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT2.java b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT2.java
index c673c7c..97e9cc4 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT2.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT2.java
@@ -3969,6 +3969,17 @@ public class DruidAdapterIT2 {
                 "QUARTER"
             ));
   }
+
+  @Test
+  public void testCastTimestamp() {
+    final String sql = "Select cast(cast(\"timestamp\" as timestamp) as varchar) as t"
+        + " from \"foodmart\" order by t limit 1";
+
+    sql(sql, FOODMART)
+        .returnsOrdered("T=1997-01-01 00:00:00")
+        .queryContains(
+            druidChecker("UTC"));
+  }
 }
 
 // End DruidAdapterIT2.java