[ 
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

Reply via email to