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 a7a566b [CALCITE-3247] In JDBC adapter, when generating SQL for Hive,
transform SUBSTRING function to correct format (Jacky Woo)
a7a566b is described below
commit a7a566bb004fd73ee6402652f5572ad0012a97c9
Author: jackyWoo <[email protected]>
AuthorDate: Mon Aug 26 16:01:55 2019 +0800
[CALCITE-3247] In JDBC adapter, when generating SQL for Hive, transform
SUBSTRING function to correct format (Jacky Woo)
close apache/calcite#1373
---
.../apache/calcite/sql/dialect/HiveSqlDialect.java | 16 +++++++++++
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 32 ++++++++++++++++++++++
2 files changed, 48 insertions(+)
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 afc2290..6d7d3be 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
@@ -29,6 +29,7 @@ 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.SqlSubstringFunction;
import org.apache.calcite.sql.fun.SqlTrimFunction;
import org.apache.calcite.sql.parser.SqlParserPos;
import org.apache.calcite.sql.type.BasicSqlType;
@@ -93,6 +94,21 @@ public class HiveSqlDialect extends SqlDialect {
case TRIM:
unparseTrim(writer, call, leftPrec, rightPrec);
break;
+ case OTHER_FUNCTION:
+ if (call.getOperator() instanceof SqlSubstringFunction) {
+ final SqlWriter.Frame funCallFrame =
writer.startFunCall(call.getOperator().getName());
+ call.operand(0).unparse(writer, leftPrec, rightPrec);
+ writer.sep(",", true);
+ call.operand(1).unparse(writer, leftPrec, rightPrec);
+ if (3 == call.operandCount()) {
+ writer.sep(",", true);
+ call.operand(2).unparse(writer, leftPrec, rightPrec);
+ }
+ writer.endFunCall(funCallFrame);
+ } else {
+ super.unparseCall(writer, call, leftPrec, rightPrec);
+ }
+ break;
default:
super.unparseCall(writer, call, leftPrec, rightPrec);
}
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 3782504..e05656f 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
@@ -1067,6 +1067,38 @@ public class RelToSqlConverterTest {
sql(query).dialect(HiveSqlDialect.DEFAULT).ok(expected);
}
+ @Test public void testHiveSubstring() {
+ String query = "SELECT SUBSTRING('ABC', 2)"
+ + "from \"foodmart\".\"reserve_employee\"";
+ final String expected = "SELECT SUBSTRING('ABC', 2)\n"
+ + "FROM foodmart.reserve_employee";
+ sql(query).withHive().ok(expected);
+ }
+
+ @Test public void testHiveSubstringWithLength() {
+ String query = "SELECT SUBSTRING('ABC', 2, 3)"
+ + "from \"foodmart\".\"reserve_employee\"";
+ final String expected = "SELECT SUBSTRING('ABC', 2, 3)\n"
+ + "FROM foodmart.reserve_employee";
+ sql(query).withHive().ok(expected);
+ }
+
+ @Test public void testHiveSubstringWithANSI() {
+ String query = "SELECT SUBSTRING('ABC' FROM 2)"
+ + "from \"foodmart\".\"reserve_employee\"";
+ final String expected = "SELECT SUBSTRING('ABC', 2)\n"
+ + "FROM foodmart.reserve_employee";
+ sql(query).withHive().ok(expected);
+ }
+
+ @Test public void testHiveSubstringWithANSIAndLength() {
+ String query = "SELECT SUBSTRING('ABC' FROM 2 FOR 3)"
+ + "from \"foodmart\".\"reserve_employee\"";
+ final String expected = "SELECT SUBSTRING('ABC', 2, 3)\n"
+ + "FROM foodmart.reserve_employee";
+ sql(query).withHive().ok(expected);
+ }
+
@Test public void testMysqlCastToBigint() {
// MySQL does not allow cast to BIGINT; instead cast to SIGNED.
final String query = "select cast(\"product_id\" as bigint) from
\"product\"";