Program: 80230
Project: 80230
Buggy source:
/** 
 * tests set bytes method of blob.
 */
public void testSetBytes() throws SQLException {
  Connection con=getConnection();
  try {
    con.setAutoCommit(false);
    PreparedStatement pstmt=con.prepareStatement("String_Node_Str" + "String_Node_Str");
    pstmt.setInt(1,1);
    Blob blob=con.createBlob();
    byte[] data=new byte[BUFFER_SIZE];
    for (int i=0; i < BUFFER_SIZE; i++) {
      data[i]=(byte)(i % 255);
    }
    blob.setBytes(1,data);
    assertEquals(BUFFER_SIZE,blob.length());
    pstmt.setBlob(2,blob);
    pstmt.executeUpdate();
    Statement stmt=con.createStatement();
    ResultSet rs=stmt.executeQuery("String_Node_Str");
    assertEquals(true,rs.next());
    blob=rs.getBlob(1);
    assertEquals(BUFFER_SIZE,blob.length());
    byte[] data1=new byte[UPDATE_SIZE];
    for (int i=0; i < UPDATE_SIZE; i++)     data1[i]=120;
    blob.setBytes(UPDATE_SIZE,data1);
    byte[] data2=blob.getBytes(100,UPDATE_SIZE);
    for (int i=0; i < UPDATE_SIZE; i++)     assertEquals(data1[i],data2[i]);
    blob.setBytes(BUFFER_SIZE + 1,data1);
    assertEquals(BUFFER_SIZE + UPDATE_SIZE,blob.length());
    data2=blob.getBytes(BUFFER_SIZE + 1,UPDATE_SIZE);
    for (int i=0; i < UPDATE_SIZE; i++)     assertEquals(data1[i],data2[i]);
    pstmt.setInt(1,2);
    pstmt.setBlob(2,blob);
    pstmt.executeUpdate();
    rs=stmt.executeQuery("String_Node_Str" + "String_Node_Str");
    assertEquals(true,rs.next());
    blob=rs.getBlob(1);
    assertEquals(BUFFER_SIZE + UPDATE_SIZE,blob.length());
    data2=blob.getBytes(100,UPDATE_SIZE);
    for (int i=0; i < UPDATE_SIZE; i++)     assertEquals(data1[i],data2[i]);
    data2=blob.getBytes(BUFFER_SIZE + 1,UPDATE_SIZE);
    for (int i=0; i < UPDATE_SIZE; i++)     assertEquals(data1[i],data2[i]);
    for (int i=0; i < 5; i++)     blob.setBytes(i * BUFFER_SIZE + 1,data);
    assertEquals(BUFFER_SIZE * 5,blob.length());
    blob.setBytes(BUFFER_SIZE + 1,data1);
    blob.setBytes(BUFFER_SIZE * 5 + 1,data1);
    assertEquals(5 * BUFFER_SIZE + UPDATE_SIZE,blob.length());
    pstmt.setInt(1,3);
    pstmt.setBlob(2,blob);
    pstmt.executeUpdate();
    rs=stmt.executeQuery("String_Node_Str" + "String_Node_Str");
    assertEquals(true,rs.next());
    blob=rs.getBlob(1);
    data2=blob.getBytes(BUFFER_SIZE + 1,UPDATE_SIZE);
    assertEquals(5 * BUFFER_SIZE + UPDATE_SIZE,blob.length());
    for (int i=0; i < UPDATE_SIZE; i++)     assertEquals(data1[i],data2[i]);
    data2=blob.getBytes(5 * BUFFER_SIZE + 1,UPDATE_SIZE);
    for (int i=0; i < UPDATE_SIZE; i++)     assertEquals(data1[i],data2[i]);
    blob.truncate(BUFFER_SIZE);
    assertEquals(BUFFER_SIZE,blob.length());
    con.commit();
    stmt.close();
    pstmt.close();
  }
  finally {
    if (con != null) {
      con.commit();
      con.close();
    }
  }
}

Fixed version (ground truth):
/** 
 * tests set bytes method of blob.
 */
