[
https://issues.apache.org/jira/browse/DERBY-2201?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12672327#action_12672327
]
Rick Hillegas commented on DERBY-2201:
--------------------------------------
Thanks for the feedback, Kristian and Knut. Here are some responses. I will
post a revised patch which addresses your comments.
> Should the position arguments in the code below be 1L instead of 0L?
Thanks for catching that.
> I see that SQLBinary.estimateMemoryUsage() was updated. Should
> SQLChar.estimateMemoryUsage() be updated too?
Thanks for noticing that asymmetry. After mulling this over further, I came to
the conclusion that if the data is really in a user Clob or Blob, then the
space is already allocated. It would be wrong to increase the estimated memory
by the length of the Lob because we intend to use the streaming api if we can.
So I have removed the changes to SQLBinary.estimateMemoryUsage().
> Where will the new constructors and the new setValue(Clob) be used? Is it
> only in the case of functions, and for SQLClob?
Thanks for raising this question. It caused me to go through the code and find
that, due to some short-circuiting in the pinball machine, we were not taking
advantage of the streaming apis. It has taken me a while to get back to you
because this is tricky code to debug. I had to decompile the generated code and
prune it back so that I could see the forest instead of the trees--a
painstaking process.
These methods will be invoked in SQL statements which invoke Lob-returning
functions. I don't know of other cases but I can't promise that they don't
exist. Today, those other cases would raise the compiler errors seen in this
bug.
Here, for instance, is a case in which the compiler will generate code which
stuffs a user Clob into a SQLVarchar. The final INSERT statement generates that
code:
create function "clob_Clob_String"
(
a_0 varchar( 10 )
)
returns clob
language java
parameter style java
no sql
external name
'org.apache.derbyTesting.functionTests.tests.lang.AnsiSignatures.clob_Clob_String'
;
create table t2( a varchar( 32000 ) );
insert into t2( a ) values( cast( "clob_Clob_String"( 'abc' ) as varchar(
32000)) );
> 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-02-aa-wrapUserLob.diff,
> 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.