You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by jh...@apache.org on 2017/05/23 21:49:54 UTC

[2/2] calcite git commit: [CALCITE-1800] JDBC adapter fails on query with UNION in FROM clause (Viktor Batytskyi and Minji Kim)

[CALCITE-1800] JDBC adapter fails on query with UNION in FROM clause (Viktor Batytskyi and Minji Kim)

Close apache/calcite#454


Project: http://git-wip-us.apache.org/repos/asf/calcite/repo
Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/f6af061c
Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/f6af061c
Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/f6af061c

Branch: refs/heads/master
Commit: f6af061ced056d1935b4173f9901152cbaca318b
Parents: e117c10
Author: Viktor Batytskyi <vb...@gmail.com>
Authored: Mon May 22 19:23:33 2017 +0300
Committer: Julian Hyde <jh...@apache.org>
Committed: Tue May 23 12:12:05 2017 -0700

----------------------------------------------------------------------
 .../calcite/rel/rel2sql/SqlImplementor.java     |  8 ++++++-
 .../rel/rel2sql/RelToSqlConverterTest.java      | 23 ++++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/f6af061c/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
index 2de7643..826cebc 100644
--- a/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
+++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java
@@ -987,7 +987,13 @@ public abstract class SqlImplementor {
       } else {
         boolean qualified =
             !dialect.hasImplicitTableAlias() || aliases.size() > 1;
-        if (needNew) {
+        // basically, we did a subSelect() since needNew is set and neededAlias is not null
+        // now, we need to make sure that we need to update the alias context.
+        // if our aliases map has a single element:  <neededAlias, rowType>,
+        // then we don't need to rewrite the alias but otherwise, it should be updated.
+        if (needNew
+                && neededAlias != null
+                && (aliases.size() != 1 || !aliases.containsKey(neededAlias))) {
           newContext =
               aliasContext(ImmutableMap.of(neededAlias, rel.getRowType()),
                   qualified);

http://git-wip-us.apache.org/repos/asf/calcite/blob/f6af061c/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.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 ccfb46e..8f5015c 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
@@ -637,6 +637,29 @@ public class RelToSqlConverterTest {
   }
 
   /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-1800">[CALCITE-1800]
+   * JDBC adapter fails to SELECT FROM a UNION query</a>. */
+  @Test public void testUnionWrappedInASelect() {
+    final String query = "select sum(\n"
+        + "  case when \"product_id\"=0 then \"net_weight\" else 0 end)"
+        + " as net_weight\n"
+        + "from (\n"
+        + "  select \"product_id\", \"net_weight\"\n"
+        + "  from \"product\"\n"
+        + "  union all\n"
+        + "  select \"product_id\", 0 as \"net_weight\"\n"
+        + "  from \"sales_fact_1997\") t0";
+    final String expected = "SELECT SUM(CASE WHEN \"product_id\" = 0"
+        + " THEN \"net_weight\" ELSE 0 END) AS \"NET_WEIGHT\"\n"
+        + "FROM (SELECT \"product_id\", \"net_weight\"\n"
+        + "FROM \"foodmart\".\"product\"\n"
+        + "UNION ALL\n"
+        + "SELECT \"product_id\", 0 AS \"net_weight\"\n"
+        + "FROM \"foodmart\".\"sales_fact_1997\") AS \"t1\"";
+    sql(query).ok(expected);
+  }
+
+  /** Test case for
    * <a href="https://issues.apache.org/jira/browse/CALCITE-1798">[CALCITE-1798]
    * Generate dialect-specific SQL for FLOOR operator</a>. */
   @Test public void testFloor() {