public void testSetBytes() throws SQLException {
  Connection con=getConnection();
  try {
    con.setAutoCommit(false);
    PreparedStatement pstmt=con.prepareStatement("String_Node_Str" + "String_Node_Str");
    pstmt.setInt(1,1);
    Blob blob=con.createBlob();
    byte[] data=new byte[BUFFER_SIZE];
    for (int i=0; i < BUFFER_SIZE; i++) {
      data[i]=(byte)(i % 255);
    }
    blob.setBytes(1,data);
    assertEquals(BUFFER_SIZE,blob.length());
    pstmt.setBlob(2,blob);
    pstmt.executeUpdate();
    Statement stmt=con.createStatement();
    ResultSet rs=stmt.executeQuery("String_Node_Str");
    assertEquals(true,rs.next());
    blob=rs.getBlob(1);
    assertEquals(BUFFER_SIZE,blob.length());
    byte[] data1=new byte[UPDATE_SIZE];
    for (int i=0; i < UPDATE_SIZE; i++)     data1[i]=120;
    blob.setBytes(UPDATE_SIZE,data1);
    byte[] data2=blob.getBytes(100,UPDATE_SIZE);
    for (int i=0; i < UPDATE_SIZE; i++)     assertEquals(data1[i],data2[i]);
    blob.setBytes(BUFFER_SIZE + 1,data1);
    assertEquals(BUFFER_SIZE + UPDATE_SIZE,blob.length());
    data2=blob.getBytes(BUFFER_SIZE + 1,UPDATE_SIZE);
    for (int i=0; i < UPDATE_SIZE; i++)     assertEquals(data1[i],data2[i]);
    pstmt.setInt(1,2);
    pstmt.setBlob(2,blob);
    pstmt.executeUpdate();
    rs=stmt.executeQuery("String_Node_Str" + "String_Node_Str");
    assertEquals(true,rs.next());
    blob=rs.getBlob(1);
    assertEquals(BUFFER_SIZE + UPDATE_SIZE,blob.length());
    data2=blob.getBytes(100,UPDATE_SIZE);
    for (int i=0; i < UPDATE_SIZE; i++)     assertEquals(data1[i],data2[i]);
    data2=blob.getBytes(BUFFER_SIZE + 1,UPDATE_SIZE);
    for (int i=0; i < UPDATE_SIZE; i++)     assertEquals(data1[i],data2[i]);
    for (int i=0; i < 5; i++)     blob.setBytes(i * BUFFER_SIZE + 1,data);
    assertEquals(BUFFER_SIZE * 5,blob.length());
    blob.setBytes(BUFFER_SIZE + 1,data1);
    blob.setBytes(BUFFER_SIZE * 5 + 1,data1);
    assertEquals(5 * BUFFER_SIZE + UPDATE_SIZE,blob.length());
    pstmt.setInt(1,3);
    pstmt.setBlob(2,blob);
    pstmt.executeUpdate();
    rs=stmt.executeQuery("String_Node_Str" + "String_Node_Str");
    assertEquals(true,rs.next());
    blob=rs.getBlob(1);
    data2=blob.getBytes(BUFFER_SIZE + 1,UPDATE_SIZE);
    assertEquals(5 * BUFFER_SIZE + UPDATE_SIZE,blob.length());
    for (int i=0; i < UPDATE_SIZE; i++)     assertEquals(data1[i],data2[i]);
    data2=blob.getBytes(5 * BUFFER_SIZE + 1,UPDATE_SIZE);
    for (int i=0; i < UPDATE_SIZE; i++)     assertEquals(data1[i],data2[i]);
    blob.truncate(BUFFER_SIZE);
    assertEquals(BUFFER_SIZE,blob.length());
    blob=con.createBlob();
    data=new byte[100];
    for (int i=0; i < 100; i++) {
      data[i]=(byte)i;
    }
    blob.setBytes(1,data);
    assertEquals(blob.length(),100);
    blob.truncate(50);
    assertEquals(blob.length(),50);
    con.commit();
    stmt.close();
    pstmt.close();
  }
  finally {
    if (con != null) {
      con.commit();
      con.close();
    }
  }
}