[
https://issues.apache.org/jira/browse/DERBY-2201?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12670286#action_12670286
]
Kristian Waagan commented on DERBY-2201:
----------------------------------------
Thanks for looking into this, Rick.
At first sight, I have to say that I don't like what is done to the
SQLBlob/SQLClob classes. In my opinion these classes are already complex
enough, and with the change we're also implementing java.sql.[BC]lob in several
places. History has shown us that dealing with LOBs is difficult to get right
[in Derby]; freeing resources / cleanup, materialization and performance.
Is the DVD returned to the user as a java.sql.[BC]lob? If so, I suggest that we
consider to create a proper Blob/Clob object instead of returning the DVD.
Quite a lot of effort has been put into the relevant classes.
To make the getObject-method return either EmbedBlob or EmbedClob, we need a
reference to the connection. Is there a way we can obtain it?
If creating EmbedBlob/-Clob isn't feasible, I think two rather simple classes
implementing Blob/Clob can be written and instantiated from the DVD. Both of
these will do their work off char[]/String or byte[]. As soon as we start
working with source streams, my preference is to use the existing LOB classes.
Even in the simplest case, I'm sure there will be pitfalls related to updates
and cleanup/closing.
Also, are any special considerations required for LOBs in this context?
> 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.