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

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

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: 10.2.1.6, 10.2.2.0, 10.3.1.4
>         Environment: Windows XP SP2
>            Reporter: Mikael Aronsson
>            Assignee: Kathey Marsden
>         Attachments: derby-3085_diff.txt, derby-3085_stat.txt, TestBlob.java, 
> trace.out.norows, trace.out.withrow
>
>
> 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] 10.3.1.4 - (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 bytes!!!
>     }
> 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.

Reply via email to