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 20:01:31 GMT
    [ http://issues.apache.org/jira/browse/DERBY-732?page=comments#action_12359073 ] 

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

Looking at the way Derby handles parameters in the generated class I think there is room for
improvement, some of which might help this type of query. I think when it was written such
large numbers of parameters were not considered, this query has at least 360. Some of the
approach has been to generate code for each parameter, thus the amount of generated code and
sometimes instance fields in the generated class is linear with the number of parameters.

There are a couple of approaches to fix this, one try to switch from a generate per-parameter
into a loop-driven algorithm. This typically means a utility method in the activation or elsewhere
to handle the case and the generated or other code calls the utility method. The second is
to reduce the amount of code generated per parameter.

I'll enter a couple of sub-tasks for the easy cases I've spotted so f ar


> 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