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

Rick Hillegas commented on DERBY-6888:
--------------------------------------

A workaround would be to write a server-side function which serializes he UDT 
into a long VARBINARY and then deserialize it in the client-side application 
after calling PreparedStatement.getBytes(). So your query would look something 
like this:

select toVarbinary(myUDT) from ...


> Large User-Defined Types break Network Client
> ---------------------------------------------
>
>                 Key: DERBY-6888
>                 URL: https://issues.apache.org/jira/browse/DERBY-6888
>             Project: Derby
>          Issue Type: Bug
>    Affects Versions: 10.11.1.1, 10.12.1.1
>            Reporter: Steven Schaefer
>         Attachments: udt_network_repro.zip
>
>
> In the project I work on at Nexidia we have been working with a derby in 
> probably an unusual way where we make use of both the embedded and network 
> clients.
> We also make some use of user-defined types and have run into some 
> inconsistencies between those clients.
> Occasionally some of our user-defined types are above 32k. This is ok for the 
> embedded client; it seems to read and write those without issue. However, the 
> network client has some serious trouble.
> 1) Writes: The network client doesn't allow writing UDTs above 32k. I get 
> this helpful error message (more on this at the end...) 
> "java.sql.SQLDataException: The resulting value is outside the range for the 
> data type 32767." Stack trace ends up pointing to 
> org.apache.derby.client.net.Request.writeUDT, and its code shows a hardcoded 
> check.
> 2) Reads: Since our (multi-server) system runs with both clients for 
> different needs, our embedded client helpfully inserts UDTs greater than 32k. 
> The network client doesn't appreciate this much. Reading one of these large 
> UDTs results in the following: "java.sql.SQLNonTransientConnectionException: 
> Insufficient data while reading from the network - expected a minimum of 6 
> bytes and received only 0 bytes.  The connection has been terminated".
> Even better, the next time we try to create a new connection, it fails with 
> "java.sql.SQLNonTransientConnectionException: A network protocol error was 
> encountered and the connection has been terminated: A protocol error (Data 
> Stream Syntax Error) was detected.  Reason: 0x19. Perhaps this is an attempt 
> to open a plaintext connection to an SSL enabled server."
> 3) With debug jars, #1's error message format fails an assertion check: 
> {quote}
> org.apache.derby.shared.common.sanity.AssertFailure: ASSERT FAILED Number of 
> parameters expected for message id 22003 (1) does not match number of 
> arguments received (2)
>       at 
> org.apache.derby.shared.common.sanity.SanityManager.ASSERT(SanityManager.java:120)
>       at 
> org.apache.derby.shared.common.i18n.MessageUtil.formatMessage(MessageUtil.java:209)
>       at 
> org.apache.derby.shared.common.i18n.MessageUtil.getCompleteMessage(MessageUtil.java:118)
>       at 
> org.apache.derby.shared.common.i18n.MessageUtil.getCompleteMessage(MessageUtil.java:158)
>       at 
> org.apache.derby.shared.common.i18n.MessageUtil.getCompleteMessage(MessageUtil.java:74)
>       at org.apache.derby.client.am.SqlException.<init>(SqlException.java:169)
>       at org.apache.derby.client.am.SqlException.<init>(SqlException.java:203)
>       at org.apache.derby.client.net.Request.writeUDT(Request.java:1418)
> {quote}    
>     
> h5. Expected
> I expect some consistency here between the two clients. Either both accept 
> UDTs greater than 32k, or both reject them. Further, if a limit of 32k is 
> still intended, it'd be great of documentation was a bit loud about that 
> limitation. DERBY-4491 comments indicate some sort of "large UDT" may be 
> appropriate, but it's not immediately clear to me if that's still needed. And 
> of course I expect subsequent connections to succeed! I'm also a little 
> surprised large blobs seem to work ok in this scenario, but I'm hoping that's 
> an indication UDTs shouldn't be limited to 32k too.
> We've been able to refactor out the network client to workaround the issue, 
> but it's not yet clear if this is an ideal long-term solution for us.
> h5. Reproducing:
> I have attached several sample programs:
> * *EmbeddedTest*: Inserts & Selects a blob and UDT that's 50k. I expect this 
> program to run without issue.
> * *NetworkWriteTest*: Attempts to insert a blob and UDT that's 50k. This will 
> demonstrate blobs are ok here, but #1 for UDTs (or #3 with debug jars).
> * *NetworkLargeUDTReadTest*: This demonstrates #2. It will attempt to read 
> the large UDT written by EmbeddedTest. Finally, it will then try to create a 
> new connection demonstrating the 0x19 error.
> h5. To run:
> * unzip, then cd udt_network_repo
> * gradlew build
> * java -cp "build\libs\*" com.nexidia.udtrepro.EmbeddedTest \[preferred derby 
> home\]
> * java -cp "build\libs\*" com.nexidia.udtrepro.NetworkWriteTest \[preferred 
> derby home\]
> * java -cp "build\libs\*" com.nexidia.udtrepro.NetworkLargeUDTReadTest 
> \[preferred derby home\]
> Note: EmbeddedTest should be run before NetworkLargeUDTReadTest
> I have reproed all with 10.12 as well. All tests run in Windows 7 w/ Java 8 
> u77.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to