You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "yanjing.wang (Jira)" <ji...@apache.org> on 2021/12/01 02:58:00 UTC

[jira] [Comment Edited] (CALCITE-4901) RelToSqlConverter adds redundant order by output column for the result sql

    [ https://issues.apache.org/jira/browse/CALCITE-4901?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17451480#comment-17451480 ] 

yanjing.wang edited comment on CALCITE-4901 at 12/1/21, 2:57 AM:
-----------------------------------------------------------------

No, it isn't.

Let me explain it,  when I use 

 
{code:java}
String input = "SELECT COUNT(*) FROM foodmart.product GROUP BY product_id ORDER BY product_id";
...parse & validate
RelRoot relRoot = sqlToRelConverter.convert(...);
RelNode rel = relRoot.rel;
String sql = relToSqlConverter.visitRoot(rel).asStatement().toString();{code}
I get the incorrect sql.
{code:java}
SELECT COUNT(*), product_id
FROM foodmart.product
GROUP BY product_id
ORDER BY product_id {code}
"SELECT COUNT(\*), product_id" is not correct. It should be "SELECT COUNT(\*)".

 

When I use 
{code:java}
String input = "SELECT COUNT(*) FROM foodmart.product GROUP BY product_id ORDER BY product_id";
...parse & validate
RelRoot relRoot = sqlToRelConverter.convert(...);
RelNode rel = relRoot.project();
String sql = relToSqlConverter.visitRoot(rel).asStatement().toString(); {code}
I get 
{code:java}
SELECT `EXPR$0`
FROM (SELECT COUNT(*) AS `EXPR$0`, product_id
FROM foodmart.product
GROUP BY product_id
ORDER BY product_id DESC) AS t2   {code}
None is my expectation. I expect that I can get the same with the input
{code:java}
String input = "SELECT COUNT(*) FROM foodmart.product GROUP BY product_id ORDER BY product_id"; {code}
 

 

 


was (Author: yanjing.wang):
No, it isn't.

Let me explain it,  when I use 

 
{code:java}
String input = "SELECT COUNT(*) FROM foodmart.product GROUP BY product_id ORDER BY product_id";
...parse & validate
RelRoot relRoot = sqlToRelConverter.convert(...);
RelNode rel = relRoot.rel;
String sql = relToSqlConverter.visitRoot(rel).asStatement().toString();{code}
I get the incorrect sql.
{code:java}
SELECT COUNT(*), product_id
FROM foodmart.product
GROUP BY product_id
ORDER BY product_id {code}
"SELECT COUNT(*), product_id" is not correct. It should be "SELECT COUNT(*)".

 

When I use 
{code:java}
String input = "SELECT COUNT(*) FROM foodmart.product GROUP BY product_id ORDER BY product_id";
...parse & validate
RelRoot relRoot = sqlToRelConverter.convert(...);
RelNode rel = relRoot.project();
String sql = relToSqlConverter.visitRoot(rel).asStatement().toString(); {code}
I get 
{code:java}
SELECT `EXPR$0`
FROM (SELECT COUNT(*) AS `EXPR$0`, product_id
FROM foodmart.product
GROUP BY product_id
ORDER BY product_id DESC) AS t2   {code}
None is my expectation. I expect that I can get the same with the input
{code:java}
String input = "SELECT COUNT(*) FROM foodmart.product GROUP BY product_id ORDER BY product_id"; {code}
 

 

 

> RelToSqlConverter adds redundant order by output column for the result sql
> --------------------------------------------------------------------------
>
>                 Key: CALCITE-4901
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4901
>             Project: Calcite
>          Issue Type: Improvement
>          Components: core
>    Affects Versions: 1.26.0
>         Environment: jdk8
>            Reporter: yanjing.wang
>            Priority: Major
>
> In RelToSqlConverterTest, I add the following case
> {code:java}
> @Test void testOrderByNotInSelectList() {
>   String query = "select count(1)\n"
>       + "from \"foodmart\".\"product\"\n"
>       + "group by \"product_id\"\n"
>       + "order by \"product_id\" desc\n";
>   final String expected = "SELECT COUNT(1)\n"
>       + "FROM \"foodmart\".\"product\"\n"
>       + "GROUP BY \"product_id\"\n"
>       + "ORDER BY \"product_id\" desc\n";
>   sql(query).withBigQuery().ok(expected);
> }{code}
> But I get the actual sql is
> {code:java}
> SELECT COUNT(*), product_id
> FROM foodmart.product
> GROUP BY product_id
> ORDER BY product_id IS NULL DESC, product_id DESC {code}
> It has redundant product_id output column.
>  
> Wage Through code, I find that the sort operator contains product_id. When I put a project with product_id only on the sort operator, the result sql has redundant subquery.
> {code:java}
> LogicalProject(EXPR$0=[$0])
>   LogicalSort(sort0=[$1], dir0=[DESC])
>     LogicalProject(EXPR$0=[$1], product_id=[$0])
>       LogicalAggregate(group=[{0}], EXPR$0=[COUNT()])
>         LogicalProject(product_id=[$1])
>           JdbcTableScan(table=[[foodmart, product]]) {code}
> {code:java}
> SELECT `EXPR$0`
> FROM (SELECT COUNT(*) AS `EXPR$0`, product_id
> FROM foodmart.product
> GROUP BY product_id
> ORDER BY product_id IS NULL DESC, product_id DESC) AS t2 {code}
>  
>  



--
This message was sent by Atlassian Jira
(v8.20.1#820001)