db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kristian Waagan (JIRA)" <j...@apache.org>
Subject [jira] Commented: (DERBY-3646) Embedded returns wrong results when selecting a blob column twice and using getBinaryStream()
Date Mon, 28 Apr 2008 12:04:55 GMT

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


Mime
View raw message