[ 
https://issues.apache.org/jira/browse/DERBY-4122?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12694908#action_12694908
 ] 

Knut Anders Hatlen commented on DERBY-4122:
-------------------------------------------

I agree that it sounds better to remove the bytesPeekedAt code since we are 
able to control which streams are passed in and can make sure that they 
implement one of the reset interfaces.

I haven't reviewed the full patch yet, only the ReaderToUTF8Stream part. Here 
are my comments:

- Since the buffer is not of constant size, I think we should remove the 
BUFSIZE constant so that no one incorrectly uses it instead of buffer.length. 
In fact, I think the available() method will return the wrong result now 
because it uses BUFSIZE.

- Do we need to separate between MARK_UNSET and EXCEEDED_MARK_LIMIT? Seems like 
we can get away with using MARK_UNSET in both cases and get slightly simpler 
code, and one less error message to internationalize (the message for the new 
IOException should be internationalized, shouldn't it?)

- I think I would have removed the shrink logic in fillBuffer(). It's probably 
going to end up as code that's never called, so I don't think the benefit 
(potentially release memory earlier if mark() is called with a really large 
argument) justifies the extra code.

- Should there be a comment and/or constant for the magic number 6 in 
fillBuffer()? I see that there is a comment in the existing code, but it is 
further down, so I scratched my head for a while trying to understand it before 
I got to that comment.

- One potential optimization (not needed in the first increment, but it's so 
simple that it's probably worth adding it later): When we allocate a new 
buffer, we could check if buffer.length <= (readAheadLimit + 6), and if it is, 
we can just reuse the old buffer. If oldBuf and buffer point to the same array, 
the call to arraycopy() will just shift the bytes to the left and free space at 
the right side of the array.

> 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, derby-4122-4a-classcast_fix_mark_reset.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.

Reply via email to