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 e9a7f88e7448..c4fa3897efa9 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 @@ -1965,6 +1965,13 @@ private boolean needNewSubQuery( return true; } + if (rel instanceof Aggregate + && (clauses.contains(Clause.ORDER_BY) + || clauses.contains(Clause.FETCH) + || clauses.contains(Clause.OFFSET))) { + return true; + } + // Cannot merge two window functions boolean containsOver = containsOver(node); if (rel instanceof Project 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 9065ac7c4664..a61bf33ed65d 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 @@ -8616,6 +8616,28 @@ private void checkLiteral2(String expression, String expected) { .withSpark().ok(sparkExpected); } + /** Test case for + * [CALCITE-6748] + * RelToSqlConverter returns the wrong result when Aggregate is on Sort. */ + @Test void testAggregateOnSort() { + final String query0 = "select max(\"product_class_id\") " + + "from (select * from \"product\" order by \"brand_name\" asc limit 10) t"; + final String expected0 = "SELECT MAX(\"product_class_id\")\n" + + "FROM (SELECT \"product_class_id\"\n" + + "FROM \"foodmart\".\"product\"\n" + + "ORDER BY \"brand_name\"\n" + + "FETCH NEXT 10 ROWS ONLY) AS \"t1\""; + sql(query0).ok(expected0); + + final String query1 = "select max(\"product_class_id\") " + + "from (select * from \"product\" offset 10 ) t"; + final String expected1 = "SELECT MAX(\"product_class_id\")\n" + + "FROM (SELECT \"product_class_id\"\n" + + "FROM \"foodmart\".\"product\"\n" + + "OFFSET 10 ROWS) AS \"t1\""; + sql(query1).ok(expected1); + } + @Test void testNullCollationAscNullFirst() { final String query = "select * from \"product\" order by \"brand_name\" asc nulls first"; final String expected = "SELECT *\n" diff --git a/piglet/src/test/java/org/apache/calcite/test/PigRelOpTest.java b/piglet/src/test/java/org/apache/calcite/test/PigRelOpTest.java index ed6301ee0c05..26905b3fe8a7 100644 --- a/piglet/src/test/java/org/apache/calcite/test/PigRelOpTest.java +++ b/piglet/src/test/java/org/apache/calcite/test/PigRelOpTest.java @@ -479,17 +479,16 @@ private Fluent pig(String script) { + "HIREDATE, SAL, COMM, DEPTNO)) AS A\n" + " FROM scott.EMP\n" + " GROUP BY DEPTNO) AS $cor4,\n" - + " LATERAL (SELECT X\n" - + " FROM (SELECT 'all' AS $f0, COLLECT(ROW(ENAME, JOB, DEPTNO, SAL)) AS X\n" + + " LATERAL (SELECT COLLECT($f1) AS X\n" + + " FROM (SELECT 'all' AS $f0, ROW(ENAME, JOB, DEPTNO, SAL) AS $f1\n" + " FROM UNNEST (SELECT $cor4.A AS $f0\n" + " FROM (VALUES (0)) AS t (ZERO)) " + "AS t2 (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)\n" + " WHERE JOB <> 'CLERK'\n" - + " GROUP BY 'all'\n" - + " ORDER BY SAL) AS t7) AS t8) AS $cor5,\n" + + " ORDER BY SAL) AS t6\n" + + " GROUP BY $f0) AS t8) AS $cor5,\n" + " LATERAL UNNEST (SELECT $cor5.X AS $f0\n" - + " FROM (VALUES (0)) AS t (ZERO)) " - + "AS t11 (ENAME, JOB, DEPTNO, SAL) AS t110\n" + + " FROM (VALUES (0)) AS t (ZERO)) AS t11 (ENAME, JOB, DEPTNO, SAL) AS t110\n" + "ORDER BY $cor5.group"; pig(script).assertRel(hasTree(plan)) .assertResult(is(result))