[
https://issues.apache.org/jira/browse/DERBY-5090?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13007419#comment-13007419
]
Knut Anders Hatlen commented on DERBY-5090:
-------------------------------------------
I suppose the stream returned by the embedded driver also will throw an
exception on read() for the bigger Blob once all the bytes from the first page
have been read, but I haven't checked that. We should at least verify that it
throws an exception and doesn't return -1 in that case.
> Retrieving BLOB fields sometimes fails
> --------------------------------------
>
> Key: DERBY-5090
> URL: https://issues.apache.org/jira/browse/DERBY-5090
> Project: Derby
> Issue Type: Bug
> Components: JDBC
> Affects Versions: 10.7.1.1
> Environment: JDBC derby embedded driver
> Reporter: Unai Vivi
> Labels: BLOB, Ordering, exception, null, order, read
> Attachments: Derby5090.java, Derby5090_2.java
>
>
> This is my first issue report, so please be understanding if I'm posting the
> wrong thing, in the wrong place or in the wrong way. I just want to help. :)
> While iterating through a ResultSet, when accessing a BLOB field to read its
> contents via an InputStream, I noticed that:
> - if the current ResultSet's has been "warmed up" by retrieving another
> column first, everything it's fine;
> - if, on the other hand, you first-thing access the BLOB (and read other
> columns later), then upon reading the first byte out the InputStream bound to
> the BLOB field (ResultSet.getBinaryStream("col_name")) an IOException is
> thrown (and IOException's getMessage() method returns null).
> Following is an example, taken from a real application. The two code segments
> only differ in the fact that a SMALLINT & VARCHAR read is done before/after
> the BLOB read.
> --Working snippet--
> [...]
> icRelPath[i] = "imm" + File.separator + "ic" + "_" +
> rs.getShort("setIcone") + "_" + i + "." + rs.getString("estensione");
> AutoCloseInputStream acis = new
> AutoCloseInputStream(rs.getBinaryStream("ic" + i));
> if (rs.wasNull())
> icRelPath[i] = null;
> else
> {
> //icRelPath[i] = "imm" + File.separator + "ic" + "_"
> + rs.getShort("setIcone") + "_" + i + "." + rs.getString("estensione");
> BufferedInputStream bis = new
> BufferedInputStream(acis);
> int b = bis.read();//READS FINE
> [...]
> --Broken snippet--
> [...]
> //icRelPath[i] = "imm" + File.separator + "ic" + "_" +
> rs.getShort("setIcone") + "_" + i + "." + rs.getString("estensione");
> AutoCloseInputStream acis = new
> AutoCloseInputStream(rs.getBinaryStream("ic" + i));
> if (rs.wasNull())
> icRelPath[i] = null;
> else
> {
> icRelPath[i] = "imm" + File.separator + "ic" + "_" +
> rs.getShort("setIcone") + "_" + i + "." + rs.getString("estensione");
> BufferedInputStream bis = new
> BufferedInputStream(acis);
> int b = bis.read();//THROWS IOException WITH A null
> ERROR MESSAGE STRING
> [...]
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira