db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Kristian Waagan (JIRA)" <j...@apache.org>
Subject [jira] Commented: (DERBY-1599) Clob.getSubString() throws NullPointerException when created by updatable result set
Date Tue, 30 Oct 2007 09:33:50 GMT

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

Kristian Waagan commented on DERBY-1599:
----------------------------------------

This looks like a programming error somewhere in the JDBC layer. A stream of an unexpected
type is seen in EmbedClob init, which indicates an odd path through the system. My comments
are regarding the embedded driver.

I think there are numerous scenarios to consider here. As far as I can tell, the stream data
will be materialized if you call for instance rs.getString(). Fair enough, if you ask for
lots of data in memory, Derby just have to do as told. However, the following scenario fails
and looks very much like a bug:
 a) Call rs.updateCharacterStream() with a stream.
 b) Call rs.getCharacterStream() and drain the stream.
 c) Call rs.updateRow().

Step c will fail (only excerpt below):
Caused by: java.io.EOFException: Stream has already been read and end-of-file reached and
cannot be re-used.
        at org.apache.derby.iapi.types.ReaderToUTF8Stream.read(ReaderToUTF8Stream.java:151)
        at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:320)
        at org.apache.derby.iapi.types.SQLChar.readExternal(SQLChar.java:649)
        at org.apache.derby.iapi.types.SQLChar.getString(SQLChar.java:363)
        at org.apache.derby.iapi.types.SQLChar.setFrom(SQLChar.java:1229)
        at org.apache.derby.iapi.types.DataType.setValue(DataType.java:490)
        at org.apache.derby.impl.jdbc.EmbedResultSet.updateRow(EmbedResultSet.java:3714)

The problem here seems to be that Derby just passes the source stream directly out to the
user.
If we want this scenario to work, we must somehow store the data temporarily. Since we don't
know the size, we must also be prepared to store it on disk. I believe we already have a solution
for this, where it is kept in memory until it reaches a threshold and then it is written to
disk. I have not checked if the code can be used as-is, or if it must be customized.

The case with EmbedClob.init() is basically the same, but is has an assert that triggers.

Has anyone consulted the JDBC spec on this issue?
What is the defined behavior, if any?

> Clob.getSubString() throws NullPointerException when created by updatable result set
> ------------------------------------------------------------------------------------
>
>                 Key: DERBY-1599
>                 URL: https://issues.apache.org/jira/browse/DERBY-1599
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC, Network Client
>    Affects Versions: 10.1.3.1, 10.2.1.6
>            Reporter: Knut Anders Hatlen
>            Priority: Minor
>         Attachments: Repro.java
>
>
> If you create a clob value with one of the ResultSet.updateXXX methods that take a stream
or a reader, and retrieve that value with ResultSet.getClob(), a NullPointerException will
be thrown when getSubString() is called on the returned Clob object. This happens with the
network client driver, and it has been observed on Derby 10.1.3.1 and trunk.
> Exception in thread "main" java.lang.NullPointerException
>         at org.apache.derby.client.am.Clob.getSubStringX(Clob.java:229)
>         at org.apache.derby.client.am.Clob.getSubString(Clob.java:210)
>         at Repro.main(Repro.java:24)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message