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

Rick Hillegas commented on DERBY-2201:
--------------------------------------

Thanks for the quick feedback, Kristian.

This new kind of java.sql.[BC]ob is never returned to the user. Having a 
SQL[BC]lob return an Embed[BC]lob feels to me like a layering violation for two 
reasons:

1) it would mean that an iapi package would be reaching into an impl package

2) it would mean that the internal datatype layer would be reaching up into the 
JDBC layer, inverting the normal layering of these components

We could create vacuous implementations of java.sql.[BC]lob in the iapi package 
next to SQL[BC]lob. Let's call them [BC]lobImpl. A  [BC]lobImpl would wrap the 
byte or stream contents of a SQL[BC]lob, either by being constructed from the 
bytes or streams or by simply forwarding its methods to the SQL[BC]lob. That 
might be easier to understand than having SQL[BC]lob implement java.sql.[BC]lob.

Your point about the complexity of writing another implementation of 
java.sql.[BC]lob is well founded. Writing a vacuous implementation of 
java.sql.[BC]lob is easy--but as you know better than anyone else, handling the 
streaming methods is very hard.

In this particular code path, I think that SQL[BC]lob.getObject() should not 
return a SQL[BC]lob or an Embed[BC]lob but rather a User[BC]lob, where the 
User[BC]lob is what's returned by the user-defined function. That is, the 
nesting/wrapping of these classes should be:

   Embed[BC]lob
   (
       SQL[BC]lob
       (
            User[BC]lob
       )
   )

I tried to get this to work a couple months ago, but my User[BC]lob kept 
getting lost in the SQLBinary pinball machine. I will put some more effort into 
this approach.

For the record, the tests ran cleanly for me.


> 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