[ 
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.

Reply via email to