This is an automated email from the ASF dual-hosted git repository.
danny0405 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 148bfd3 [CALCITE-3282] HiveSqlDialect unparse Interger type as Int in
order to be compatible with Hive1.x (huangfeng)
148bfd3 is described below
commit 148bfd329413c0272395cc0b7c322b3c5a34b667
Author: ffmax <[email protected]>
AuthorDate: Thu Sep 5 19:51:32 2019 +0800
[CALCITE-3282] HiveSqlDialect unparse Interger type as Int in order to be
compatible with Hive1.x (huangfeng)
Fix-up (by Danny):
* Add issue link to the test case;
* Fix some doc typos.
close apache/calcite#1443
---
.../main/java/org/apache/calcite/sql/SqlDialect.java | 2 ++
.../org/apache/calcite/sql/dialect/HiveSqlDialect.java | 18 ++++++++++++++++++
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 12 ++++++++++++
3 files changed, 32 insertions(+)
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
index 8a740a8..7d802b4 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java
@@ -749,6 +749,8 @@ public class SqlDialect {
return true;
}
+ /** Returns SqlNode for type in "cast(column as type)", which might be
+ * different between databases by type name, precision etc. */
public SqlNode getCastSpec(RelDataType type) {
if (type instanceof BasicSqlType) {
int maxPrecision = -1;
diff --git
a/core/src/main/java/org/apache/calcite/sql/dialect/HiveSqlDialect.java
b/core/src/main/java/org/apache/calcite/sql/dialect/HiveSqlDialect.java
index 2525460..afc2290 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/HiveSqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/HiveSqlDialect.java
@@ -17,15 +17,21 @@
package org.apache.calcite.sql.dialect;
import org.apache.calcite.config.NullCollation;
+import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.sql.SqlCall;
+import org.apache.calcite.sql.SqlDataTypeSpec;
import org.apache.calcite.sql.SqlDialect;
+import org.apache.calcite.sql.SqlIdentifier;
import org.apache.calcite.sql.SqlLiteral;
import org.apache.calcite.sql.SqlNode;
import org.apache.calcite.sql.SqlOperator;
import org.apache.calcite.sql.SqlSyntax;
+import org.apache.calcite.sql.SqlUserDefinedTypeNameSpec;
import org.apache.calcite.sql.SqlWriter;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.sql.fun.SqlTrimFunction;
+import org.apache.calcite.sql.parser.SqlParserPos;
+import org.apache.calcite.sql.type.BasicSqlType;
/**
* A <code>SqlDialect</code> implementation for the Apache Hive database.
@@ -120,6 +126,18 @@ public class HiveSqlDialect extends SqlDialect {
@Override public boolean supportsCharSet() {
return false;
}
+
+ @Override public SqlNode getCastSpec(final RelDataType type) {
+ if (type instanceof BasicSqlType) {
+ switch (type.getSqlTypeName()) {
+ case INTEGER:
+ SqlUserDefinedTypeNameSpec typeNameSpec = new
SqlUserDefinedTypeNameSpec(
+ new SqlIdentifier("INT", SqlParserPos.ZERO), SqlParserPos.ZERO);
+ return new SqlDataTypeSpec(typeNameSpec, SqlParserPos.ZERO);
+ }
+ }
+ return super.getCastSpec(type);
+ }
}
// End HiveSqlDialect.java
diff --git
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
index 7f9fc34..8d67024 100644
---
a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
+++
b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java
@@ -804,6 +804,18 @@ public class RelToSqlConverterTest {
}
/** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-3282">[CALCITE-3282]
+ * HiveSqlDialect unparse Interger type as Int in order
+ * to be compatible with Hive1.x</a>. */
+ @Test public void testHiveCastAsInt() {
+ String query = "select cast( cast(\"employee_id\" as varchar) as int) "
+ + "from \"foodmart\".\"reserve_employee\" ";
+ final String expected = "SELECT CAST(CAST(employee_id AS VARCHAR) AS
INT)\n"
+ + "FROM foodmart.reserve_employee";
+ sql(query).withHive().ok(expected);
+ }
+
+ /** Test case for
* <a
href="https://issues.apache.org/jira/browse/CALCITE-3220">[CALCITE-3220]
* HiveSqlDialect should transform the SQL-standard TRIM function to TRIM,
* LTRIM or RTRIM</a>. */