[ 
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

Reply via email to