Zhengqiang Duan created CALCITE-7197:
----------------------------------------

             Summary: 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


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