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/01/28 16:56:39 UTC

[4/4] calcite git commit: [CALCITE-1610] RelBuilder sort-combining optimization treats aliases incorrectly (Jess Balint)

[CALCITE-1610] RelBuilder sort-combining optimization treats aliases incorrectly (Jess Balint)

Close apache/calcite#367


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

Branch: refs/heads/master
Commit: beb465334c1bdc62b8282492ad7580c0683cee01
Parents: 3f955ee
Author: Jess Balint <jb...@gmail.com>
Authored: Fri Jan 27 16:04:40 2017 -0600
Committer: Julian Hyde <jh...@apache.org>
Committed: Fri Jan 27 23:56:55 2017 -0800

----------------------------------------------------------------------
 .../org/apache/calcite/tools/RelBuilder.java    |  9 ++++---
 .../org/apache/calcite/test/RelBuilderTest.java | 26 ++++++++++++++++++++
 2 files changed, 31 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/calcite/blob/beb46533/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
index 2b3a545..6993cbe 100644
--- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
+++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
@@ -1541,12 +1541,13 @@ public class RelBuilder {
         if (project.getInput() instanceof Sort) {
           final Sort sort2 = (Sort) project.getInput();
           if (sort2.offset == null && sort2.fetch == null) {
-            replaceTop(sort2.getInput());
             final RelNode sort =
-                sortFactory.createSort(peek(), sort2.collation,
+                sortFactory.createSort(sort2.getInput(), sort2.collation,
                     offsetNode, fetchNode);
-            replaceTop(sort);
-            project(project.getProjects());
+            replaceTop(
+                projectFactory.createProject(sort,
+                    project.getProjects(),
+                    Pair.right(project.getNamedProjects())));
             return this;
           }
         }

http://git-wip-us.apache.org/repos/asf/calcite/blob/beb46533/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
index cabbcdc..61d5235 100644
--- a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
@@ -1518,6 +1518,32 @@ public class RelBuilderTest {
     assertThat(str(root), is(expected));
   }
 
+  /** Test case for
+   * <a href="https://issues.apache.org/jira/browse/CALCITE-1610">[CALCITE-1610]
+   * RelBuilder sort-combining optimization treats aliases incorrectly</a>. */
+  @Test public void testSortOverProjectSort() {
+    final RelBuilder builder = RelBuilder.create(config().build());
+    builder.scan("EMP")
+        .sort(0)
+        .project(builder.field(1))
+        // was throwing exception here when attempting to apply to
+        // inner sort node
+        .limit(0, 1)
+        .build();
+    RelNode r = builder.scan("EMP")
+        .sort(0)
+        .project(Lists.newArrayList(builder.field(1)),
+            Lists.newArrayList("F1"))
+        .limit(0, 1)
+        // make sure we can still access the field by alias
+        .project(builder.field("F1"))
+        .build();
+    String expected = "LogicalProject(F1=[$1])\n"
+        + "  LogicalSort(sort0=[$0], dir0=[ASC], fetch=[1])\n"
+        + "    LogicalTableScan(table=[[scott, EMP]])\n";
+    assertThat(str(r), is(expected));
+  }
+
   /** Tests that a sort on a field followed by a limit gives the same
    * effect as calling sortLimit.
    *