You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Yingyu Wang (Jira)" <ji...@apache.org> on 2022/05/18 18:01:00 UTC

[jira] [Comment Edited] (CALCITE-5145) CASE statement within GROUPING SETS throws type mis-match exception

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

Yingyu Wang edited comment on CALCITE-5145 at 5/18/22 6:00 PM:
---------------------------------------------------------------

Actually the type mismatch exception occurs even without using alias:
 * Test:
{noformat}
  @Test void testCaseInGroupingSets() {
    String sql = "SELECT empno,\n" +
        "CASE WHEN ename IN ('Fred','Eric') THEN 'Manager' ELSE 'Other' END\n" +
        "FROM emp\n" +
        "GROUP BY GROUPING SETS (\n" +
        "(empno, CASE WHEN ename IN ('Fred','Eric') THEN 'Manager' ELSE 'Other' END),\n" +
        "(empno)\n" +
        ")";
    sql(sql)
        .withConformance(SqlConformanceEnum.LENIENT)
        .ok();
  }
{noformat} 

* Result
{noformat}
Conversion to relational algebra failed to preserve datatypes:validated type:RecordType(INTEGER NOT NULL EMPNO, CHAR(7) NOT NULL EXPR$1) NOT NULLconverted type:RecordType(INTEGER NOT NULL EMPNO, CHAR(7) EXPR$1) NOT NULLrel:LogicalAggregate(group=[{0, 1}], groups=[[{0, 1}, {0}]])  LogicalProject(EMPNO=[$0], EXPR$1=[CASE(SEARCH($1, Sarg['Eric', 'Fred']:CHAR(4)), 'Manager', 'Other  ')])    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
java.lang.AssertionError: Conversion to relational algebra failed to preserve datatypes:validated type:RecordType(INTEGER NOT NULL EMPNO, CHAR(7) NOT NULL EXPR$1) NOT NULLconverted type:RecordType(INTEGER NOT NULL EMPNO, CHAR(7) EXPR$1) NOT NULLrel:LogicalAggregate(group=[{0, 1}], groups=[[{0, 1}, {0}]])  LogicalProject(EMPNO=[$0], EXPR$1=[CASE(SEARCH($1, Sarg['Eric', 'Fred']:CHAR(4)), 'Manager', 'Other  ')])    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
	at org.apache.calcite.sql2rel.SqlToRelConverter.checkConvertedType(SqlToRelConverter.java:487)	at org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:602)	at org.apache.calcite.sql.test.AbstractSqlTester.convertSqlToRel2(AbstractSqlTester.java:536)	at org.apache.calcite.sql.test.AbstractSqlTester.assertSqlConvertsTo(AbstractSqlTester.java:477)	at org.apache.calcite.sql.test.AbstractSqlTester.assertConvertsTo(AbstractSqlTester.java:455)	at org.apache.calcite.test.SqlToRelFixture.convertsTo(SqlToRelFixture.java:106)	at org.apache.calcite.test.SqlToRelFixture.ok(SqlToRelFixture.java:94)	at org.apache.calcite.test.SqlToRelConverterTest.testCaseInGroupingSets(SqlToRelConverterTest.java:4507)	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)	at java.lang.reflect.Method.invoke(Method.java:498)	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725)	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)	at org.junit.jupiter.engine.extension.TimeoutInvocation.proceed(TimeoutInvocation.java:46)	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)	at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)	at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214)	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210)	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService$ExclusiveTask.compute(ForkJoinPoolHierarchicalTestExecutorService.java:185)	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService.invokeAll(ForkJoinPoolHierarchicalTestExecutorService.java:129)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService$ExclusiveTask.compute(ForkJoinPoolHierarchicalTestExecutorService.java:185)	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService.invokeAll(ForkJoinPoolHierarchicalTestExecutorService.java:129)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService$ExclusiveTask.compute(ForkJoinPoolHierarchicalTestExecutorService.java:185) 
{noformat}
So it's a problem of using CASE statement within GROUPING SETS. It is different from CALCITE-4512 and CALCITE-5045.


was (Author: yingyu):
Actually the type mismatch exception occurs even without using alias:
 * Test:

{noformat}
  @Test void testCaseInGroupingSets() {
    String sql = "SELECT empno,\n" +
        "CASE WHEN ename IN ('Fred','Eric') THEN 'Manager' ELSE 'Other' END\n" +
        "FROM emp\n" +
        "GROUP BY GROUPING SETS (\n" +
        "(empno, CASE WHEN ename IN ('Fred','Eric') THEN 'Manager' ELSE 'Other' END),\n" +
        "(empno)\n" +
        ")";
    sql(sql)
        .withConformance(SqlConformanceEnum.LENIENT)
        .ok();
  }
{noformat} 

