db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rick Hillegas (JIRA)" <j...@apache.org>
Subject [jira] Commented: (DERBY-2201) Calling functions that return Blob/Clob does not work.
Date Tue, 10 Feb 2009 17:27:16 GMT

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


Mime
View raw message