Changeset: 07a4998898a8 for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/07a4998898a8
Modified Files:
        src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java
        tests/JDBC_API_Tester.java
Branch: default
Log Message:

Improve and optimize PreparedStatement.setBigDecimal() implementation. It now 
checks on null input parameter to prevent NPE. Also removed code to trim 
leading zero's.
Extended BugDecimalRound_Bug_3561() test with more values, including a null 
input parameter.


diffs (110 lines):

diff --git a/src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java 
b/src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java
--- a/src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java
+++ b/src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java
@@ -564,29 +564,24 @@ public class MonetPreparedStatement
         * @throws SQLException if a database access error occurs
         */
        @Override
-       public void setBigDecimal(final int parameterIndex, BigDecimal x) 
throws SQLException {
-               // get array position
-               final int i = getParamIdx(parameterIndex);
-
-               // round to the scale of the DB:
-               x = x.setScale(scale[i], java.math.RoundingMode.HALF_UP);
-
-               // if precision is now greater than that of the db, throw an 
error:
-               if (x.precision() > digits[i]) {
-                       throw new SQLDataException("DECIMAL value exceeds 
allowed digits/scale: " + x.toPlainString() + " (" + digits[i] + "/" + scale[i] 
+ ")", "22003");
+       public void setBigDecimal(final int parameterIndex, final BigDecimal x) 
throws SQLException
+       {
+               if (x == null) {
+                       setValue(parameterIndex, "NULL");
+                       return;
                }
 
-               // MonetDB doesn't like leading 0's, since it counts them as 
part of
-               // the precision, so let's strip them off. (But be careful not 
to do
-               // this to the exact number "0".)  Also strip off trailing
-               // numbers that are inherent to the double representation.
-               String xStr = x.toPlainString();
-               final int dot = xStr.indexOf('.');
-               if (dot >= 0)
-                       xStr = xStr.substring(0, Math.min(xStr.length(), dot + 
1 + scale[i]));
-               while (xStr.startsWith("0") && xStr.length() > 1)
-                       xStr = xStr.substring(1);
-               setValue(parameterIndex, xStr);
+               // get array position
+               final int i = getParamIdx(parameterIndex);
+               // round to the scale of the DB specification:
+               final BigDecimal decval = x.setScale(scale[i], 
java.math.RoundingMode.HALF_UP);
+               final String decvalStr = decval.toPlainString();
+
+               // if precision is now greater than that of the DB 
specification, throw an error:
+               if (decval.precision() > digits[i]) {
+                       throw new SQLDataException("DECIMAL value '" + 
decvalStr + "' exceeds allowed digits,scale: (" + digits[i] + "," + scale[i] + 
")", "22003");
+               }
+               setValue(parameterIndex, decvalStr);
        }
 
        /**
diff --git a/tests/JDBC_API_Tester.java b/tests/JDBC_API_Tester.java
--- a/tests/JDBC_API_Tester.java
+++ b/tests/JDBC_API_Tester.java
@@ -5586,7 +5586,7 @@ final public class JDBC_API_Tester {
                ResultSet rs = null;
                try {
                        stmt1 = con.createStatement();
-                       stmt1.executeUpdate("CREATE TABLE bug3561 (d 
decimal(14,4))");
+                       stmt1.executeUpdate("CREATE TABLE bug3561 (d 
decimal(7,4))");
 
                        pst = con.prepareStatement("INSERT INTO bug3561 VALUES 
(?)");
                        pst.setBigDecimal(1, new BigDecimal("112.125"));
@@ -5595,6 +5595,29 @@ final public class JDBC_API_Tester {
                        pst.executeUpdate();
                        pst.setBigDecimal(1, new BigDecimal("0.012345"));
                        pst.executeUpdate();
+                       pst.setBigDecimal(1, new BigDecimal(0.0/10000000));     
// 0.0000
+                       pst.executeUpdate();
+                       pst.setBigDecimal(1, new BigDecimal(2.0/3));    // 
0.666666667
+                       pst.executeUpdate();
+                       pst.setBigDecimal(1, new BigDecimal(11.0/7));   // 
1.571428571
+                       pst.executeUpdate();
+                       // repeat for negative values
+                       pst.setBigDecimal(1, new BigDecimal("-0112.125"));
+                       pst.executeUpdate();
+                       pst.setBigDecimal(1, new BigDecimal("-0212.12345"));
+                       pst.executeUpdate();
+                       pst.setBigDecimal(1, new BigDecimal("-0.012345"));
+                       pst.executeUpdate();
+                       pst.setBigDecimal(1, new BigDecimal(0.0/-10000000));    
// 0.0000
+                       pst.executeUpdate();
+                       pst.setBigDecimal(1, new BigDecimal(-2.0/3));   // 
-0.666666667
+                       pst.executeUpdate();
+                       pst.setBigDecimal(1, new BigDecimal(-11.0/7));  // 
-1.571428571
+                       pst.executeUpdate();
+                       // check what happens if null is used
+                       pst.setBigDecimal(1, null);
+                       pst.executeUpdate();
+
                        pst.close();
 
                        stmt2 = con.createStatement();
@@ -5618,7 +5641,17 @@ final public class JDBC_API_Tester {
                compareExpectedOutput("BugDecimalRound_Bug_3561",
                                "112.1250\n" +
                                "212.1235\n" +
-                               "0.0123\n");
+                               "0.0123\n" +
+                               "0.0000\n" +
+                               "0.6667\n" +
+                               "1.5714\n" +
+                               "-112.1250\n" +
+                               "-212.1235\n" +
+                               "-0.0123\n" +
+                               "0.0000\n" +
+                               "-0.6667\n" +
+                               "-1.5714\n" +
+                               "null\n");
        }
 
        private void BugExecuteUpdate_Bug_3350() {
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to