db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "A B (JIRA)" <j...@apache.org>
Subject [jira] Commented: (DERBY-3085) Fails to handle BLOB fields with a PreparedStatement with size >32750 bytes
Date Fri, 28 Sep 2007 18:47:50 GMT

    [ https://issues.apache.org/jira/browse/DERBY-3085?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12531116

A B commented on DERBY-3085:

Hi Kathey,

I don't have much experience in this area of code, but from what I could tell the patch looks
good.  The changes are nicely contained and easy to understand, and I verified that the new
regression test case fails without the patch and passes with it.

So +1 from me, inexperienced with LOBs though I am...

I did have the following minor comments/suggestions, but none of these is worth blocking the
commit of your changes:

1 - Your comment above says "There is only one parameter ever streamed", and a similar comment
in the patch says "Only the last parameter with an EXTDTA will be streamed."  It might be
nice to have more of a "why" in the code comment, or else a reference to another place that
explains this more. As a reader of the patch, that was the first thing I found myself wondering,
and I was not able to find an explanation in the (very) brief scanning that I did.

2 - It looks like we drain the buffer 1000 bytes at a time; is that just a randomly chosen
number? I'm guessing it is but just thought I'd ask.  If the number itself is not significant,
a quick comment saying as much might make it easier for people to change it in the future
if needed (for whatever reason).

3 - Is it possible to add a test case where we have multiple stream parameters, just to make
sure that things still work in that case, too? Ex. add a second lob column to "testing" table
and then a second parameter to the UPDATE statement?

3 - It looks like the regression test added for this issue only tests the case of a "testing"
table with no rows.  Would it be worth it (as a sanity check) to also test the situation where
there are rows in the table but the UPDATE predicate does not match any of the rows?  I assume
that such an UPDATE will behave the same as when there are no rows, but it may be useful to

4 - Looks like there may be some slight spacing inconsistencies within the changed code for

As I said, all of these comments are minor.  The patch looks good overall.  Thank you for
picking this issue up and for resolving it so quickly!

> Fails to handle BLOB fields with a PreparedStatement with size >32750 bytes
> ---------------------------------------------------------------------------
>                 Key: DERBY-3085
>                 URL: https://issues.apache.org/jira/browse/DERBY-3085
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC, Network Client
>    Affects Versions:,,
>         Environment: Windows XP SP2
>            Reporter: Mikael Aronsson
>            Assignee: Kathey Marsden
>         Attachments: derby-3085_diff.txt, derby-3085_stat.txt, TestBlob.java, trace.out.norows,
> Java Version:    1.6.0_02
> Java Vendor:     Sun Microsystems Inc.
> Java home:       C:\Program Files\Java\jre1.6.0_02
> Java classpath:  derbytools.jar
> OS name:         Windows XP
> OS architecture: x86
> OS version:      5.1
> Java user name:  Ma
> Java user home:  C:\Documents and Settings\ma
> Java user dir:   c:\tools\derby\lib
> java.specification.name: Java Platform API Specification
> java.specification.version: 1.6
> --------- Derby Information --------
> JRE - JDBC: Java SE 6 - JDBC 4.0
> [C:\tools\derby\lib\derbytools.jar] - (561794)
> The following code fails:
>     // Data is a byte[] vector
>     ByteArrayInputStream is = new ByteArrayInputStream( data);    
>     String sql = "UPDATE MyTable SET FContents=? WHERE FName='" + name + "'";
>     PreparedStatement ps = conn.prepareStatement( sql);
>     ps.setBinaryStream( 1, is, data.length);
>     if( ps.executeUpdate() == 0)
>     {
>         // it throws an exception here if the data array us larger then around 32750
>     }
> It look's like when the size of the data[] vector is > 32750 bytes or so it throws
an exception like this:
> java.sql.SQLException: A network protocol error was encountered and the connection has
been terminated: A PROTOCOL Data Stream Syntax Error was detected.  Reason: 0x0. Plaintext
connection attempt to an SSL enabled server?
>         at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source)
>         at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source)
>         at org.apache.derby.client.am.PreparedStatement.executeUpdate(Unknown Source)
> The table is defined as:
>     CREATE TABLE MyTable (FName varchar(300) NOT NULL,FContents BLOB(16M) NOT NULL)
> It does loook like this only happens with the NetWork client driver, the embedded driver
works fine.

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

View raw message