[
https://issues.apache.org/jira/browse/DERBY-2201?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Rick Hillegas updated DERBY-2201:
---------------------------------
Attachment: derby-2201-aa-01-crudeDog.diff
Attaching derby-2201-aa-01-crudeDog.diff. This patch allows functions to return
Blob and Clob values. This is incremental improvement and may be adequate for
small values. The implementation will be slow for large LOBs, however. That is
because the contents of the LOBs are materialized into memory. For large LOBs
we may consider building stream support.
The bug arises because two bits of the code path for LOBs were not implemented:
1) DataValueFactory was missing overloads for the methods which re-use existing
LOB holders as you advance through the rows of a ResultSet. This is the stack
trace recorded above. Addressed in this patch by implementing the missing
overloads, crudely materializing LOBs into memory.
2) Once (1) was patched, a new problem arose because the refined getObject()
methods for the LOB data values were not implemented. This was addressed by
making SQLBlob and SQLClob be implementations of java.sql.Blob and
java.sql.Clob respectively and by making the objects return themselves when
getObject() is called.
Touches the following files:
M java/engine/org/apache/derby/iapi/types/DataValueFactoryImpl.java
M java/engine/org/apache/derby/iapi/types/DataValueFactory.java
Addresses (1).
M java/engine/org/apache/derby/iapi/types/DataType.java
M java/engine/org/apache/derby/iapi/types/SQLBlob.java
M java/engine/org/apache/derby/iapi/types/SQLClob.java
Addresses (2).
M
java/testing/org/apache/derbyTesting/functionTests/tests/lang/AnsiSignaturesTest.java
Uncommented the tests for functions which return LOBs.
> Calling functions that return Blob/Clob does not work.
> ------------------------------------------------------
>
> Key: DERBY-2201
> URL: https://issues.apache.org/jira/browse/DERBY-2201
> Project: Derby
> Issue Type: Bug
> Components: SQL
> Affects Versions: 10.3.1.4
> Environment: Derby, head of trunk. Sun JVM 5. Solaris 10 (x86).
> Reporter: Øystein Grøvlen
> Priority: Minor
> Attachments: ClobFunction.java, derby-2201-aa-01-crudeDog.diff,
> getClobDataValue.diff
>
>
> Calling functions that return Blob/Clob results in NoSuchMethodException (See
> stackTrace below). It fails because DataValueFactory.getClobDataValue(Clob,
> StringDataValue) does not exist. However, getClobDataValue(String,
> StringDataValue) exists. I will attach program to repro this.
> java.lang.NoSuchMethodException:
> org.apache.derby.iapi.types.DataValueFactory.getClobDataValue(java.sql.Clob,
> org.apache.derby.iapi.types.StringDataValue) at
> java.lang.Class.getDeclaredMethod(Class.java:1909)
> at
> org.apache.derby.impl.services.bytecode.d_BCValidate.checkMethod(d_BCValidate.java:133)
> at
> org.apache.derby.impl.services.bytecode.BCMethod.callMethod(BCMethod.java:745)
> at
> org.apache.derby.impl.sql.compile.BaseTypeCompiler.generateDataValue(BaseTypeCompiler.java:135)
> at
> org.apache.derby.impl.sql.compile.ExpressionClassBuilder.generateDataValue(ExpressionClassBuilder.java:918)
> at
> org.apache.derby.impl.sql.compile.JavaToSQLValueNode.generateExpression(JavaToSQLValueNode.java:179)
> at
> org.apache.derby.impl.sql.compile.CastNode.generateExpression(CastNode.java:884)
> at
> org.apache.derby.impl.sql.compile.SQLToJavaValueNode.generateSQLValue(SQLToJavaValueNode.java:361)
> at
> org.apache.derby.impl.sql.compile.SQLToJavaValueNode.generateExpression(SQLToJavaValueNode.java:341)
> at
> org.apache.derby.impl.sql.compile.JavaToSQLValueNode.generateExpression(JavaToSQLValueNode.java:176)
> at
> org.apache.derby.impl.sql.compile.ResultColumn.generateExpression(ResultColumn.java:884)
> at
> org.apache.derby.impl.sql.compile.ResultColumnList.generateCore(ResultColumnList.java:1097)
> at
> org.apache.derby.impl.sql.compile.ProjectRestrictNode.generateMinion(ProjectRestrictNode.java:1516)
> at
> org.apache.derby.impl.sql.compile.ProjectRestrictNode.generate(ProjectRestrictNode.java:1303)
> at
> org.apache.derby.impl.sql.compile.ScrollInsensitiveResultSetNode.generate(ScrollInsensitiveResultSetNode.java:110)
> at
> org.apache.derby.impl.sql.compile.CursorNode.generate(CursorNode.java:565)
> at
> org.apache.derby.impl.sql.compile.StatementNode.generate(StatementNode.java:333)
> at
> org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java:447)
> at
> org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:88)
> at
> org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(GenericLanguageConnectionContext.java:741)
> at
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(EmbedPreparedStatement.java:129)
> at
> org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(EmbedPreparedStatement20.java:83)
> at
> org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(EmbedPreparedStatement30.java:63)
> at
> org.apache.derby.jdbc.Driver30.newEmbedPreparedStatement(Driver30.java:93)
> at
> org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(EmbedConnection.java:742)
> at
> org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(EmbedConnection.java:586)
> at lobtests.ClobFunction.main(ClobFunction.java:87)
> Invalid method org.apache.derby.iapi.types.DataValueFactory >>
> org.apache.derby.iapi.types.StringDataValue getClobDataValue(java.sql.Clob,
> org.apache.derby.iapi.types.StringDataValue) because
> java.lang.NoSuchMethodException:
> org.apache.derby.iapi.types.DataValueFactory.getClobDataValue(java.sql.Clob,
> org.apache.derby.iapi.types.StringDataValue)
> java.sql.SQLException: Java exception: 'ASSERT FAILED Invalid method
> org.apache.derby.iapi.types.DataValueFactory >>
> org.apache.derby.iapi.types.StringDataValue getClobDataValue(java.sql.Clob,
> org.apache.derby.iapi.types.StringDataValue) because
> java.lang.NoSuchMethodException:
> org.apache.derby.iapi.types.DataValueFactory.getClobDataValue(java.sql.Clob,
> org.apache.derby.iapi.types.StringDataValue):
> org.apache.derby.shared.common.sanity.AssertFailure'.
> org.apache.derby.shared.common.sanity.AssertFailure: ASSERT FAILED Invalid
> method org.apache.derby.iapi.types.DataValueFactory >>
> org.apache.derby.iapi.types.StringDataValue getClobDataValue(java.sql.Clob,
> org.apache.derby.iapi.types.StringDataValue) because
> java.lang.NoSuchMethodException:
> org.apache.derby.iapi.types.DataValueFactory.getClobDataValue(java.sql.Clob,
> org.apache.derby.iapi.types.StringDataValue)
> at
> org.apache.derby.shared.common.sanity.SanityManager.THROWASSERT(SanityManager.java:149)
> at
> org.apache.derby.impl.services.bytecode.d_BCValidate.checkMethod(d_BCValidate.java:192)
> at
> org.apache.derby.impl.services.bytecode.BCMethod.callMethod(BCMethod.java:745)
> at
> org.apache.derby.impl.sql.compile.BaseTypeCompiler.generateDataValue(BaseTypeCompiler.java:135)
> at
> org.apache.derby.impl.sql.compile.ExpressionClassBuilder.generateDataValue(ExpressionClassBuilder.java:918)
> at
> org.apache.derby.impl.sql.compile.JavaToSQLValueNode.generateExpression(JavaToSQLValueNode.java:179)
> at
> org.apache.derby.impl.sql.compile.CastNode.generateExpression(CastNode.java:884)
> at
> org.apache.derby.impl.sql.compile.SQLToJavaValueNode.generateSQLValue(SQLToJavaValueNode.java:361)
> at
> org.apache.derby.impl.sql.compile.SQLToJavaValueNode.generateExpression(SQLToJavaValueNode.java:341)
> at
> org.apache.derby.impl.sql.compile.JavaToSQLValueNode.generateExpression(JavaToSQLValueNode.java:176)
> at
> org.apache.derby.impl.sql.compile.ResultColumn.generateExpression(ResultColumn.java:884)
> at
> org.apache.derby.impl.sql.compile.ResultColumnList.generateCore(ResultColumnList.java:1097)
> at
> org.apache.derby.impl.sql.compile.ProjectRestrictNode.generateMinion(ProjectRestrictNode.java:1516)
> at
> org.apache.derby.impl.sql.compile.ProjectRestrictNode.generate(ProjectRestrictNode.java:1303)
> at
> org.apache.derby.impl.sql.compile.ScrollInsensitiveResultSetNode.generate(ScrollInsensitiveResultSetNode.java:110)
> at
> org.apache.derby.impl.sql.compile.CursorNode.generate(CursorNode.java:565)
> at
> org.apache.derby.impl.sql.compile.StatementNode.generate(StatementNode.java:333)
> at
> org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java:447)
> at
> org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:88)
> at
> org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(GenericLanguageConnectionContext.java:741)
> at
> org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(EmbedPreparedStatement.java:129)
> at
> org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(EmbedPreparedStatement20.java:83)
> at
> org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(EmbedPreparedStatement30.java:63)
> at
> org.apache.derby.jdbc.Driver30.newEmbedPreparedStatement(Driver30.java:93)
> at
> org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(EmbedConnection.java:742)
> at
> org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(EmbedConnection.java:586)
> at lobtests.ClobFunction.main(ClobFunction.java:87)
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.