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";