Unsafe use of BigDecimal constructors
-------------------------------------
Key: DERBY-4892
URL: https://issues.apache.org/jira/browse/DERBY-4892
Project: Derby
Issue Type: Bug
Components: JDBC, Test
Affects Versions: 10.7.1.0
Reporter: Knut Anders Hatlen
Assignee: Knut Anders Hatlen
We have some code that's supposed to work on Java 1.4, but that uses BigDecimal
constructors that were not added until Java 5. The problematic constructors are
the ones that take a single int or long.
The constructors are used in the following classes:
org.apache.derby.client.am.Cursor
org.apache.derbyTesting.functionTests.tests.lang.Price
org.apache.derbyTesting.system.oe.client.Submitter
All of the classes are compiled against ${java14compile.classpath}, so one
would expect the build to fail when java14compile.classpath pointed to proper
Java 1.4 libraries. However, there is a constructor with a double parameter in
Java 1.4, and the compiler picks that constructor if it cannot find the ones
for int and long. If that happens, the compiled byte-code works on Java 1.4 and
newer, and everything is fine.
The problem appears when the build does not use the Java 1.4 libraries. This
can easily happen if you build without a customized ant.properties, and
PropertySetter ends up building java14compile.classpath based on the
auto-detected java15compile.classpath. In that case, the compiler finds the int
and long variants of the constructor, even when building against
java14compile.classpath. The compiled byte-code will therefore use those Java 5
constructors, and the code will fail at run-time if ever executed on a Java 1.4
JVM.
To reproduce, build Derby without ant.properties on a system where
PropertySetter doesn't find JDK 1.4. Verify with -DprintCompilerProperties=true
that java14compile.classpath is built up of jar files from a Java 5 or Java 6
directory. Then run org.apache.derbyTesting.functionTests.tests.lang.UDTTest
using a Java 1.4 JVM. You'll see two errors of this kind:
1)
test_06_casts(org.apache.derbyTesting.functionTests.tests.lang.UDTTest)java.lang.NoSuchMethodError:
java.math.BigDecimal.<init>(I)V
at
org.apache.derbyTesting.functionTests.tests.lang.Price.makePrice(Price.java:49)
at
org.apache.derbyTesting.functionTests.tests.lang.UDTTest.test_06_casts(UDTTest.java:501)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at
org.apache.derbyTesting.junit.BaseTestCase.runBare(BaseTestCase.java:109)
at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
at junit.extensions.TestSetup.run(TestSetup.java:25)
at
org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
at junit.extensions.TestDecorator.basicRun(TestDecorator.java:24)
at junit.extensions.TestSetup$1.protect(TestSetup.java:21)
at junit.extensions.TestSetup.run(TestSetup.java:25)
at
org.apache.derbyTesting.junit.BaseTestSetup.run(BaseTestSetup.java:57)
The problem in client.am.Cursor can be seen if you follow the same procedure as
above, and instead of UDTTest run ParameterMappingTest with the patch for
DERBY-4891 that enables testing of booleans.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.