db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rick Hillegas (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (DERBY-7006) Investigate putting generated classes under the engine module loader
Date Sat, 13 Oct 2018 20:02:00 GMT

    [ 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)

Mime
View raw message