[
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