[ 
https://issues.apache.org/jira/browse/CALCITE-7197?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

ASF GitHub Bot updated CALCITE-7197:
------------------------------------
    Labels: pull-request-available  (was: )

> UnsupportedOperationException when using dynamic parameters inside ROW 
> expression
> ---------------------------------------------------------------------------------
>
>                 Key: CALCITE-7197
>                 URL: https://issues.apache.org/jira/browse/CALCITE-7197
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>            Reporter: Zhengqiang Duan
>            Assignee: Zhengqiang Duan
>            Priority: Major
>              Labels: pull-request-available
>
> When using dynamic parameters inside a {{ROW}} expression, preparing the 
> statement fails with an {{{}UnsupportedOperationException{}}}. Following is 
> the unit test:
> {code:java}
> @Test void testSelectWithPlaceholdersInRowExpression() {
>   CalciteAssert.that()
>       .with(Lex.MYSQL)
>       .with(CalciteAssert.Config.SCOTT)
>       .query("select empno, ename from emp\n"
>           + "where row(empno, ename) in ((?, ?))")
>       .consumesPreparedStatement(p -> {
>         p.setInt(1, 7782);
>         p.setString(2, "CLARK");
>       })
>       .returns(resultSet -> {
>         try {
>           assertTrue(resultSet.next());
>           assertThat(resultSet.getInt(1), is(7782));
>           assertThat(resultSet.getString(2), is("CLARK"));
>           assertFalse(resultSet.next());
>         } catch (SQLException e) {
>           throw new RuntimeException(e);
>         }
>       });
> } {code}
> The detailed exception information is as follows:
> {code:java}
> Error while preparing statement [select empno, ename from empwhere row(empno, 
> ename) in ((?, ?))]java.sql.SQLException: Error while preparing statement 
> [select empno, ename from empwhere row(empno, ename) in ((?, ?))]     at 
> org.apache.calcite.avatica.Helper.createException(Helper.java:56)    at 
> org.apache.calcite.avatica.Helper.createException(Helper.java:41)    at 
> org.apache.calcite.jdbc.CalciteConnectionImpl.prepareStatement_(CalciteConnectionImpl.java:236)
>       at 
> org.apache.calcite.jdbc.CalciteConnectionImpl.prepareStatement(CalciteConnectionImpl.java:215)
>        at 
> org.apache.calcite.jdbc.CalciteConnectionImpl.prepareStatement(CalciteConnectionImpl.java:103)
>        at 
> org.apache.calcite.avatica.AvaticaConnection.prepareStatement(AvaticaConnection.java:178)
>     at 
> org.apache.calcite.test.CalciteAssert.assertPrepare(CalciteAssert.java:651)  
> at org.apache.calcite.test.CalciteAssert.access$700(CalciteAssert.java:152)   
>   at 
> org.apache.calcite.test.CalciteAssert$AssertQuery.lambda$returns$1(CalciteAssert.java:1549)
>   at 
> org.apache.calcite.test.CalciteAssert$AssertQuery.withConnection(CalciteAssert.java:1485)
>     at 
> org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1544)
>    at 
> org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1534)
>    at 
> org.apache.calcite.test.JdbcTest.testSelectWithPlaceholdersInRowExpression(JdbcTest.java:9025)
>        at 
> java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
>         at java.base/java.lang.reflect.Method.invoke(Method.java:580)   at 
> org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:727)
>        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.SameThreadTimeoutInvocation.proceed(SameThreadTimeoutInvocation.java:45)
>   at 
> org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:156)
>      at 
> org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:147)
>        at 
> org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:86)
>     at 
> org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:103)
>      at 
> org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:93)
>       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.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:92)
>        at 
> org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:86)
>        at 
> org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:217)
>     at 
> org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
>         at 
> org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:213)
>      at 
> org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:138)
>       at 
> org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68)
>        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)
>        at 
> java.base/java.util.concurrent.RecursiveAction.exec(RecursiveAction.java:194) 
>        at 
> java.base/java.util.concurrent.ForkJoinTask.doExec$$$capture(ForkJoinTask.java:387)
>   at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java)    
>     at 
> java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312)
>    at 
> java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843)     
> at 
> java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808) 
>        at 
> java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)
>        Suppressed: org.apache.calcite.util.TestUtil$ExtraInformation: With 
> materializationsEnabled=false, limit=-1             at 
> org.apache.calcite.util.TestUtil.rethrow(TestUtil.java:404)          at 
> org.apache.calcite.test.CalciteAssert.assertPrepare(CalciteAssert.java:690)   
>        ... 64 moreCaused by: java.lang.RuntimeException: while converting 
> `EMP`.`EMPNO` = ?    at 
> org.apache.calcite.sql2rel.ReflectiveConvertletTable.lambda$registerNodeTypeMethod$1(ReflectiveConvertletTable.java:99)
>       at 
> org.apache.calcite.sql2rel.SqlNodeToRexConverterImpl.convertCall(SqlNodeToRexConverterImpl.java:62)
>   at 
> org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:5910)
>    at 
> org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:5073)
>    at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:175)      at 
> org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.convertExpression(SqlToRelConverter.java:5724)
>        at 
> org.apache.calcite.sql2rel.SqlToRelConverter.lambda$convertInToOr$7(SqlToRelConverter.java:1788)
>      at org.apache.calcite.util.Util$TransformingList.get(Util.java:2823)    
> at java.base/java.util.AbstractList$Itr.next(AbstractList.java:373)     at 
> org.apache.calcite.rex.RexUtil.flattenAnd(RexUtil.java:1326) at 
> org.apache.calcite.rex.RexUtil.composeConjunction(RexUtil.java:1299) at 
> org.apache.calcite.rex.RexUtil.composeConjunction(RexUtil.java:1285) at 
> org.apache.calcite.sql2rel.SqlToRelConverter.convertInToOr(SqlToRelConverter.java:1785)
>       at 
> org.apache.calcite.sql2rel.SqlToRelConverter.substituteSubQuery(SqlToRelConverter.java:1219)
>  at 
> org.apache.calcite.sql2rel.SqlToRelConverter.replaceSubQueries(SqlToRelConverter.java:1163)
>   at 
> org.apache.calcite.sql2rel.SqlToRelConverter.convertWhere(SqlToRelConverter.java:1128)
>        at 
> org.apache.calcite.sql2rel.SqlToRelConverter.convertSelectImpl(SqlToRelConverter.java:794)
>    at 
> org.apache.calcite.sql2rel.SqlToRelConverter.convertSelect(SqlToRelConverter.java:735)
>        at 
> org.apache.calcite.sql2rel.SqlToRelConverter.convertQueryRecursive(SqlToRelConverter.java:3923)
>       at 
> org.apache.calcite.sql2rel.SqlToRelConverter.convertQuery(SqlToRelConverter.java:628)
>         at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:258)    
>   at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:221)      at 
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:673)
>  at 
> org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:524)
>   at 
> org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:492)
>         at 
> org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:246)
>      at 
> org.apache.calcite.jdbc.CalciteConnectionImpl.prepareStatement_(CalciteConnectionImpl.java:226)
>       ... 68 moreCaused by: java.lang.reflect.InvocationTargetException       
> at 
> java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:118)
>         at java.base/java.lang.reflect.Method.invoke(Method.java:580)   at 
> org.apache.calcite.sql2rel.ReflectiveConvertletTable.lambda$registerNodeTypeMethod$1(ReflectiveConvertletTable.java:95)
>       ... 94 moreCaused by: java.lang.UnsupportedOperationException: class 
> org.apache.calcite.sql.SqlDynamicParam: ?  at 
> org.apache.calcite.util.Util.needToImplement(Util.java:1112) at 
> org.apache.calcite.sql.validate.SqlValidatorImpl.getValidatedNodeType(SqlValidatorImpl.java:1854)
>     at 
> org.apache.calcite.sql2rel.SqlToRelConverter.getDynamicParamType(SqlToRelConverter.java:432)
>  at 
> org.apache.calcite.sql2rel.SqlToRelConverter.convertDynamicParam(SqlToRelConverter.java:3757)
>         at 
> org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:5927)
>    at 
> org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.visit(SqlToRelConverter.java:5073)
>    at org.apache.calcite.sql.SqlDynamicParam.accept(SqlDynamicParam.java:78)  
>      at 
> org.apache.calcite.sql2rel.SqlToRelConverter$Blackboard.convertExpression(SqlToRelConverter.java:5724)
>        at 
> org.apache.calcite.sql2rel.StandardConvertletTable.convertOperands(StandardConvertletTable.java:1286)
>         at 
> org.apache.calcite.sql2rel.StandardConvertletTable.convertOperands(StandardConvertletTable.java:1278)
>         at 
> org.apache.calcite.sql2rel.StandardConvertletTable.convertCall(StandardConvertletTable.java:1184)
>     at 
> java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
>         ... 96 more {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to