[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 <[email protected]> Authored: Mon May 22 19:23:33 2017 +0300 Committer: Julian Hyde <[email protected]> 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() {
