Derby
  1. Derby
  2. DERBY-500

Update/Select failure when BLOB/CLOB fields updated in several rows by PreparedStatement using setBinaryStream and setCharacterStream

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 10.1.1.0
    • Fix Version/s: 10.1.2.1, 10.2.1.6
    • Component/s: JDBC
    • Labels:
      None
    • Environment:
      Windows 2000, java SDK 1.4

      Description

      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.

      1. Derby500.stat.txt
        0.8 kB
        Sunitha Kambhampati
      2. Derby500.diff.txt
        38 kB
        Sunitha Kambhampati
      3. V10.1_Derby500.diff.txt
        40 kB
        Sunitha Kambhampati
      4. V10.1_Derby500.stat.txt
        1 kB
        Sunitha Kambhampati
      5. Doc_JdbcImpl_paper.diff.txt
        2 kB
        Sunitha Kambhampati

        Activity

        Gavin made changes -
        Workflow jira [ 12323213 ] Default workflow, editable Closed status [ 12801325 ]
        Sunitha Kambhampati made changes -
        Status Resolved [ 5 ] Closed [ 6 ]
        Sunitha Kambhampati made changes -
        Attachment Doc_JdbcImpl_paper.diff.txt [ 12315013 ]
        Sunitha Kambhampati made changes -
        Fix Version/s 10.1.1.2 [ 12310353 ]
        Status Open [ 1 ] Resolved [ 5 ]
        Resolution Fixed [ 1 ]
        Sunitha Kambhampati made changes -
        Attachment V10.1_Derby500.stat.txt [ 12314973 ]
        Attachment V10.1_Derby500.diff.txt [ 12314972 ]
        Sunitha Kambhampati made changes -
        Fix Version/s 10.2.0.0 [ 11187 ]
        Sunitha Kambhampati made changes -
        Attachment Derby500.diff.txt [ 12314932 ]
        Sunitha Kambhampati made changes -
        Attachment Derby500.stat.txt [ 12314931 ]
        Sunitha Kambhampati made changes -
        Assignee Sunitha Kambhampati [ skambha ]
        A B made changes -
        Assignee A B [ army ]
        A B made changes -
        Fix Version/s 10.1.2.0 [ 12310270 ]
        A B made changes -
        Assignee A B [ army ]
        Mike Matrigali made changes -
        Field Original Value New Value
        Component/s JDBC [ 11407 ]
        Peter Kovgan created issue -

          People

          • Assignee:
            Sunitha Kambhampati
            Reporter:
            Peter Kovgan
          • Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development