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 <[email protected]> Authored: Thu Jun 28 13:07:10 2018 -0700 Committer: Jesus Camacho Rodriguez <[email protected]> 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
