You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Kathey Marsden (JIRA)" <de...@db.apache.org> on 2005/11/30 14:27:31 UTC
[jira] Created: (DERBY-732) ERROR XBCM1: Java linkage error thrown during load of generated class for query with large number of logical operators and substitution parameters.
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
[jira] Resolved: (DERBY-732) ERROR XBCM1: Java linkage error thrown during load of generated class for query with large number of logical operators and substitution parameters.
Posted by "Kathey Marsden (JIRA)" <de...@db.apache.org>.
[ http://issues.apache.org/jira/browse/DERBY-732?page=all ]
Kathey Marsden resolved DERBY-732:
----------------------------------
Fix Version: (was: 10.1.3.0)
(was: 10.1.2.2)
Resolution: Fixed
Assign To: Daniel John Debrunner
All subtasks are complete and the original query now runs.
Of course there is still an upper bound on the size of the query, but a new issue can be filed for additional work and associated with DERBY-176
> 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
> Assignee: Daniel John Debrunner
> Fix For: 10.2.0.0
> Attachments: TestConnect.java, clss.txt
>
> 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
[jira] Updated: (DERBY-732) ERROR XBCM1: Java linkage error thrown during load of generated class for query with large number of logical operators and substitution parameters.
Posted by "Daniel John Debrunner (JIRA)" <de...@db.apache.org>.
[ http://issues.apache.org/jira/browse/DERBY-732?page=all ]
Daniel John Debrunner updated DERBY-732:
----------------------------------------
Attachment: clss.txt
Javap dump of generated class file for the SQL statement
> 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, clss.txt
>
> 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
[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.
Posted by "Daniel John Debrunner (JIRA)" <de...@db.apache.org>.
[ 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
[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.
Posted by "Daniel John Debrunner (JIRA)" <de...@db.apache.org>.
[ 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
[jira] Updated: (DERBY-732) ERROR XBCM1: Java linkage error thrown during load of generated class for query with large number of logical operators and substitution parameters.
Posted by "Kathey Marsden (JIRA)" <de...@db.apache.org>.
[ http://issues.apache.org/jira/browse/DERBY-732?page=all ]
Kathey Marsden updated DERBY-732:
---------------------------------
Attachment: TestConnect.java
Attached program reproduces the problem
In ij
connect 'wombat;create=true';
create table t1 (ITEMID int, VERSIONID int);
java TestConnect
> 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
[jira] Closed: (DERBY-732) ERROR XBCM1: Java linkage error thrown during load of generated class for query with large number of logical operators and substitution parameters.
Posted by "Kathey Marsden (JIRA)" <de...@db.apache.org>.
[ http://issues.apache.org/jira/browse/DERBY-732?page=all ]
Kathey Marsden closed DERBY-732:
--------------------------------
> 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
> Assignee: Daniel John Debrunner
> Fix For: 10.2.0.0
> Attachments: TestConnect.java, clss.txt
>
> 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
[jira] Updated: (DERBY-732) ERROR XBCM1: Java linkage error thrown
during load of generated class for query with large number of logical
operators and substitution parameters.
Posted by "Kathey Marsden (JIRA)" <ji...@apache.org>.
[ https://issues.apache.org/jira/browse/DERBY-732?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Kathey Marsden updated DERBY-732:
---------------------------------
Fix Version/s: 10.1.3.2
> 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: https://issues.apache.org/jira/browse/DERBY-732
> Project: Derby
> Issue Type: Bug
> Components: Services
> Reporter: Kathey Marsden
> Assignee: Daniel John Debrunner
> Fix For: 10.1.3.2, 10.2.1.6
>
> Attachments: clss.txt, 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.
-
You can reply to this email to add a comment to the issue online.