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

Kristian Waagan updated DERBY-2618:
-----------------------------------

    Attachment: Derby2618BugsInClobAsciiStream.java

Seems there are more than one kind of bug in this area.
>From the users perspective, you can write any int to the clob ascii stream, 
>since it is a OutputStream and has the method write(int).

I see errors happening in two places; some when calling write, some when 
calling read when reading the value back.
Would be nice if anyone could try the repro and confirm my findings, or let me 
know if I have been using the JDBC API incorrectly. Note that the repro must be 
run with Java SE 6 because it uses Connection.createClob().


I have not looked at this in detail, but I think the stream used to write to 
the Clob must do some filtering on the value. 
This is typically ANDing with 0xff and/or replacing the incoming int with the 
Unicode marker for unknown character (\uFFFD).

Then the question is, which values are considered "non-ASCII"?
According to JDBC, an ASCII value is between 0 and 255, inclusive. Represented 
as byte, you will get negative values for a part of this range. I assume 
ISO-8859-1 is the encoding standard to be used, and further that these values 
will be mapped directly into Unicode.

Say the Tamil letter with Unicode value '\u0B88' is written to the stream 
returned by Clob.setAsciiStream(1) with OutputStream.write(int). Should we do 
"if i > 255 write '\uFFFD'", or should we ignore the higher bits and say this 
is value 136 (this is mentioned in the comment for ClobAsciiStream), which 
happens to be an unused code in ISO-8859-1?

When/if the unknown character code is stored internally (\uFFFD), it must be 
converted to '?' if it is read back using getAsciiStream (returns an 
InputStream).

The default behavior for OutputStream.write(int), is to cast the int to char 
and then call the abstract method write(char[],int,int).

No matter what the answers to the questions above are, Derby should not fail 
with a UTFDataFormatException when reading data you have already been allowed 
to insert.

I'm on thin ice for how to correctly handle these issues, and I'm sure there 
are more, so please correct me and add additional information.

> EmbedClob.setAsciiStream does not handle non-ascii characters correctly
> -----------------------------------------------------------------------
>
>                 Key: DERBY-2618
>                 URL: https://issues.apache.org/jira/browse/DERBY-2618
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.3.0.0
>            Reporter: Kristian Waagan
>         Assigned To: Kristian Waagan
>         Attachments: Derby2618BugsInClobAsciiStream.java
>
>
> If non-ascii characters are written to the Writer returned by 
> EmbedClob.setAsciiStream, Derby fails with a 'java.io.UTFDataFormatException' 
> when the CLOB value is read back.
> I'm filing this bug with 'Major' priority, as the bug does not manifest 
> itself when entering data, just when you try to get it back. Except from 
> filtering the data yourself before entering it, I don't think there is any 
> workaround.
> Sample stack trace from a modified test:
> 1) 
> testClobAsciiWrite1ParamKRISTIWAA(org.apache.derbyTesting.functionTests.tests.jdbcapi.LobStreamsTest)java.sql.SQLException:
>  Unable to set stream: 'java.io.UTFDataFormatException'.
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:95)
>         at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:88)
>         at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:94)
>         at org.apache.derby.impl.jdbc.Util.setStreamFailure(Util.java:246)
>         at org.apache.derby.impl.jdbc.EmbedClob.length(EmbedClob.java:190)
>         at 
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.setClob(EmbedPreparedStatement.java:1441)
>         at 
> org.apache.derbyTesting.functionTests.tests.jdbcapi.LobStreamsTest.testClobAsciiWrite1ParamKRISTIWAA(LobStreamsTest.java:255)
>         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>         at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>         at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>         at 
> org.apache.derbyTesting.junit.BaseTestCase.runBare(BaseTestCase.java:88)
> Caused by: java.sql.SQLException: Unable to set stream: 
> 'java.io.UTFDataFormatException'.
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:45)
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(SQLExceptionFactory40.java:135)
>         at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:70)
>         ... 22 more

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