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

Kristian Waagan resolved DERBY-3645.
------------------------------------

       Resolution: Fixed
    Fix Version/s: 10.6.0.0

Fixed by the combination of DERBY-4477 and DERBY-4520.
Verified against trunk revision 980933, but it would be nice if the reporter 
verified the fix as well.

I do not plan to back-port the fix(es) due to the rather signficant changes 
involved, but it may be technically possible.

> Insert into selecting BLOB column twice leads to SQLException: Restore of a 
> serializable or SQLData object of class error selecting from the table
> --------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-3645
>                 URL: https://issues.apache.org/jira/browse/DERBY-3645
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.3.3.0, 10.4.2.0, 10.5.1.1
>            Reporter: Kathey Marsden
>             Fix For: 10.6.0.0
>
>         Attachments: DoubleInsertInto.java
>
>
> The following code which inserts into a table by selecting a blob column 
> twice from another table, causes SQLException: Restore of a serializable or 
> SQLData object of class error selecting from the table. See attached program 
> DoubleInsertInto for full repro.  Stack trace is below.  Verified back to 
> 10.3 but probably goes back further.
>         s.executeUpdate("CREATE TABLE T_MAIN(" +
>                 "ID INT  GENERATED ALWAYS AS IDENTITY PRIMARY KEY, " +
>                 "V BLOB(590473235) )");
>         String ins1 = "INSERT INTO T_MAIN(V) VALUES (?)";
>         
>         PreparedStatement ps;
>         ps = c.prepareStatement(ins1);
>       byte[] bytes = new byte[35000];
>       for (int i = 0; i < 35000; i++)
>           bytes[i] = (byte) i ;
>       ps.setBytes(1, bytes);
>         ps.executeUpdate();
>         ps.close();
>       s.executeUpdate("CREATE TABLE T_COPY ( V1 BLOB(2M), V2 BLOB(2M))");
>       Statement stmt = c.createStatement();
>       stmt.executeUpdate("INSERT INTO T_COPY SELECT  V, V FROM T_MAIN");
>       ResultSet rs = stmt.executeQuery("SELECT * FROM T_COPY");
>       rs.next();
>       String v1 = rs.getString(1);
>       String v2 = rs.getString(2);
>       System.out.println("v1:" + v1);
>       System.out.println("v2:" + v2);
>       System.out.println("I am done");
> Exception in thread "main" java.sql.SQLException: Restore of a serializable 
> or SQLData object of class , attempted to re
> ad more data than was originally stored
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:95)
>         at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:87)
>         at org.apache.derby.impl.jdbc.Util.seeNextException(Util.java:223)
>         at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:398)
>         at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(TransactionResourceImpl.java:346)
>         at 
> org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConnection.java:2125)
>         at 
> org.apache.derby.impl.jdbc.ConnectionChild.handleException(ConnectionChild.java:81)
>         at 
> org.apache.derby.impl.jdbc.EmbedResultSet.closeOnTransactionError(EmbedResultSet.java:4320)
>         at 
> org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(EmbedResultSet.java:463)
>         at 
> org.apache.derby.impl.jdbc.EmbedResultSet.next(EmbedResultSet.java:367)
>         at DoubleInsertInto.main(DoubleInsertInto.java:47)
> Caused by: java.sql.SQLException: Restore of a serializable or SQLData object 
> of class , attempted to read more data tha
> n was originally stored
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:45)
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(SQLExceptionFactory40.java:11
> 9)
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:70)
>         ... 10 more
> Caused by: java.sql.SQLException: Java exception: ': java.io.EOFException'.
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:45)
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(SQLExceptionFactory40.java:11
> 9)
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:70)
>         at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:87)
>         at org.apache.derby.impl.jdbc.Util.javaException(Util.java:244)
>         at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:403)
>         ... 8 more
> Caused by: java.io.EOFException
>         at 
> org.apache.derby.iapi.types.SQLBinary.readBinaryLength(SQLBinary.java:350)
>         at 
> org.apache.derby.iapi.types.SQLBinary.readExternalFromArray(SQLBinary.java:328)
>         at 
> org.apache.derby.impl.store.raw.data.StoredPage.readRecordFromArray(StoredPage.java:5568)
>         at 
> org.apache.derby.impl.store.raw.data.StoredPage.restoreRecordFromSlot(StoredPage.java:1497)
>         at 
> org.apache.derby.impl.store.raw.data.BasePage.fetchFromSlot(BasePage.java:459)
>         at 
> org.apache.derby.impl.store.access.conglomerate.GenericScanController.fetchRows(GenericScanController.java:75
> 9)
>         at 
> org.apache.derby.impl.store.access.heap.HeapScan.fetchNextGroup(HeapScan.java:324)
>         at 
> org.apache.derby.impl.sql.execute.BulkTableScanResultSet.reloadArray(BulkTableScanResultSet.java:327)
>         at 
> org.apache.derby.impl.sql.execute.BulkTableScanResultSet.getNextRowCore(BulkTableScanResultSet.java:282)
>         at 
> org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.getNextRow(BasicNoPutResultSetImpl.java:460)
>         at 
> org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(EmbedResultSet.java:423)
>         ... 2 more

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to