You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ignite.apache.org by "Ivan Artiukhov (Jira)" <ji...@apache.org> on 2023/06/12 09:10:00 UTC

[jira] [Created] (IGNITE-19705) No implicit type conversion when using an UPDATE PreparedStatement (ClassCastException)

Ivan Artiukhov created IGNITE-19705:
---------------------------------------

             Summary: No implicit type conversion when using an UPDATE PreparedStatement (ClassCastException)
                 Key: IGNITE-19705
                 URL: https://issues.apache.org/jira/browse/IGNITE-19705
             Project: Ignite
          Issue Type: Bug
            Reporter: Ivan Artiukhov


Apache Ignite 3, rev. 44c97c00654e076031cf92631f3a7c4439458570

Steps:
- start a node
- create the following table: {{CREATE TABLE testTable (id INT PRIMARY KEY, counter BIGINT)}}
- insert a row using a PreparedStatement, use {{setInt()}} to set a value for BIGINT column
- update a row using a PreparedStatement, use {{setInt()}} to set a value for BIGINT column

Expected result:
- a row is added and then updated
- a row is added, but UPDATE throws a {{ClassCastException}}

Reproducer:
{code:java}
@Test
public void castIntegerToLongTest() throws SQLException {
    String createTableDdl = "CREATE TABLE testTable (id INT PRIMARY KEY, counter BIGINT)";
    log.info("Execute: {}", createTableDdl);
    statement.execute(createTableDdl);

    // PASSES
    try (PreparedStatement preparedStatement =
            connection.prepareStatement("INSERT INTO testTable (id, counter) VALUES (?, ?)")) {
        preparedStatement.setInt(1, 1);
        preparedStatement.setInt(2, 10);

        assertEquals(1, preparedStatement.executeUpdate());
    }

    // FAILS
    try (PreparedStatement preparedStatement =
            connection.prepareStatement("UPDATE testTable SET counter = ? WHERE id = 1")) {
        preparedStatement.setInt(1, 20);

        assertEquals(1, preparedStatement.executeUpdate());
    }
}
{code}


The exception in the node's log:
{noformat}
2023-06-12 11:56:09:009 +0300 [INFO][%TypesCastTest_cluster_0%vault-0][IndexManager] Index created [schema=PUBLIC, table=TESTTABLE, index=TESTTABLE_PK, indexId=2]
2023-06-12 11:56:09:058 +0300 [INFO][TypesCastTest_cluster_0-srv-worker-1][ClientInboundMessageHandler] Partition assignment changed, notifying client [remoteAddress=/127.0.0.1:48506]
2023-06-12 11:56:11:002 +0300 [INFO][%TypesCastTest_cluster_0%sql-execution-pool-2][ExchangeServiceImpl] Failed to execute query fragment: queryId=ebbbf903-b6ac-4f60-a43a-750b314d7662, fragmentId=7
org.apache.ignite.sql.SqlException: IGN-CMN-65535 TraceId:f3a5a43c-2d11-411d-9eb1-35c3b4b228d3 class java.lang.Integer cannot be cast to class java.lang.Long (java.lang.Integer and java.lang.Long are in module java.base of loader 'bootstrap')
	at org.apache.ignite.internal.sql.engine.exec.ExchangeServiceImpl.wrapIfNecessary(ExchangeServiceImpl.java:148)
	at org.apache.ignite.internal.sql.engine.exec.ExchangeServiceImpl.sendError(ExchangeServiceImpl.java:114)
	at org.apache.ignite.internal.sql.engine.exec.rel.Outbox.sendError(Outbox.java:257)
	at org.apache.ignite.internal.sql.engine.exec.rel.Outbox.onError(Outbox.java:179)
	at org.apache.ignite.internal.sql.engine.exec.rel.AbstractNode.onError(AbstractNode.java:140)
	at org.apache.ignite.internal.sql.engine.exec.rel.AbstractNode.onError(AbstractNode.java:140)
	at org.apache.ignite.internal.sql.engine.exec.ExecutionContext.lambda$execute$0(ExecutionContext.java:318)
	at org.apache.ignite.internal.sql.engine.exec.QueryTaskExecutorImpl.lambda$execute$0(QueryTaskExecutorImpl.java:80)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.Long (java.lang.Integer and java.lang.Long are in module java.base of loader 'bootstrap')
	at org.apache.ignite.internal.schema.row.RowAssembler.writeValue(RowAssembler.java:134)
	at org.apache.ignite.internal.sql.engine.schema.IgniteTableImpl.convertRow(IgniteTableImpl.java:524)
	at org.apache.ignite.internal.sql.engine.schema.IgniteTableImpl.upsertAll(IgniteTableImpl.java:344)
	at org.apache.ignite.internal.sql.engine.exec.rel.ModifyNode.flushTuples(ModifyNode.java:224)
	at org.apache.ignite.internal.sql.engine.exec.rel.ModifyNode.tryEnd(ModifyNode.java:187)
	at org.apache.ignite.internal.sql.engine.exec.rel.ModifyNode.end(ModifyNode.java:160)
	at org.apache.ignite.internal.sql.engine.exec.rel.StorageScanNode.push(StorageScanNode.java:217)
	at org.apache.ignite.internal.sql.engine.exec.rel.StorageScanNode$SubscriberImpl.lambda$onComplete$2(StorageScanNode.java:303)
	at org.apache.ignite.internal.sql.engine.exec.ExecutionContext.lambda$execute$0(ExecutionContext.java:315)
	... 4 more
