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

Kathey Marsden commented on DERBY-3085:
---------------------------------------

Well, I guess the question now is whether the remaining data in the input 
stream should be read by embedded or by Network Server.  The javadoc for 
setBinaryStream says:

Sets the designated parameter to the given input stream, which will have the 
specified number of bytes. When a very large binary value is input to a 
LONGVARBINARY  parameter, it may be more practical to send it via a 
java.io.InputStream object. The data will be read from the stream as needed 
until end-of-file is reached.


So I think that it makes it clear that embedded is only obligated to read the 
stream "as needed", so I think I will pursue a solution where the Network 
Server tracks the parameter input streams and drains them after execution if 
they have not been drained by the execution of the statement.  Does that sound 
like the right approach?



> 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
>         Attachments: 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