[ http://issues.apache.org/jira/browse/DERBY-1368?page=comments#action_12414446 ]
Daniel John Debrunner commented on DERBY-1368: ---------------------------------------------- I think this is fixed for most cases in the 10.2/trunk line. For any newly inserted value it will be. In some cases with an value from an upgraded database it will not be, though your test program will not show that case. In most cases now the length is stored with the value, if not the first call to length() on the Blob will save the determined value. > EOFException when reading from blob's binary stream > --------------------------------------------------- > > Key: DERBY-1368 > URL: http://issues.apache.org/jira/browse/DERBY-1368 > Project: Derby > Type: Bug > Versions: 10.1.2.1 > Reporter: Tobias Bocanegra > > reading the 'length()' of a blob reads a previously aquired binary stream. > test case: > public static void main(String[] argv) throws Exception { > String driver = "org.apache.derby.jdbc.EmbeddedDriver"; > String url = "jdbc:derby:derby/test;create=true"; > Class.forName(driver); > Connection con = DriverManager.getConnection(url, "sa", ""); > con.setAutoCommit(true); > // create table > System.out.println("1) creating table..."); > Statement stmt = con.createStatement(); > stmt.execute("create table T1 (ID char(32) PRIMARY KEY, DATA blob(2G) > not null)"); > stmt.close(); > // add row > System.out.println("2) adding row..."); > byte[] data = new byte[1024*1024*1]; > data[0] = 1; > data[1] = 2; > PreparedStatement s = con.prepareStatement("insert into T1 (ID, DATA) > values (?, ?)"); > s.setString(1, "id"); > s.setBytes(2, data); > s.execute(); > s.close(); > // read row > System.out.println("3) reading row..."); > s = con.prepareStatement("select DATA from T1 where ID = ?"); > s.setString(1, "id"); > s.execute(); > ResultSet rs = s.getResultSet(); > rs.next(); > Blob b = rs.getBlob(1); > // test output > System.out.println("4) Length: " + b.length()); > InputStream in = b.getBinaryStream(); > System.out.println(" First Byte: " + in.read()); > in.close(); > in = b.getBinaryStream(); > System.out.println("5) Length: " + b.length()); > System.out.println(" First Byte: " + in.read()); > in.close(); > rs.close(); > s.close(); > con.close(); > } > gives: > 1) creating table... > 2) adding row... > 3) reading row... > 4) Length: 1048576 > First Byte: 1 > 5) Length: 1048576 > First Byte: -1 > imo, 5) is wrong. -- 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
