[ 
https://issues.apache.org/jira/browse/DERBY-5236?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Knut Anders Hatlen updated DERBY-5236:
--------------------------------------

    Attachment: d5236-3a-warning.diff

I don't see a quick solution to get the entire string sent to the client, so 
I'm adding a patch that adds a java.sql.DataTruncation warning to the result 
instead for now.

The server adds warnings before the row data. However, we don't know until 
after we've tried writing the data whether we had to truncate any values. 
Because of this, I've changed the server code to save the position of the 
SQLCAGRP section in which the warnings are written, and if it detects that data 
was truncated, it goes back and overwrites it with the data truncation warnings 
later.

On the client side, some changes were needed for it to correctly deserialize a 
java.sql.DataTruncation object. It wouldn't break without these changes, but it 
would create an ordinary SQLWarning instead of DataTruncation. The 
DataTruncation object has fields so that the caller can find out exactly which 
column was truncated, and by how much.

Unfortunately, the server isn't capable of sending chained warnings yet, so in 
the case of multiple columns being truncated, we only get a warning for the 
first one. But that's another bug...

The patch also makes the test verify that the proper DataTruncation warnings 
are received, and a test case that verifies that it also works as expected with 
output parameters in stored procedures has been added.

All the regression tests ran cleanly with the patch.

> Client driver silently truncates strings that exceed 32KB
> ---------------------------------------------------------
>
>                 Key: DERBY-5236
>                 URL: https://issues.apache.org/jira/browse/DERBY-5236
>             Project: Derby
>          Issue Type: Bug
>          Components: Network Client
>    Affects Versions: 10.8.1.2
>            Reporter: Knut Anders Hatlen
>            Assignee: Knut Anders Hatlen
>         Attachments: d5236-1a-client-fetch-complete.diff, 
> d5236-2a-longer-strings.diff, d5236-3a-warning.diff, repro.diff, 
> write-full-string.diff
>
>
> Can be seen with this JUnit test case that retrieves a VARCHAR value with 
> 20000 characters. With the client driver, the string is truncated to 10900 
> characters (32700 bytes when encoded in UTF-8).
>     public void testLongColumn() throws SQLException {
>         PreparedStatement ps = prepareStatement(
>                 "values cast(? as varchar(20000))");
>         char[] chars = new char[20000];
>         Arrays.fill(chars, '\u4e10');
>         String str = new String(chars);
>         ps.setString(1, str);
>         JDBC.assertSingleValueResultSet(ps.executeQuery(), str);
>     }

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to