Xi Chen created KYLIN-4440:
------------------------------

             Summary: IllegalStateException thrown when a query contains group 
by clause with case when of dimensional table columns
                 Key: KYLIN-4440
                 URL: https://issues.apache.org/jira/browse/KYLIN-4440
             Project: Kylin
          Issue Type: Bug
          Components: Query Engine
    Affects Versions: v2.6.5, v2.5.1, v2.2.0
            Reporter: Xi Chen


When a sub-query contains group by clause with case when of dimensional table 
columns, and the sub-query is joined by another sub-query, the whole query 
fails throwing java.lang.IllegalStateException.

Example query of kylin_sales:

```

SELECT *
FROM
 ( SELECT part_dt ,
 CASE
 WHEN buyer_id >= 10003000 THEN 'A'
 ELSE kylin_account.account_country
 END AS category ,
 sum(price) AS total_sold ,
 count(DISTINCT seller_id) AS sellers
 FROM kylin_sales
 LEFT JOIN kylin_account ON kylin_sales.buyer_id = kylin_account.account_id
 GROUP BY part_dt ,
 CASE
 WHEN buyer_id >= 10003000 THEN 'A'
 ELSE kylin_account.account_country
 END
 ORDER BY part_dt ) t1
LEFT JOIN
 ( SELECT part_dt ,
 sum(price) AS total_sold ,
 count(DISTINCT seller_id) AS sellers
 FROM kylin_sales
 LEFT JOIN kylin_account ON kylin_sales.buyer_id = kylin_account.account_id
 GROUP BY part_dt
 ORDER BY part_dt ) t2 ON t1.part_dt = t2.part_dt
ORDER BY t1.part_dt DESC

```

Exception message:

```

RowType=7, ColumnRowType=8 while executing SQL: "SELECT * FROM ( SELECT part_dt 
, CASE WHEN buyer_id >= 10003000 THEN 'A' ELSE kylin_account.account_country 
END AS category , sum(price) AS total_sold , count(DISTINCT seller_id) AS 
sellers FROM kylin_sales LEFT JOIN kylin_account ON kylin_sales.buyer_id = 
kylin_account.account_id GROUP BY part_dt , CASE WHEN buyer_id >= 10003000 THEN 
'A' ELSE kylin_account.account_country END ORDER BY part_dt ) t1 LEFT JOIN ( 
SELECT part_dt , sum(price) AS total_sold , count(DISTINCT seller_id) AS 
sellers FROM kylin_sales LEFT JOIN kylin_account ON kylin_sales.buyer_id = 
kylin_account.account_id GROUP BY part_dt ORDER BY part_dt ) t2 ON t1.part_dt = 
t2.part_dt ORDER BY t1.part_dt DESC LIMIT 50000"

```

More message from kylin logs:

```

Caused by: java.lang.IllegalStateException: RowType=7, ColumnRowType=8
 at 
org.apache.kylin.query.relnode.OLAPJoinRel.buildColumnRowType(OLAPJoinRel.java:223)
 at 
org.apache.kylin.query.relnode.OLAPJoinRel.implementOLAP(OLAPJoinRel.java:174)
 at 
org.apache.kylin.query.relnode.OLAPRel$OLAPImplementor.visitChild(OLAPRel.java:84)
 at 
org.apache.kylin.query.relnode.OLAPSortRel.implementOLAP(OLAPSortRel.java:72)
 at 
org.apache.kylin.query.relnode.OLAPRel$OLAPImplementor.visitChild(OLAPRel.java:84)
 at 
org.apache.kylin.query.relnode.OLAPLimitRel.implementOLAP(OLAPLimitRel.java:77)
 at 
org.apache.kylin.query.relnode.OLAPRel$OLAPImplementor.visitChild(OLAPRel.java:84)
 at 
org.apache.kylin.query.relnode.OLAPToEnumerableConverter.implement(OLAPToEnumerableConverter.java:75)
 at 
org.apache.calcite.adapter.enumerable.EnumerableRelImplementor.implementRoot(EnumerableRelImplementor.java:103)
 at 
org.apache.calcite.adapter.enumerable.EnumerableInterpretable.toBindable(EnumerableInterpretable.java:92)
 at 
org.apache.calcite.prepare.CalcitePrepareImpl$CalcitePreparingStmt.implement(CalcitePrepareImpl.java:1278)
 at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:331)
 at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:230)
 at 
org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:796)
 at 
org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:655)
 at 
org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:618)
 at 
org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:221)
 at 
org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:603)
 at 
org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:638)
 at 
org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:149)
 ... 83 more

```



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to