[
https://issues.apache.org/jira/browse/DERBY-3646?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12592793#action_12592793
]
Kristian Waagan commented on DERBY-3646:
----------------------------------------
After a little investigation, I found out it is easy enough to make the
embedded driver behave as the client driver.
I'm not sure what is the best exact implementation of the fix, which is
currently a three line hack.
Before working further with that, I'd like to see the community agree on what
kind of behavior we want to allow.
>From what I have gathered, the spec doesn't really give anything concrete, but
>talks about what is recommended for maximum portability.
Also, my first assessment is that it should be possible to allow almost
anything, but that this can have significant performance implications (might
include overhead for the simplest use cases as well).
For reference, I'm listing some options, all with regard to the statement
"SELECT blobclolumn as b1, blobcolumn as b2 from blobtable".
The code examples are pseudo-JDBC/Java.
a) Disallow selecting the same [Blob] column twice.
Statement must be disallowed.
b) Allow getting and processing a single stream in the order of the columns.
streamB1 = rs.getBinaryStream(b1)
processStream(streamB1)
streamB2 = rs.getBinaryStream(b2) // streamB1 is automatically closed here
processStream(streamB2)
c) Allow getting and processing a single stream in any column order.
streamB2 = rs.getBinaryStream(b2)
processStream(streamB2)
streamB1 = rs.getBinaryStream(b1) // streamB2 is automatically closed here
processStream(streamB1)
d) Allow getting and processing multiple streams in any order, but only once
per column.
streamB2 = rs.getBinaryStream(b2)
streamB1 = rs.getBinaryStream(b1) // streamB2 is kept open
processStream(streamB2)
processStream(streamB1)
e) Allow getting and processing mulitple streams in any order, multiple times
per column.
streamB2 = rs.getBinaryStream(b2)
streamB1 = rs.getBinaryStream(b1) // streamB2 is kept open
processStream(streamB2)
streamB2seond = rs.getBinaryStream(b2) // other streams are kept open
processStream(streamB1)
processStream(streamB2second)
For options d and e, I expect the state of each stream (position, open/closed)
to be independent of each other. Also, a stream returned from getBinaryStream
should be positioned at the beginning of the data.
There are plenty of things I haven't considered, so please comment on this!
> Embedded returns wrong results when selecting a blob column twice and using
> getBinaryStream()
> ---------------------------------------------------------------------------------------------
>
> Key: DERBY-3646
> URL: https://issues.apache.org/jira/browse/DERBY-3646
> Project: Derby
> Issue Type: Bug
> Components: JDBC
> Affects Versions: 10.1.3.1, 10.2.2.0, 10.3.2.2, 10.4.1.3, 10.5.0.0
> Reporter: Kathey Marsden
> Attachments: DoubleSelect.java
>
>
> The attached program DoubleSelect selects a blob column twice and tries to
> access the blob column with getBinaryStream.
> With embedded the output is:
> 4 5 6 7 8 9 10 11 12 13
> 14 15 16 17 18 19 20 21 22 23
> I am done
> Two things seem to be happening with embedded.
> 1) Both getBinaryStream() calls are returning the same stream.
> 2) The second getBinaryStream() call throws away 4 bytes.
> With client the output is:
> Exception in thread "main" java.io.IOException: The object is already
> closed.
> at
> org.apache.derby.client.am.CloseFilterInputStream.read(CloseFilterInputStream.java:50)
> at DoubleSelect.printNextTen(DoubleSelect.java:53)
> at DoubleSelect.main(DoubleSelect.java:43)
> 0 1 2 3 4 5 6 7 8 9
> So with client it looks like the second getBinaryStream() call closes
> the first stream but then returns the right result for the second stream.
> Perhaps embedded should behave the same as client or perhaps the query should
> just work. Regardless embedded should not return wrong results.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.