db-derby-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Simon <simonzm...@gmail.com>
Subject SQLDataException when updating rows (Vert.x)
Date Sun, 27 Mar 2016 07:16:07 GMT
Hello all,

I am not completely sure if this problem is to do with Vert.x and its JDBC
wrappers or Derby 10.12.1.1.

My table is defined like this:

        create table pipeline_command (
               id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH
1, INCREMENT BY 1) primary key,
               pipeline_id integer references pipeline(id),
               pguid varchar(40),
               command varchar(512),
               arguments varchar(512),
               status varchar(15)
        )

I try to perform a simple update of a table using Vert.x:

    update pipeline_command set status = 'WAIT_RESULT' where id = ?
Derby throws an error while trying to interrogate the result set for
updated rows:

java.sql.SQLDataException: Invalid character string format for type long.
at
org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:84)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Util.java:233)
at
org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:424)
at
org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(TransactionResourceImpl.java:353)
at
org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConnection.java:2405)
at
org.apache.derby.impl.jdbc.ConnectionChild.handleException(ConnectionChild.java:88)
at
org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1432)
at
org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(EmbedPreparedStatement.java:1709)
at
org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeLargeUpdate(EmbedPreparedStatement.java:320)
at
org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeUpdate(EmbedPreparedStatement.java:309)
at
com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:410)
at io.vertx.ext.jdbc.impl.actions.JDBCUpdate.execute(JDBCUpdate.java:50)
...
Caused by: ERROR 22018: Invalid character string format for type long.
at
org.apache.derby.iapi.error.StandardException.newException(StandardException.java:290)
at
org.apache.derby.iapi.error.StandardException.newException(StandardException.java:285)
at org.apache.derby.iapi.types.SQLChar.getLong(SQLChar.java:447)
at
org.apache.derby.impl.sql.execute.UpdateResultSet.collectAffectedRows(UpdateResultSet.java:534)
at
org.apache.derby.impl.sql.execute.UpdateResultSet.open(UpdateResultSet.java:272)
at
org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(GenericPreparedStatement.java:473)
at
org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:352)
at
org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1340)

What's happening seems to be an inconsistent expectation about what is in
the result set.

In the code below from UpdateResultSet.java Derby interrogates the columns
of the table and correctly decides the first column is auto increment:

    for(col=1;col<=maxColumns;col++)
    {
        ColumnDescriptor cd = td.getColumnDescriptor(col);
        if(cd.isAutoincrement())
        {
            break;
        }
    }

However it then tries to use that column value on the result set. which has
only 3 columns - they are the original value, the modified value and the
indices of the updated columns.

    if(col <= maxColumns)
    {
       DataValueDescriptor dvd = row.cloneColumn(col);
       identityVal = dvd.getLong();
    }


It addresses the wrong column (the modified column is type VARCHAR, so it
gets back a VARCHAR column and tries to call getLong() on it), and throws
the above exception.

I'm not sure if this is because Vert.x is calling something wrong, or if
I'm defining the table wrong or something else.

I would very much appreciate any help!

Cheers / thanks!

Simon

Mime
View raw message