db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Daniel John Debrunner (JIRA)" <derby-...@db.apache.org>
Subject [jira] Commented: (DERBY-732) ERROR XBCM1: Java linkage error thrown during load of generated class for query with large number of logical operators and substitution parameters.
Date Thu, 01 Dec 2005 21:07:31 GMT
    [ http://issues.apache.org/jira/browse/DERBY-732?page=comments#action_12359079 ] 

Daniel John Debrunner commented on DERBY-732:
---------------------------------------------

The expression method e1() contains a possibility for code reduction. There are some checkcasts()
that could be removed after a getParameter:

E.g.

   2508:	invokeinterface	#123,  2; //InterfaceMethod org/apache/derby/iapi/sql/ParameterValueSet.getParameter:(I)Lorg/apache/derby/iapi/types/DataValueDescriptor;
   2513:	checkcast	#125; //class NumberDataValue
   2516:	checkcast	#127; //class DataValueDescriptor
   2519:	dup
   2520:	checkcast	#127; //class DataValueDescriptor


The one at 2516 is not required because NumberDataValue is a DataValueDescriptor.

The one at 2520 is not required because a dup of a DataValueDescriptor is still a DataValueDescriptor
:-)

These casts are most likely to set up for method calls further down the stack, and since the
method calls probably come from different query tree nodes and there's no interaction to resolve
these issues.

The byte code compiler could potentially spot some, but it doesn't load classes to determine
type relationships. Mainly because the type may not be available for a routine (procedure/function)
and the compile needs to complete, even when classes cannot be loaded.

It could spot check casts where the class names are identical. I'll enter a sub-task for this
one.

> ERROR XBCM1: Java linkage error thrown during load of generated class  for  query with
large number of logical operators and substitution parameters.
> -----------------------------------------------------------------------------------------------------------------------------------------------------
>
>          Key: DERBY-732
>          URL: http://issues.apache.org/jira/browse/DERBY-732
>      Project: Derby
>         Type: Bug
>   Components: Services
>     Reporter: Kathey Marsden
>      Fix For: 10.2.0.0, 10.1.3.0, 10.1.2.2
>  Attachments: TestConnect.java
>
> The attatched test case with a large number of logical operators in the where clause
fails. This is the delete statement causing the problem
>  String sql = "DELETE FROM T1 WHERE " +
>           "(ITEMID=? AND VERSIONID=?) OR (ITEMID=? AND VERSIONID=?) OR " +
>           "(ITEMID=? AND VERSIONID=?) OR (ITEMID=? AND VERSIONID=?) OR " +
>           "(ITEMID=? AND VERSIONID=?) OR (ITEMID=? AND VERSIONID=?) OR " +
> 	  [ repeat line above 90 times]
> 	"(ITEMID=? AND VERSIONID=?) OR (ITEMID=? AND VERSIONID=?) OR " +
>           "(ITEMID=? AND VERSIONID=?)";
> To reproduce  create the table with ij and run the TestConnect.java program attached.
> connect 'wombat;create=true';
> create table t1 (ITEMID int, VERSIONID int);
> java TestConnect
> The error is different with Sun and IBM JVMS
> With Sun 1,4,2 JVM the error is
> ERROR XBCM2: Cannot create an instance of generated class org.apache.derby.exe.ac601a400fx0107xdfdfx9bb8x000000156cb80.
>         at org.apache.derby.iapi.error.StandardException.newException(StandardException.java:315)
>         at org.apache.derby.impl.services.reflect.LoadedGeneratedClass.newInstance(LoadedGeneratedClass.java:83)
>         at org.apache.derby.impl.services.reflect.ReflectGeneratedClass.newInstance(ReflectGeneratedClass.java:59)
>         at org.apache.derby.impl.sql.GenericActivationHolder.<init>(GenericActivationHolder.java:121)
>         at org.apache.derby.impl.sql.GenericPreparedStatement.getActivation(GenericPreparedStatement.java:233)
>         at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(EmbedPreparedStatement.java:123)
>         at org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(EmbedPreparedStatement20.java:82)
>         at org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(EmbedPreparedStatement30.java:62)
>         at org.apache.derby.jdbc.Driver30.newEmbedPreparedStatement(Driver30.java:92)
>         at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(EmbedConnection.java:678)
>         at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(EmbedConnection.java:522)
>         at TestConnect.main(TestConnect.java:119)
> With IBM 1.4.2 it gives a linkage error
> Exception in thread "main" ERROR XBCM1: Java linkage error thrown during load of generated
class org.apache.derby.exe.ac601a400fx0107xdfe4xf35ax000000267c780.
>         at org.apache.derby.iapi.error.StandardException.newException(StandardException.java:315)
>         at org.apache.derby.impl.services.reflect.DatabaseClasses.loadGeneratedClass(DatabaseClasses.java:162)
>         at org.apache.derby.impl.services.bytecode.GClass.getGeneratedClass(GClass.java:59)
>         at org.apache.derby.impl.sql.compile.ExpressionClassBuilder.getGeneratedClass(ExpressionClassBuilder.java:923)
>         at org.apache.derby.impl.sql.compile.StatementNode.generate(StatementNode.java:267)
>         at org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java:472)
>         at org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:110)
>         at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(GenericLanguageConnectionContext.java:704)
>         at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(EmbedPreparedStatement.java:118)
>         at org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(EmbedPreparedStatement20.java:82)
>         at org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(EmbedPreparedStatement30.java:62)
>         at org.apache.derby.jdbc.Driver30.newEmbedPreparedStatement(Driver30.java:92)
>         at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(EmbedConnection.java:678)
>         at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(EmbedConnection.java:522)
>         at TestConnect.main(TestConnect.java:119)
> $
> The query itself is really not that large or complex but the entire where clause goes
into a single method. Dumping the class with derby.debug.true=DumpClassFile shows that the
 very large method e1()  is the source of the trouble.
> $ java org.apache.derby.exe.ac601a400fx0107xdf9bx1ce4x000000156ed80
> Exception in thread "main" java.lang.VerifyError: (class: org/apache/derby/exe/ac601a400fx0107xdf9bx1ce4x000000156ed80,
method: e1 signature: ()Ljava/lang/Object;) Illegal target of jump or branch

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


Mime
View raw message