* Result
{noformat}
Conversion to relational algebra failed to preserve datatypes:validated type:RecordType(INTEGER NOT NULL EMPNO, CHAR(7) NOT NULL EXPR$1) NOT NULLconverted type:RecordType(INTEGER NOT NULL EMPNO, CHAR(7) EXPR$1) NOT NULLrel:LogicalAggregate(group=[{0, 1}], groups=[[{0, 1}, {0}]])  LogicalProject(EMPNO=[$0], EXPR$1=[CASE(SEARCH($1, Sarg['Eric', 'Fred']:CHAR(4)), 'Manager', 'Other  ')])    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
java.lang.AssertionError: Conversion to relational algebra failed to preserve datatypes:validated type:RecordType(INTEGER NOT NULL EMPNO, CHAR(7) NOT NULL EXPR$1) NOT NULLconverted type:RecordType(INTEGER NOT NULL EMPNO, CHAR(7) EXPR$1) NOT NULLrel:LogicalAggregate(group=[{0, 1}], groups=[[{0, 1}, {0}]])  LogicalProject(EMPNO=[$0], EXPR$1=[CASE(SEARCH($1, Sarg['Eric', 'Fred']:CHAR(4)), 'Manager', 'Other  ')])    LogicalTableScan(table=[[CATALOG, SALES, EMP]])
	at org.apache.calcite.sql2rel.SqlToRelConverter.checkConvertedType(SqlToRelConverter.java:487)	at org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:602)	at org.apache.calcite.sql.test.AbstractSqlTester.convertSqlToRel2(AbstractSqlTester.java:536)	at org.apache.calcite.sql.test.AbstractSqlTester.assertSqlConvertsTo(AbstractSqlTester.java:477)	at org.apache.calcite.sql.test.AbstractSqlTester.assertConvertsTo(AbstractSqlTester.java:455)	at org.apache.calcite.test.SqlToRelFixture.convertsTo(SqlToRelFixture.java:106)	at org.apache.calcite.test.SqlToRelFixture.ok(SqlToRelFixture.java:94)	at org.apache.calcite.test.SqlToRelConverterTest.testCaseInGroupingSets(SqlToRelConverterTest.java:4507)	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)	at java.lang.reflect.Method.invoke(Method.java:498)	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725)	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)	at org.junit.jupiter.engine.extension.TimeoutInvocation.proceed(TimeoutInvocation.java:46)	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)	at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)	at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214)	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210)	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135)	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151)	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService$ExclusiveTask.compute(ForkJoinPoolHierarchicalTestExecutorService.java:185)	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService.invokeAll(ForkJoinPoolHierarchicalTestExecutorService.java:129)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService$ExclusiveTask.compute(ForkJoinPoolHierarchicalTestExecutorService.java:185)	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService.invokeAll(ForkJoinPoolHierarchicalTestExecutorService.java:129)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155)	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141)	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139)	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138)	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95)	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService$ExclusiveTask.compute(ForkJoinPoolHierarchicalTestExecutorService.java:185) 
{noformat}
So it's a problem of using CASE statement within GROUPING SETS. It is different from CALCITE-4512 and CALCITE-5045.

> CASE statement within GROUPING SETS throws type mis-match exception
> -------------------------------------------------------------------
>
>                 Key: CALCITE-5145
>                 URL: https://issues.apache.org/jira/browse/CALCITE-5145
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Yingyu Wang
>            Priority: Major
>
> Adding following test in SqlToRelConverterTest.java can reproduce the problem
> Note that the problem occurs when there are more than one grouping sets in the query, e.g.
>  * {{group by grouping sets ((empno, derived_col))}} is ok
>  * {{group by grouping sets ((empno, derived_col),(empno))}} produces the error
> {code:java}
> //core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
>   @Test public void testGroupingSetsDerivedCol() {
>     sql("SELECT empno,\n"
>         + "CASE\n"
>         + "when ename in ('Fred','Eric') then 'CEO'\n"
>         + "else 'Other'\n"
>         + "END AS derived_col\n"
>         + "from emp\n"
>         + "group by grouping sets ((empno, derived_col),(empno))")
>         .withConformance(SqlConformanceEnum.LENIENT).ok();
>   }
> {code}
> The error:
> {noformat}
> Conversion to relational algebra failed to preserve datatypes:
> validated type:
> RecordType(INTEGER NOT NULL EMPNO, CHAR(5) NOT NULL DERIVED_COL) NOT NULL
> converted type:
> RecordType(INTEGER NOT NULL EMPNO, CHAR(5) DERIVED_COL) NOT NULL
> rel:
> LogicalAggregate(group=[{0, 1}], groups=[[{0, 1}, {0}]])
>   LogicalProject(EMPNO=[$0], DERIVED_COL=[CASE(SEARCH($1, Sarg['Eric', 'Fred']:CHAR(4)), 'CEO  ', 'Other')])
>     LogicalTableScan(table=[[CATALOG, SALES, EMP]])
> java.lang.AssertionError: Conversion to relational algebra failed to preserve datatypes:
> validated type:
> RecordType(INTEGER NOT NULL EMPNO, CHAR(5) NOT NULL DERIVED_COL) NOT NULL
> converted type:
> RecordType(INTEGER NOT NULL EMPNO, CHAR(5) DERIVED_COL) NOT NULL
> rel:
> LogicalAggregate(group=[{0, 1}], groups=[[{0, 1}, {0}]])
>   LogicalProject(EMPNO=[$0], DERIVED_COL=[CASE(SEARCH($1, Sarg['Eric', 'Fred']:CHAR(4)), 'CEO  ', 'Other')])
>     LogicalTableScan(table=[[CATALOG, SALES, EMP]])
> 	at org.apache.calcite.sql2rel.SqlToRelConverter.checkConvertedType(SqlToRelConverter.java:487)
> 	at org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:602)
> 	at org.apache.calcite.sql.test.AbstractSqlTester.convertSqlToRel2(AbstractSqlTester.java:536)
> 	at org.apache.calcite.sql.test.AbstractSqlTester.assertSqlConvertsTo(AbstractSqlTester.java:477)
> 	at org.apache.calcite.sql.test.AbstractSqlTester.assertConvertsTo(AbstractSqlTester.java:455)
> 	at org.apache.calcite.test.SqlToRelFixture.convertsTo(SqlToRelFixture.java:106)
> 	at org.apache.calcite.test.SqlToRelFixture.ok(SqlToRelFixture.java:94)
> 	at org.apache.calcite.test.SqlToRelConverterTest.testGroupingSetsDerivedCol(SqlToRelConverterTest.java:344)
> {noformat}



--
This message was sent by Atlassian Jira
(v8.20.7#820007)