[ http://issues.apache.org/jira/browse/DERBY-500?page=comments#action_12332644 ]
Kathey Marsden commented on DERBY-500: -------------------------------------- Checked this fix into 10.1 Date: Thu Oct 20 15:18:36 2005 New Revision: 327012 URL: http://svn.apache.org/viewcvs?rev=327012&view=rev > Update/Select failure when BLOB/CLOB fields updated in several rows by > PreparedStatement using setBinaryStream and setCharacterStream > ------------------------------------------------------------------------------------------------------------------------------------- > > Key: DERBY-500 > URL: http://issues.apache.org/jira/browse/DERBY-500 > Project: Derby > Type: Bug > Components: JDBC > Versions: 10.1.1.0 > Environment: Windows 2000, java SDK 1.4 > Reporter: Peter Kovgan > Assignee: Sunitha Kambhampati > Fix For: 10.1.2.0, 10.2.0.0 > Attachments: Derby500.diff.txt, Derby500.stat.txt, V10.1_Derby500.diff.txt, > V10.1_Derby500.stat.txt > > I have table contained BLOB and CLOB fields: > Create table string is: > private static final String CREATE = "CREATE TABLE ta (" + > "ta_id INTEGER NOT NULL," + > "mname VARCHAR( 254 ) NOT NULL," + > "mvalue INT NOT NULL," + > "mdate DATE NOT NULL," + > "bytedata BLOB NOT NULL," + > "chardata CLOB NOT NULL," + > "PRIMARY KEY ( ta_id ))"; > Then I insert 2000 rows in the table. > Then I update all 2000 rows by command: > private static final String UPDATE = "UPDATE ta " + > "SET bytedata=? ,chardata=? " + > "WHERE mvalue=?"; > /**create blob and clob arrays**/ > int len1 = 10000;//for blob length data > int len2 = 15000;//for clob length data > byte buf [] = new byte[len1]; > for(int i=0;i<len1;i++){ > buf [i] = (byte)45; > } > ByteArrayInputStream bais = new ByteArrayInputStream(buf); > > char[] bufc = new char[len2]; > for (int i = 0; i < bufc.length; i++) { > bufc[i] = (char)'b'; > } > CharArrayReader car = new CharArrayReader(bufc); > /***/ > PreparedStatement pstmt = connection.prepareStatement(UPDATE); > pstmt.setBinaryStream(1,bais, len1); > pstmt.setCharacterStream(2,car, len2); > pstmt.setInt(3,5000); > int updated = pstmt.executeUpdate(); > pstmt.close(); > System.out.printlen("updated ="+updated ); > all 2000 rows updated , because I receive output : updated =2000 > But If I run select (SELECT bytedata ,chardata FROM ta) after update, > select failed with error: > ERROR XSDA7: Restore of a serializable or SQLData object of class , attempted > to > read more data than was originally stored > at > org.apache.derby.iapi.error.StandardException.newException(StandardEx > ception.java) > at > org.apache.derby.impl.store.raw.data.StoredPage.readRecordFromArray(S > toredPage.java) > at > org.apache.derby.impl.store.raw.data.StoredPage.restoreRecordFromSlot > (StoredPage.java) > at > org.apache.derby.impl.store.raw.data.BasePage.fetchFromSlot(BasePage. > java) > at > org.apache.derby.impl.store.access.conglomerate.GenericScanController > .fetchRows(GenericScanController.java) > at > org.apache.derby.impl.store.access.heap.HeapScan.fetchNextGroup(HeapS > can.java) > at > org.apache.derby.impl.sql.execute.BulkTableScanResultSet.reloadArray( > BulkTableScanResultSet.java) > at > org.apache.derby.impl.sql.execute.BulkTableScanResultSet.getNextRowCo > re(BulkTableScanResultSet.java) > at > org.apache.derby.impl.sql.execute.NestedLoopJoinResultSet.getNextRowC > ore(NestedLoopJoinResultSet.java) > at > org.apache.derby.impl.sql.execute.NestedLoopLeftOuterJoinResultSet.ge > tNextRowCore(NestedLoopLeftOuterJoinResultSet.java) > at > org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRow > Core(ProjectRestrictResultSet.java) > at > org.apache.derby.impl.sql.execute.SortResultSet.getRowFromResultSet(S > ortResultSet.java) > at > org.apache.derby.impl.sql.execute.SortResultSet.getNextRowFromRS(Sort > ResultSet.java) > at > org.apache.derby.impl.sql.execute.SortResultSet.loadSorter(SortResult > Set.java) > at > org.apache.derby.impl.sql.execute.SortResultSet.openCore(SortResultSe > t.java) > at > org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.open(BasicN > oPutResultSetImpl.java) > at > org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPre > paredStatement.java) > at > org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedState > ment.java) > at > org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(Em > bedPreparedStatement.java) > at > org.apache.derby.impl.jdbc.EmbedPreparedStatement.execute(EmbedPrepar > edStatement.java) > at com.beep_beep.dbtest.complex.Benchmark.testSelect(Unknown Source) > at > com.beep_beep.dbtest.complex.Benchmark.executeSimplestBigTable(Unknown Sour > ce) > at com.beep_beep.dbtest.complex.Benchmark.testBigTable(Unknown Source) > at > com.beep_beep.dbtest.complex.Benchmark.executeDegradationBenchmark(Unknown > Source) > at com.beep_beep.dbtest.complex.Benchmark.main(Unknown Source) > From the stack trace and from console I see that Update passed, but error was > raised in Select after Update. > When I try the same update, but with difference(I changed WHERE clause, > causing update only 1 row): > private static final String UPDATE = "UPDATE ta " + > "SET bytedata=? ,chardata=? " + > "WHERE mname=?"; > PreparedStatement pstmt = connection.prepareStatement(UPDATE); > pstmt.setBinaryStream(1,bais, len1); > pstmt.setCharacterStream(2,car, len2); > pstmt.setInt(3,"PETER"); > int updated = pstmt.executeUpdate(); > pstmt.close(); > System.out.printlen("updated ="+updated ); > Only 1 row updated , because I receive output : updated =1 > In this case I have NO errors in select(the same as previous) . > My assumption: > It seems that Update receives ByteArrayInputStream and updates correctly only > 1 row, then all rows updated by some > incorrect value(may be because ByteArrayInputStream reached its end in first > update), causing select failure. > I tested PointBase by the same test and PointBase passed this stage without > errors, no matter how many rows was updated. > So I think it is a bug. > Thank you. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira