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

Reply via email to