[
https://issues.apache.org/jira/browse/DERBY-4122?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12694446#action_12694446
]
Kristian Waagan commented on DERBY-4122:
----------------------------------------
> I'm not sure I understand. The patch solved the ClassCastException by
> checking stream instanceof ReaderToUTF8Stream. Where does the
> FormatIdInputStream come into the picture?
The instanceof ReaderToUTF8Stream happens in SQLClob.readExternal.
>From SQLChar.getString():
"""
} else if (stream != null) {
// data stored as a stream
try {
if (stream instanceof FormatIdInputStream) {
readExternal((FormatIdInputStream) stream);
} else {
readExternal(new FormatIdInputStream(stream));
}
stream = null;
// at this point the value is only in the char[]
// so call again to convert to a String
return getString();
} catch (IOException ioe) {
"""
In the code above, the variable 'stream' will be a FormatIdInputStream if it
comes from store, and ReaderToUTF8Stream if the value hasn't been
inserted into the store (i.e. we're working on this value from within a trigger,
or a VALUES clause).
At this point, doing the more general check 'stream instanceof Resetable' is
valid.
And again, the reason why this was discovered during (soft) upgrade testing, is
that
in a fresh 10.5 database you won't have to reset / rewind the stream.
> ClassCastException in SQLClob when running in soft upgrade mode (10.4.2.0 ->
> 10.5.1.0)
> --------------------------------------------------------------------------------------
>
> Key: DERBY-4122
> URL: https://issues.apache.org/jira/browse/DERBY-4122
> Project: Derby
> Issue Type: Bug
> Components: Regression Test Failure
> Affects Versions: 10.5.1.0
> Environment: Windows Vista 64, Sun JDK 1.6.0_10, Junit 3.8.2
> Reporter: Suran Jayathilaka
> Assignee: Kristian Waagan
> Priority: Blocker
> Attachments: derby-4122-1a-incorrect_stream_positioning.diff,
> derby-4122-2a-bc4btest.diff, derby-4122-3a-classcast_fix.diff,
> derby-4122-3b-classcast_fix.diff
>
>
> This bug was found when doing soft upgrade testing from Derby version
> 10.4.2.0 to 10.5.1.0 (RC1)
> Steps followed are as follows.
> 1. Run setEmbeddedCP.bat from version 10.4.2.0's bin folder
> 2. In a test folder run ij
> 3. create system/wombat database.
> ij> connect 'jdbc:derby:system/wombat;create=true';
> 4. exit ij
> 5. Copy the 10.5.1.0 derby jars (from lib folder) and the derbyTesting.jar
> from 10.4.2.0 to the test folder and set classpath with them (including junit
> and ORO)
> 6. Run suites.All
> java -Xmx512M -Xms512M -Dderby.tests.trace=true junit.textui.TestRunner
> org.apache.derbyTesting.functionTests.suites.All
> Result:
> Tests run: 10479, Failures: 56, Errors: 34
> The exception stack trace from a failed test follows.
> -------------------------------------------------------------------------------------------------------------
> 3)
> testClobInTriggerTable(org.apache.derbyTesting.functionTests.tests.lang.TriggerTest)java.sql.SQLException:
> Java exception: 'org.apache.derby.iapi.types.ReaderToUTF8Stream cannot be
> cast to org.apache.derby.iapi.types.Resetable: java.lang.ClassCastException'.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown
> Source)
> at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
> at org.apache.derby.impl.jdbc.Util.javaException(Unknown Source)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown
> Source)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown
> Source)
> at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown
> Source)
> at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown
> Source)
> at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown
> Source)
> at
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.executeStatement(Unknown
> Source)
> at org.apache.derby.impl.jdbc.EmbedPreparedStatement.execute(Unknown
> Source)
> at
> org.apache.derbyTesting.functionTests.tests.lang.TriggerTest.testClobInTriggerTable(TriggerTest.java:529)
> at
> org.apache.derbyTesting.functionTests.tests.lang.TriggerTest.testClobInTriggerTable(TriggerTest.java:451)
> 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:102)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
> at junit.extensions.TestSetup.run(TestSetup.java:25)
> at
> org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
> Caused by: java.sql.SQLException: Java exception:
> 'org.apache.derby.iapi.types.ReaderToUTF8Stream cannot be cast to
> org.apache.derby.iapi.types.Resetable: java.lang.ClassCastException'.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown
> Source)
> ... 39 more
> Caused by: java.lang.ClassCastException:
> org.apache.derby.iapi.types.ReaderToUTF8Stream cannot be cast to
> org.apache.derby.iapi.types.Resetable
> at org.apache.derby.iapi.types.SQLClob.rewindStream(Unknown Source)
> at org.apache.derby.iapi.types.SQLClob.readExternal(Unknown Source)
> at org.apache.derby.iapi.types.SQLChar.getString(Unknown Source)
> at org.apache.derby.iapi.types.SQLChar.loadStream(Unknown Source)
> at
> org.apache.derby.impl.sql.execute.UpdateResultSet.objectifyStream(Unknown
> Source)
> at
> org.apache.derby.impl.sql.execute.UpdateResultSet.collectAffectedRows(Unknown
> Source)
> at org.apache.derby.impl.sql.execute.UpdateResultSet.open(Unknown
> Source)
> at
> org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown Source)
> at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown
> Source)
> ... 32 more
> ------------------------------------------------------------------------------------------------------------------
> When looking at the SVN revisions for SQLClob with Kathey Marsden, we found
> the following statement in revision # 738408, related to DERBY-3907, which
> might be related to this issue.
> "NOTE: Databases created with this revision (or later) containing Clobs,
> cannot be accessed by earlier trunk revisions."
> Patch file: derby-3907-7a3-use_new_header_format.diff
>
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.