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


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

Reply via email to