From beb465334c1bdc62b8282492ad7580c0683cee01 Mon Sep 17 00:00:00 2001 From: Jess Balint Date: Fri, 27 Jan 2017 16:04:40 -0600 Subject: [PATCH] [CALCITE-1610] RelBuilder sort-combining optimization treats aliases incorrectly (Jess Balint) Close apache/calcite#367 --- .../org/apache/calcite/tools/RelBuilder.java | 9 ++++--- .../apache/calcite/test/RelBuilderTest.java | 26 +++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) 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 2b3a54588ff..6993cbe71c9 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 RelBuilder sortLimit(int offset, int fetch, 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; } } 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 cabbcdc1b82..61d523593d1 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 @@ private String str(RelNode r) { assertThat(str(root), is(expected)); } + /** Test case for + * [CALCITE-1610] + * RelBuilder sort-combining optimization treats aliases incorrectly. */ + @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. *