2023-06-12 11:56:11:020 +0300 [INFO][%TypesCastTest_cluster_0%sql-execution-pool-1][JdbcQueryEventHandlerImpl] Exception while executing query [query=UPDATE testTable SET counter = ? WHERE id = 1]
org.apache.ignite.sql.SqlException: IGN-CMN-65535 TraceId:f3a5a43c-2d11-411d-9eb1-35c3b4b228d3 Query remote fragment execution failed: nodeName=TypesCastTest_cluster_0, queryId=ebbbf903-b6ac-4f60-a43a-750b314d7662, fragmentId=7, originalMessage=class java.lang.Integer cannot be cast to class java.lang.Long (java.lang.Integer and java.lang.Long are in module java.base of loader 'bootstrap')
	at org.apache.ignite.internal.sql.engine.AsyncSqlCursorImpl.wrapIfNecessary(AsyncSqlCursorImpl.java:104)
	at org.apache.ignite.internal.sql.engine.AsyncSqlCursorImpl.lambda$requestNextAsync$0(AsyncSqlCursorImpl.java:80)
	at java.base/java.util.concurrent.CompletableFuture.uniHandle(CompletableFuture.java:930)
	at java.base/java.util.concurrent.CompletableFuture$UniHandle.tryFire(CompletableFuture.java:907)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
	at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2088)
	at org.apache.ignite.internal.sql.engine.exec.rel.AsyncRootNode.lambda$closeAsync$0(AsyncRootNode.java:157)
	at java.base/java.util.concurrent.ConcurrentLinkedQueue.forEachFrom(ConcurrentLinkedQueue.java:1037)
	at java.base/java.util.concurrent.ConcurrentLinkedQueue.forEach(ConcurrentLinkedQueue.java:1054)
	at org.apache.ignite.internal.sql.engine.exec.rel.AsyncRootNode.closeAsync(AsyncRootNode.java:157)
	at org.apache.ignite.internal.sql.engine.exec.rel.AsyncRootNode.onError(AsyncRootNode.java:112)
	at org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl$DistributedQueryManager.lambda$onError$2(ExecutionServiceImpl.java:513)
	at java.base/java.util.concurrent.CompletableFuture.uniAcceptNow(CompletableFuture.java:753)
	at java.base/java.util.concurrent.CompletableFuture.uniAcceptStage(CompletableFuture.java:731)
	at java.base/java.util.concurrent.CompletableFuture.thenAccept(CompletableFuture.java:2108)
	at org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl$DistributedQueryManager.onError(ExecutionServiceImpl.java:512)
	at org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.onMessage(ExecutionServiceImpl.java:364)
	at org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.lambda$start$4(ExecutionServiceImpl.java:213)
	at org.apache.ignite.internal.sql.engine.message.MessageServiceImpl.onMessageInternal(MessageServiceImpl.java:153)
	at org.apache.ignite.internal.sql.engine.message.MessageServiceImpl.lambda$onMessage$1(MessageServiceImpl.java:124)
	at org.apache.ignite.internal.sql.engine.exec.QueryTaskExecutorImpl.lambda$execute$0(QueryTaskExecutorImpl.java:80)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: org.apache.ignite.internal.sql.engine.metadata.RemoteFragmentExecutionException: IGN-CMN-65535 TraceId:f3a5a43c-2d11-411d-9eb1-35c3b4b228d3 Query remote fragment execution failed: nodeName=TypesCastTest_cluster_0, queryId=ebbbf903-b6ac-4f60-a43a-750b314d7662, fragmentId=7, originalMessage=class java.lang.Integer cannot be cast to class java.lang.Long (java.lang.Integer and java.lang.Long are in module java.base of loader 'bootstrap')
	at org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.onMessage(ExecutionServiceImpl.java:361)
	... 7 more
{noformat}




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