Uploaded image for project: 'Derby'
  1. Derby
  2. DERBY-732

ERROR XBCM1: Java linkage error thrown during load of generated class for query with large number of logical operators and substitution parameters.

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 10.1.3.2, 10.2.1.6
    • Component/s: Services
    • Labels:
      None

      Description

      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

        Attachments

        1. TestConnect.java
          8 kB
          Katherine Marsden
        2. clss.txt
          1.42 MB
          Daniel John Debrunner

          Issue Links

          There are no Sub-Tasks for this issue.

            Activity

              People

              • Assignee:
                djd Daniel John Debrunner
                Reporter:
                kmarsden Katherine Marsden
              • Votes:
                0 Vote for this issue
                Watchers:
                0 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: