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

cbeikov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git

commit 893d41fa4b79dbac6b613f214de6b4fbab9e6773
Author: Christian Beikov <[email protected]>
AuthorDate: Wed Mar 4 11:49:40 2020 +0100

    [CALCITE-3840] Re-aliasing of VALUES that has column aliases produces wrong 
SQL in the JDBC adapter
---
 .../apache/calcite/rel/rel2sql/SqlImplementor.java    | 13 +++++++++++--
 .../calcite/rel/rel2sql/RelToSqlConverterTest.java    | 19 +++++++++++++++++++
 2 files changed, 30 insertions(+), 2 deletions(-)

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 31927a0..31857e4 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
@@ -1499,8 +1499,17 @@ public abstract class SqlImplementor {
      * equivalent to "SELECT * FROM emp AS emp".) */
     public SqlNode asFrom() {
       if (neededAlias != null) {
-        return SqlStdOperatorTable.AS.createCall(POS, node,
-            new SqlIdentifier(neededAlias, POS));
+        if (node.getKind() == SqlKind.AS) {
+          // If we already have an AS node, we need to replace the alias
+          // This is especially relevant for the VALUES clause rendering
+          SqlCall sqlCall = (SqlCall) node;
+          SqlNode[] operands = 
sqlCall.getOperandList().toArray(SqlNode.EMPTY_ARRAY);
+          operands[1] = new SqlIdentifier(neededAlias, POS);
+          return SqlStdOperatorTable.AS.createCall(POS, operands);
+        } else {
+          return SqlStdOperatorTable.AS.createCall(POS, node,
+              new SqlIdentifier(neededAlias, POS));
+        }
       }
       return node;
     }
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 234323f..30f096b 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
@@ -4212,6 +4212,25 @@ public class RelToSqlConverterTest {
         .ok(expectedPostgresql);
   }
 
+  /** Test case fo
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-3840";>[CALCITE-3840]
+   * Re-aliasing of VALUES that has column aliases produces wrong SQL in the 
JDBC adapter</a>*/
+  @Test public void testValuesReAlias() {
+    final RelBuilder builder = relBuilder();
+    final RelNode root = builder
+        .values(new String[]{ "a", "b" }, 1, "x ", 2, "yy")
+        .values(new String[]{ "a", "b" }, 1, "x ", 2, "yy")
+        .join(JoinRelType.FULL)
+        .project(builder.field("a"))
+        .build();
+    final String expectedSql = "SELECT \"t\".\"a\"\n"
+        + "FROM (VALUES  (1, 'x '),\n"
+        + " (2, 'yy')) AS \"t\" (\"a\", \"b\")\n"
+        + "FULL JOIN (VALUES  (1, 'x '),\n"
+        + " (2, 'yy')) AS \"t0\" (\"a\", \"b\") ON TRUE";
+    assertThat(toSql(root), isLinux(expectedSql));
+  }
+
   /** Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-2118";>[CALCITE-2118]
    * RelToSqlConverter should only generate "*" if field names match</a>. */

Reply via email to