This is an automated email from the ASF dual-hosted git repository.

jhyde 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 27e7f19  [CALCITE-2833] In JDBC adapter for Hive and BigQuery, 
implement Values by generating SELECT without FROM (Stuti Gupta)
27e7f19 is described below

commit 27e7f19a75033f44895d1c83efc6adf4f0e64856
Author: stuti.gupta <[email protected]>
AuthorDate: Tue Feb 19 15:27:07 2019 +0530

    [CALCITE-2833] In JDBC adapter for Hive and BigQuery, implement Values by 
generating SELECT without FROM (Stuti Gupta)
    
    Since this PR was created, we fixed [CALCITE-3191], which
    covers a lot of the original PR. The improvements for Hive
    and BigQuery are still worthwhile, so I rebased and fixed up
    the PR. (Julian Hyde)
    
    Close apache/calcite#1052
---
 .../calcite/rel/rel2sql/RelToSqlConverter.java     |  8 +-
 .../calcite/sql/dialect/BigQuerySqlDialect.java    |  4 +
 .../apache/calcite/sql/dialect/HiveSqlDialect.java |  4 +
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java | 89 +++++++++++-----------
 4 files changed, 59 insertions(+), 46 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java 
b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
index 1c61f8f..d7ee35e 100644
--- a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
+++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java
@@ -578,12 +578,18 @@ public class RelToSqlConverter extends SqlImplementor
         || !(Iterables.get(stack, 1).r instanceof TableModify);
     final List<String> fieldNames = e.getRowType().getFieldNames();
     if (!dialect.supportsAliasedValues() && rename) {
-      // Oracle does not support "AS t (c1, c2)". So instead of
+      // Some dialects (such as Oracle and BigQuery) don't support
+      // "AS t (c1, c2)". So instead of
       //   (VALUES (v0, v1), (v2, v3)) AS t (c0, c1)
       // we generate
       //   SELECT v0 AS c0, v1 AS c1 FROM DUAL
       //   UNION ALL
       //   SELECT v2 AS c0, v3 AS c1 FROM DUAL
+      // for Oracle and
+      //   SELECT v0 AS c0, v1 AS c1
+      //   UNION ALL
+      //   SELECT v2 AS c0, v3 AS c1
+      // for dialects that support SELECT-without-FROM.
       List<SqlSelect> list = new ArrayList<>();
       for (List<RexLiteral> tuple : e.getTuples()) {
         final List<SqlNode> values2 = new ArrayList<>();
diff --git 
a/core/src/main/java/org/apache/calcite/sql/dialect/BigQuerySqlDialect.java 
b/core/src/main/java/org/apache/calcite/sql/dialect/BigQuerySqlDialect.java
index f857233..cb7dca3 100644
--- a/core/src/main/java/org/apache/calcite/sql/dialect/BigQuerySqlDialect.java
+++ b/core/src/main/java/org/apache/calcite/sql/dialect/BigQuerySqlDialect.java
@@ -128,6 +128,10 @@ public class BigQuerySqlDialect extends SqlDialect {
     unparseFetchUsingLimit(writer, offset, fetch);
   }
 
+  @Override public boolean supportsAliasedValues() {
+    return false;
+  }
+
   @Override public void unparseCall(final SqlWriter writer, final SqlCall 
call, final int leftPrec,
       final int rightPrec) {
     switch (call.getKind()) {
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 aab8748..91311e3 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
@@ -58,6 +58,10 @@ public class HiveSqlDialect extends SqlDialect {
     return false;
   }
 
+  @Override public boolean supportsAliasedValues() {
+    return false;
+  }
+
   @Override public void unparseOffsetFetch(SqlWriter writer, SqlNode offset,
       SqlNode fetch) {
     unparseFetchUsingLimit(writer, offset, fetch);
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 839fcd8..dc75751 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
@@ -1337,8 +1337,7 @@ class RelToSqlConverterTest {
 
   /** Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-3663";>[CALCITE-3663]
-   * Support for TRIM function in Bigquery dialect</a>. */
-
+   * Support for TRIM function in BigQuery dialect</a>. */
   @Test void testBqTrimWithLeadingChar() {
     final String query = "SELECT TRIM(LEADING 'a' from 'abcd')\n"
         + "from \"foodmart\".\"reserve_employee\"";
@@ -4534,6 +4533,14 @@ class RelToSqlConverterTest {
         + "UNION ALL\n"
         + "SELECT 2 \"a\", 'yy' \"b\"\n"
         + "FROM \"DUAL\")";
+    final String expectedHive = "SELECT a\n"
+        + "FROM (SELECT 1 a, 'x ' b\n"
+        + "UNION ALL\n"
+        + "SELECT 2 a, 'yy' b)";
+    final String expectedBigQuery = "SELECT a\n"
+        + "FROM (SELECT 1 AS a, 'x ' AS b\n"
+        + "UNION ALL\n"
+        + "SELECT 2 AS a, 'yy' AS b)";
     final String expectedSnowflake = expectedPostgresql;
     final String expectedRedshift = expectedPostgresql;
     sql(sql)
@@ -4545,6 +4552,10 @@ class RelToSqlConverterTest {
         .ok(expectedPostgresql)
         .withOracle()
         .ok(expectedOracle)
+        .withHive()
+        .ok(expectedHive)
+        .withBigQuery()
+        .ok(expectedBigQuery)
         .withSnowflake()
         .ok(expectedSnowflake)
         .withRedshift()
@@ -4596,6 +4607,14 @@ class RelToSqlConverterTest {
     assertThat(toSql(root), isLinux(expectedSql));
   }
 
+  @Test void testSelectWithoutFromEmulationForHiveAndBigQuery() {
+    String query = "select 2 + 2";
+    final String expected = "SELECT 2 + 2";
+    sql(query)
+        .withHive().ok(expected)
+        .withBigQuery().ok(expected);
+  }
+
   /** Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-2118";>[CALCITE-2118]
    * RelToSqlConverter should only generate "*" if field names match</a>. */
@@ -5261,53 +5280,39 @@ class RelToSqlConverterTest {
   }
 
   @Test void testRowValueExpression() {
-    final String expected0 = "INSERT INTO SCOTT.DEPT (DEPTNO, DNAME, LOC)\n"
+    String sql = "insert into \"DEPT\"\n"
+        + "values ROW(1,'Fred', 'San Francisco'), ROW(2, 'Eric', 
'Washington')";
+    final String expectedDefault = "INSERT INTO \"SCOTT\".\"DEPT\""
+        + " (\"DEPTNO\", \"DNAME\", \"LOC\")\n"
         + "SELECT 1, 'Fred', 'San Francisco'\n"
-        + "FROM (VALUES  (0)) t (ZERO)\n"
+        + "FROM (VALUES  (0)) AS \"t\" (\"ZERO\")\n"
         + "UNION ALL\n"
         + "SELECT 2, 'Eric', 'Washington'\n"
-        + "FROM (VALUES  (0)) t (ZERO)";
-    String sql = "insert into \"DEPT\"\n"
-            + "values ROW(1,'Fred', 'San Francisco'), ROW(2, 'Eric', 
'Washington')";
-    sql(sql)
-        .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
-        .withHive()
-        .ok(expected0);
-
-    final String expected1 = "INSERT INTO `SCOTT`.`DEPT` (`DEPTNO`, `DNAME`, 
`LOC`)\n"
+        + "FROM (VALUES  (0)) AS \"t\" (\"ZERO\")";
+    final String expectedHive = "INSERT INTO SCOTT.DEPT (DEPTNO, DNAME, LOC)\n"
         + "SELECT 1, 'Fred', 'San Francisco'\n"
         + "UNION ALL\n"
         + "SELECT 2, 'Eric', 'Washington'";
-    sql(sql)
-        .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
-        .withMysql()
-        .ok(expected1);
-
-    final String expected2 = "INSERT INTO \"SCOTT\".\"DEPT\" (\"DEPTNO\", "
-        + "\"DNAME\", \"LOC\")\n"
+    final String expectedMysql = "INSERT INTO `SCOTT`.`DEPT`"
+        + " (`DEPTNO`, `DNAME`, `LOC`)\nSELECT 1, 'Fred', 'San Francisco'\n"
+        + "UNION ALL\n"
+        + "SELECT 2, 'Eric', 'Washington'";
+    final String expectedOracle = "INSERT INTO \"SCOTT\".\"DEPT\""
+        + " (\"DEPTNO\", \"DNAME\", \"LOC\")\n"
         + "SELECT 1, 'Fred', 'San Francisco'\n"
         + "FROM \"DUAL\"\n"
         + "UNION ALL\n"
         + "SELECT 2, 'Eric', 'Washington'\n"
         + "FROM \"DUAL\"";
-    sql(sql)
-        .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
-        .withOracle()
-        .ok(expected2);
-
-    final String expected3 = "INSERT INTO [SCOTT].[DEPT] ([DEPTNO], [DNAME], 
[LOC])\n"
+    final String expectedMssql = "INSERT INTO [SCOTT].[DEPT]"
+        + " ([DEPTNO], [DNAME], [LOC])\n"
         + "SELECT 1, 'Fred', 'San Francisco'\n"
         + "FROM (VALUES  (0)) AS [t] ([ZERO])\n"
         + "UNION ALL\n"
         + "SELECT 2, 'Eric', 'Washington'\n"
         + "FROM (VALUES  (0)) AS [t] ([ZERO])";
-    sql(sql)
-        .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
-        .withMssql()
-        .ok(expected3);
-
-    final String expected4 = "INSERT INTO \"SCOTT\".\"DEPT\" (\"DEPTNO\", "
-        + "\"DNAME\", \"LOC\")\n"
+    final String expectedCalcite = "INSERT INTO \"SCOTT\".\"DEPT\""
+        + " (\"DEPTNO\", \"DNAME\", \"LOC\")\n"
         + "SELECT 1, 'Fred', 'San Francisco'\n"
         + "FROM (VALUES  (0)) AS \"t\" (\"ZERO\")\n"
         + "UNION ALL\n"
@@ -5315,18 +5320,12 @@ class RelToSqlConverterTest {
         + "FROM (VALUES  (0)) AS \"t\" (\"ZERO\")";
     sql(sql)
         .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
-        .ok(expected4);
-
-    final String expected5 = "INSERT INTO \"SCOTT\".\"DEPT\" (\"DEPTNO\", "
-        + "\"DNAME\", \"LOC\")\n"
-        + "SELECT 1, 'Fred', 'San Francisco'\n"
-        + "FROM (VALUES  (0)) AS \"t\" (\"ZERO\")\n"
-        + "UNION ALL\n"
-        + "SELECT 2, 'Eric', 'Washington'\n"
-        + "FROM (VALUES  (0)) AS \"t\" (\"ZERO\")";
-    sql(sql).withCalcite()
-            .schema(CalciteAssert.SchemaSpec.JDBC_SCOTT)
-            .ok(expected5);
+        .ok(expectedDefault)
+        .withHive().ok(expectedHive)
+        .withMysql().ok(expectedMysql)
+        .withOracle().ok(expectedOracle)
+        .withMssql().ok(expectedMssql)
+        .withCalcite().ok(expectedCalcite);
   }
 
   @Test void testInsertValuesWithDynamicParams() {

Reply via email to