[
https://issues.apache.org/jira/browse/DERBY-7006?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16649095#comment-16649095
]
Rick Hillegas commented on DERBY-7006:
--------------------------------------
Additional complexity of solution S2:
Each jar file in the database is loaded by its own instance of
org.apache.derby.impl.services.reflect.JarLoader. Every Java ClassLoader
defines its own unnamed module. So, in addition to the catch-all unnamed module
associated with the application ClassLoader, there is an unnamed module for
each jar file in the database. It is that jar-specific unnamed module which
cannot be read by the generated module defined by solution S2. Named modules
cannot read unnamed modules, and java.lang.module.ModuleDescriptor.Builder
provides no support for allowing a generated module to access an unnamed module.
The following script demonstrates this issue.
{noformat}
connect 'jdbc:derby:memory:db;create=true';
call
sqlj.install_jar('/Users/rhillegas/derby/mainline/trunk/java/org.apache.derby.tests/org/apache/derbyTesting/functionTests/tests/store/brtestjar.jar',
'aggjar', 0);
call SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath',
'APP.aggjar');
create function dv(P1 INT) RETURNS INT NO SQL external name
'dbytesting.CodeInAJar.doubleMe' language java parameter style java;
-- fails because the generated module cannot read the unnamed
-- module associated with the JarLoader for APP.aggjar
values dv(3);
-- fails because the generated module cannot read the unnamed
-- module associated with the JarLoader for APP.aggjar
values dv(3) + dv(5);
{noformat}
Here is the output from running that script:
{noformat}
ij version 10.15
ij> connect 'jdbc:derby:memory:db;create=true';
ij> call
sqlj.install_jar('/Users/rhillegas/derby/mainline/trunk/java/org.apache.derby.tests/org/apache/derbyTesting/functionTests/tests/store/brtestjar.jar',
'aggjar', 0);
0 rows inserted/updated/deleted
ij> call SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.classpath',
'APP.aggjar');
0 rows inserted/updated/deleted
ij> create function dv(P1 INT) RETURNS INT NO SQL external name
'dbytesting.CodeInAJar.doubleMe' language java parameter style java;
0 rows inserted/updated/deleted
ij> -- fails because the generated module cannot read the unnamed
-- module associated with the JarLoader for APP.aggjar
values dv(3);
1
-----------
ERROR 38000: The exception 'java.lang.IllegalAccessError: class
org.apache.derby.exe.ac3ea3c0fbx0166x6f01xaed2xffffe268f3f22 (in module
org.apache.derby.generatedclasses) cannot access class dbytesting.CodeInAJar
(in unnamed module @0x1c025cb) because module org.apache.derby.generatedclasses
does not read unnamed module @0x1c025cb' was thrown while evaluating an
expression.
ERROR XJ001: Java exception: 'class
org.apache.derby.exe.ac3ea3c0fbx0166x6f01xaed2xffffe268f3f22 (in module
org.apache.derby.generatedclasses) cannot access class dbytesting.CodeInAJar
(in unnamed module @0x1c025cb) because module org.apache.derby.generatedclasses
does not read unnamed module @0x1c025cb: java.lang.IllegalAccessError'.
ij> -- fails because the generated module cannot read the unnamed
-- module associated with the JarLoader for APP.aggjar
values dv(3) + dv(5);
1
-----------
ERROR 38000: The exception 'java.lang.IllegalAccessError: class
org.apache.derby.exe.ac3ea3c0fbx0166x6f01xaed2xffffe268f3f23 (in module
org.apache.derby.generatedclasses) cannot access class dbytesting.CodeInAJar
(in unnamed module @0x1c025cb) because module org.apache.derby.generatedclasses
does not read unnamed module @0x1c025cb' was thrown while evaluating an
expression.
ERROR XJ001: Java exception: 'class
org.apache.derby.exe.ac3ea3c0fbx0166x6f01xaed2xffffe268f3f23 (in module
org.apache.derby.generatedclasses) cannot access class dbytesting.CodeInAJar
(in unnamed module @0x1c025cb) because module org.apache.derby.generatedclasses
does not read unnamed module @0x1c025cb: java.lang.IllegalAccessError'.
{noformat}
> Investigate putting generated classes under the engine module loader
> --------------------------------------------------------------------
>
> Key: DERBY-7006
> URL: https://issues.apache.org/jira/browse/DERBY-7006
> Project: Derby
> Issue Type: Improvement
> Components: SQL
> Affects Versions: 10.15.0.0
> Reporter: Rick Hillegas
> Priority: Major
> Attachments: derby-7006-01-aa-remiForax.diff,
> derby-7006-01-ac-alanBateman.diff
>
>
> Right now, the generated query plans are compiled into the catch-all unnamed
> module. This forces us to grant reflective access to several engine packages.
> It would be nice to encapsulate the generated classes inside the engine
> module loader.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)