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)