Author: jboynes
Date: Mon May  2 22:35:28 2005
New Revision: 167863

URL: http://svn.apache.org/viewcvs?rev=167863&view=rev
Log:
apply patch from kmarsden for Derby-250

Modified:
    
incubator/derby/code/trunk/java/client/org/apache/derby/client/am/CrossConverters.java
    
incubator/derby/code/trunk/java/client/org/apache/derby/client/am/PreparedStatement.java
    
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk15/prepStmt.out
    
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk15/prepStmt.out
    
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/prepStmt.out
    
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/prepStmt.java
    
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/testRelative.java

Modified: 
incubator/derby/code/trunk/java/client/org/apache/derby/client/am/CrossConverters.java
URL: 
http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/client/am/CrossConverters.java?rev=167863&r1=167862&r2=167863&view=diff
==============================================================================
--- 
incubator/derby/code/trunk/java/client/org/apache/derby/client/am/CrossConverters.java
 (original)
+++ 
incubator/derby/code/trunk/java/client/org/apache/derby/client/am/CrossConverters.java
 Mon May  2 22:35:28 2005
@@ -564,6 +564,28 @@
         }
     }
 
+    // ------ method to convert to targetJdbcType ------
+    /**
+     * Convert the input targetJdbcType to the correct JdbcType used by 
CrossConverters.
+     */
+    public static int getInputJdbcType(int jdbcType) {
+        switch (jdbcType) {
+        case java.sql.Types.BIT:
+        case java.sql.Types.BOOLEAN:
+        case java.sql.Types.TINYINT:
+        case java.sql.Types.SMALLINT:
+            return java.sql.Types.INTEGER;
+        case java.sql.Types.NUMERIC:
+            return java.sql.Types.DECIMAL;
+        case java.sql.Types.FLOAT:
+            return java.sql.Types.DOUBLE;
+        default:
+            return jdbcType;
+        }
+
+    }
+
+
     // -- methods in support of setObject(String)/getString() on BINARY 
columns---
 
 
@@ -1149,7 +1171,6 @@
 
     final java.sql.Date getDateFromString(String source) throws SqlException {
         try {
-            // We override the JRE's Date.valueOf() in order to support a more 
Extended ISO format as requested by Toronto team
             return date_valueOf(source);
         } catch (java.lang.IllegalArgumentException e) { // subsumes 
NumberFormatException
             throw new SqlException(agent_.logWriter_, e, "Invalid data 
conversion:" +
@@ -1170,7 +1191,6 @@
 
     final java.sql.Time getTimeFromString(String source) throws SqlException {
         try {
-            // We override the JRE's Time.valueOf() in order to support a more 
Extended ISO format as requested by Toronto team
             return time_valueOf(source);
         } catch (java.lang.IllegalArgumentException e) { // subsumes 
NumberFormatException
             throw new SqlException(agent_.logWriter_, e, "Invalid data 
conversion:" +
@@ -1187,7 +1207,6 @@
 
     final java.sql.Timestamp getTimestampFromString(String source) throws 
SqlException {
         try {
-            // We override the JRE's Timestamp.valueOf() in order to support a 
more Extended ISO format as requested by Toronto team
             return timestamp_valueOf(source);
         } catch (java.lang.IllegalArgumentException e) {  // subsumes 
NumberFormatException
             throw new SqlException(agent_.logWriter_, e,
@@ -1205,263 +1224,33 @@
         return new java.sql.Timestamp(source.getTime());
     }
 
-    //-------------- Customized versions of java.lang parse methods 
--------------
-
-    // Converts a string in JDBC date "extended" ISO format to a Date value.
-    // yyyy-mm-dd with trailing blanks allowed.
     final java.sql.Date date_valueOf(String s) throws 
java.lang.IllegalArgumentException {
         String formatError = "JDBC Date format must be yyyy-mm-dd";
         if (s == null) {
             throw new java.lang.IllegalArgumentException(formatError);
         }
-
-        int year = 1000 * getDigit(s, 0);
-        year += 100 * getDigit(s, 1);
-        year += 10 * getDigit(s, 2);
-        year += 1 * getDigit(s, 3);
-
-        char hyphen = s.charAt(4);
-        if (hyphen != '-') {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-
-        int month = 0;
-        int day = 0;
-        int pos = 0;
-
-        hyphen = s.charAt(6);
-        if (hyphen == '-') { //single digit month
-            month = getDigit(s, 5);
-            pos = 7;
-        } else { //double digit month
-            month = 10 * getDigit(s, 5);
-            month += 1 * getDigit(s, 6);
-            pos = 8;
-            hyphen = s.charAt(7);
-            if (hyphen != '-') {
-                throw new java.lang.IllegalArgumentException(formatError);
-            }
-        }
-
-        if (s.length() == (pos + 1) || Character.digit(s.charAt(pos + 1), 10) 
== -1) { //single digit day
-            day = getDigit(s, pos);
-            pos++;
-        } else { //double digit day
-            day = 10 * getDigit(s, pos);
-            day += 1 * getDigit(s, pos + 1);
-            pos = pos + 2;
-        }
-        skipPadding(s, pos, s.length());
-        return new java.sql.Date(year - 1900, month - 1, day);
-    }
-
-    // Customized versions of java.util.Date/Time/Timestamp valueOf methods
-    // We override the JRE's Date/Time/Timestamp.valueOf() methods in order to 
support a
-    // more Extended ISO format as requested by Toronto team.
-    // Also allows for space-padding of CHAR fields.
-
-    private final int getDigit(String s, int index) throws 
java.lang.IllegalArgumentException {
-        String formatError = "Date/Time must be JDBC format";
-        int digit = -1;
-        if (s != null && s.length() >= 10) {
-            digit = Character.digit(s.charAt(index), 10);
-        }
-        if (digit == -1) {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-        return digit;
+        s = s.trim();
+        return java.sql.Date.valueOf(s);
     }
 
-    // Converts a string in JDBC time "extended" ISO format to a Time value.
-    // hh:mm:ss or hh.mm.ss with trailing blanks allowed.
+
     final java.sql.Time time_valueOf(String s) throws 
java.lang.IllegalArgumentException, NumberFormatException {
         String formatError = "JDBC Time format must be hh:mm:ss";
         if (s == null) {
             throw new java.lang.IllegalArgumentException();
         }
-
-        int hour = 10 * getDigit(s, 0);
-        hour += 1 * getDigit(s, 1);
-
-        char colon = s.charAt(2);
-        if (colon != ':' && colon != '.') {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-
-        int minute = 10 * getDigit(s, 3);
-        minute += 1 * getDigit(s, 4);
-
-        colon = s.charAt(5);
-        if (colon != ':' && colon != '.') {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-
-        int second = 10 * getDigit(s, 6);
-        second += 1 * getDigit(s, 7);
-
-        skipPadding(s, 8, s.length());
-        return new java.sql.Time(hour, minute, second);
+        s = s.trim();
+        return java.sql.Time.valueOf(s);
     }
 
-    // Converts a string in JDBC date "extended" ISO format to a Timestamp 
value.
-    // yyyy-mm-dd hh:mm:ss[.[n[n[n[n[n[n[n[n[n]]]]]]]] or 
yyyy-mm-dd-hh.mm.ss[.[n[n[n[n[n[n[n[n[n]]]]]]]] with trailing blanks allowed.
     final java.sql.Timestamp timestamp_valueOf(String s) throws 
java.lang.IllegalArgumentException, NumberFormatException {
         String formatError = "JDBC Timestamp format must be yyyy-mm-dd 
hh:mm:ss.fffffffff";
         if (s == null) {
             throw new java.lang.IllegalArgumentException();
         }
 
-        int year = 1000 * getDigit(s, 0);
-        year += 100 * getDigit(s, 1);
-        year += 10 * getDigit(s, 2);
-        year += 1 * getDigit(s, 3);
-
-        char hyphen = s.charAt(4);
-        if (hyphen != '-') {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-
-        int month = 10 * getDigit(s, 5);
-        month += 1 * getDigit(s, 6);
-
-        hyphen = s.charAt(7);
-        if (hyphen != '-') {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-
-        int day = 10 * getDigit(s, 8);
-        day += 1 * getDigit(s, 9);
-
-        char space = s.charAt(10);
-        if (space != ' ' && space != '-') {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-
-        int hour = 10 * getDigit(s, 11);
-        hour += 1 * getDigit(s, 12);
-
-        char colon = s.charAt(13);
-        if (colon != ':' && colon != '.') {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-
-        int minute = 10 * getDigit(s, 14);
-        minute += 1 * getDigit(s, 15);
-
-        colon = s.charAt(16);
-        if (colon != ':' && colon != '.') {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-
-        int second = 10 * getDigit(s, 17);
-        second += 1 * getDigit(s, 18);
-
-        if (s.trim().length() == 19) {
-            return new java.sql.Timestamp(year - 1900, month - 1, day, hour, 
minute, second, 0);
-        }
-
-        char period = s.charAt(19);
-        if (period != '.') {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-        if (s.length() == 20 || s.charAt(20) == ' ') {
-            skipPadding(s, 20, s.length());
-            return new java.sql.Timestamp(year - 1900, month - 1, day, hour, 
minute, second, 0);
-        }
-
-        // We can put the following into a while loop later....
-
-        int digit = Character.digit(s.charAt(20), 10);
-        if (digit == -1) {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-        int nanos = 100000000 * digit;
-        if (s.length() == 21 || s.charAt(21) == ' ') {
-            skipPadding(s, 21, s.length());
-            return new java.sql.Timestamp(year - 1900, month - 1, day, hour, 
minute, second, nanos);
-        }
-
-        digit = Character.digit(s.charAt(21), 10);
-        if (digit == -1) {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-        nanos += 10000000 * digit;
-        if (s.length() == 22 || s.charAt(22) == ' ') {
-            skipPadding(s, 22, s.length());
-            return new java.sql.Timestamp(year - 1900, month - 1, day, hour, 
minute, second, nanos);
-        }
-
-        digit = Character.digit(s.charAt(22), 10);
-        if (digit == -1) {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-        nanos += 1000000 * digit;
-        if (s.length() == 23 || s.charAt(23) == ' ') {
-            skipPadding(s, 23, s.length());
-            return new java.sql.Timestamp(year - 1900, month - 1, day, hour, 
minute, second, nanos);
-        }
-
-        digit = Character.digit(s.charAt(23), 10);
-        if (digit == -1) {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-        nanos += 100000 * digit;
-        if (s.length() == 24 || s.charAt(24) == ' ') {
-            skipPadding(s, 24, s.length());
-            return new java.sql.Timestamp(year - 1900, month - 1, day, hour, 
minute, second, nanos);
-        }
-
-        digit = Character.digit(s.charAt(24), 10);
-        if (digit == -1) {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-        nanos += 10000 * digit;
-        if (s.length() == 25 || s.charAt(25) == ' ') {
-            skipPadding(s, 25, s.length());
-            return new java.sql.Timestamp(year - 1900, month - 1, day, hour, 
minute, second, nanos);
-        }
-
-        digit = Character.digit(s.charAt(25), 10);
-        if (digit == -1) {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-        nanos += 1000 * digit;
-        if (s.length() == 26 || s.charAt(26) == ' ') {
-            skipPadding(s, 26, s.length());
-            return new java.sql.Timestamp(year - 1900, month - 1, day, hour, 
minute, second, nanos);
-        }
-
-        digit = Character.digit(s.charAt(26), 10);
-        if (digit == -1) {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-        nanos += 100 * digit;
-        if (s.length() == 27 || s.charAt(27) == ' ') {
-            skipPadding(s, 27, s.length());
-            return new java.sql.Timestamp(year - 1900, month - 1, day, hour, 
minute, second, nanos);
-        }
-
-        digit = Character.digit(s.charAt(27), 10);
-        if (digit == -1) {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-        nanos += 10 * digit;
-        if (s.length() == 28 || s.charAt(28) == ' ') {
-            skipPadding(s, 28, s.length());
-            return new java.sql.Timestamp(year - 1900, month - 1, day, hour, 
minute, second, nanos);
-        }
-
-        digit = Character.digit(s.charAt(28), 10);
-        if (digit == -1) {
-            throw new java.lang.IllegalArgumentException(formatError);
-        }
-        nanos += 1 * digit;
-        if (s.length() == 29 || s.charAt(29) == ' ') {
-            skipPadding(s, 29, s.length());
-            return new java.sql.Timestamp(year - 1900, month - 1, day, hour, 
minute, second, nanos);
-        }
-
-        throw new java.lang.IllegalArgumentException(formatError);
+        s = s.trim();
+        return java.sql.Timestamp.valueOf(s);
     }
 
     private final byte parseByte(String s) throws NumberFormatException {

Modified: 
incubator/derby/code/trunk/java/client/org/apache/derby/client/am/PreparedStatement.java
URL: 
http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/client/org/apache/derby/client/am/PreparedStatement.java?rev=167863&r1=167862&r2=167863&view=diff
==============================================================================
--- 
incubator/derby/code/trunk/java/client/org/apache/derby/client/am/PreparedStatement.java
 (original)
+++ 
incubator/derby/code/trunk/java/client/org/apache/derby/client/am/PreparedStatement.java
 Mon May  2 22:35:28 2005
@@ -21,7 +21,6 @@
 package org.apache.derby.client.am;
 
 
-
 public class PreparedStatement extends Statement
         implements java.sql.PreparedStatement,
         PreparedStatementCallbackInterface {
@@ -847,6 +846,24 @@
         if (x == null) {
             setNull(parameterIndex, targetJdbcType);
             return;
+        }
+
+        // JDBC Spec specifies that conversion should occur on the client if
+        // the targetJdbcType is specified.
+
+        int inputParameterType = 
CrossConverters.getInputJdbcType(targetJdbcType);
+        parameterMetaData_.clientParamtertype_[parameterIndex - 1] = 
inputParameterType;
+        x = agent_.crossConverters_.setObject(inputParameterType, x);
+
+        // Set to round down on setScale like embedded does in SQLDecimal
+        try {
+            if (targetJdbcType == java.sql.Types.DECIMAL || targetJdbcType == 
java.sql.Types.NUMERIC) {
+                x = ((java.math.BigDecimal) x).setScale(scale, 
java.math.BigDecimal.ROUND_DOWN);
+            }
+        } catch (ArithmeticException ae) {
+            // Any problems with scale should have already been caught by
+            // checkForvalidScale
+            throw new SqlException(agent_.logWriter_, ae.getMessage());
         }
         setObject(parameterIndex, x);
     }

Modified: 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk15/prepStmt.out
URL: 
http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk15/prepStmt.out?rev=167863&r1=167862&r2=167863&view=diff
==============================================================================
--- 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk15/prepStmt.out
 (original)
+++ 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNet/jdk15/prepStmt.out
 Mon May  2 22:35:28 2005
@@ -58,8 +58,30 @@
 Prepared Statement String: update Numeric_Tab set NULL_VAL=?
 Select NULL_VAL from Numeric_Tab
 Returned BigDecimal Value after Updation: 1E-15
-Value returned from ctssql.stmt: 1E-15
+Value returned from stmt: 1E-15
 setObject Method sets the designated parameter with the Object
 Negative test setString with Invalid Timestamp:20
 SQLState: 22007 message: The syntax of the string representation of a datetime 
value is incorrect.
+CREATE TABLE doubletab (d1 DOUBLE , d2 DOUBLE)
+INSERT INTO doubletab VALUES(1.0E-130,1.0E125)
+testBigDecimalToDoubleConversion().
+ Check that values are preserved when BigDecimal 
+ values which have more than 31 digits are converted 
+ to Double with setObject
+SELECT d1, d2 FROM doubletab
+rs.getString(1)=1.0E-130
+rs.getString(2)=1.0E+125
+conn.prepareStatement(UPDATE doubletab SET d1 = ?, d2 = ?)
+ps.setObject(1,1.0E-130,java.sql.Types.DOUBLE)
+ps.setObject(2,1.0E+125,java.sql.Types.DOUBLE)
+SELECT d1, d2 FROM doubletab
+values should match
+new d1:1.0E-130 old d1:1.0E-130
+new d2:1.0E125 old d2:1.0E125
+testBigDecimalSetObjectWithScale(). 
+Pass scale parameter of setObject
+CREATE TABLE numtab (num NUMERIC(10,6))
+conn.prepareStatement(INSERT INTO  numtab VALUES(?))
+ps.setObject(1,2.33333333,java.sql.Types.DECIMAL,2)
+num is:2.330000
 prepStmt Test Ends

Modified: 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk15/prepStmt.out
URL: 
http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk15/prepStmt.out?rev=167863&r1=167862&r2=167863&view=diff
==============================================================================
--- 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk15/prepStmt.out
 (original)
+++ 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk15/prepStmt.out
 Mon May  2 22:35:28 2005
@@ -58,8 +58,30 @@
 Prepared Statement String: update Numeric_Tab set NULL_VAL=?
 Select NULL_VAL from Numeric_Tab
 Returned BigDecimal Value after Updation: 1E-15
-Value returned from ctssql.stmt: 1E-15
+Value returned from stmt: 1E-15
 setObject Method sets the designated parameter with the Object
 Negative test setString with Invalid Timestamp:20
 SQLState: 22007 message: The syntax of the string representation of a datetime 
value is incorrect.
+CREATE TABLE doubletab (d1 DOUBLE , d2 DOUBLE)
+INSERT INTO doubletab VALUES(1.0E-130,1.0E125)
+testBigDecimalToDoubleConversion().
+ Check that values are preserved when BigDecimal 
+ values which have more than 31 digits are converted 
+ to Double with setObject
+SELECT d1, d2 FROM doubletab
+rs.getString(1)=1.0E-130
+rs.getString(2)=1.0E+125
+conn.prepareStatement(UPDATE doubletab SET d1 = ?, d2 = ?)
+ps.setObject(1,1.0E-130,java.sql.Types.DOUBLE)
+ps.setObject(2,1.0E+125,java.sql.Types.DOUBLE)
+SELECT d1, d2 FROM doubletab
+values should match
+new d1:1.0E-130 old d1:1.0E-130
+new d2:1.0E125 old d2:1.0E125
+testBigDecimalSetObjectWithScale(). 
+Pass scale parameter of setObject
+CREATE TABLE numtab (num NUMERIC(10,6))
+conn.prepareStatement(INSERT INTO  numtab VALUES(?))
+ps.setObject(1,2.33333333,java.sql.Types.DECIMAL,2)
+num is:2.330000
 prepStmt Test Ends

Modified: 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/prepStmt.out
URL: 
http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/prepStmt.out?rev=167863&r1=167862&r2=167863&view=diff
==============================================================================
--- 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/prepStmt.out
 (original)
+++ 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/prepStmt.out
 Mon May  2 22:35:28 2005
@@ -58,8 +58,30 @@
 Prepared Statement String: update Numeric_Tab set NULL_VAL=?
 Select NULL_VAL from Numeric_Tab
 Returned BigDecimal Value after Updation: 0.000000000000001
-Value returned from ctssql.stmt: 0.000000000000001
+Value returned from stmt: 0.000000000000001
 setObject Method sets the designated parameter with the Object
 Negative test setString with Invalid Timestamp:20
 SQLState: 22007 message: The syntax of the string representation of a datetime 
value is incorrect.
+CREATE TABLE doubletab (d1 DOUBLE , d2 DOUBLE)
+INSERT INTO doubletab VALUES(1.0E-130,1.0E125)
+testBigDecimalToDoubleConversion().
+ Check that values are preserved when BigDecimal 
+ values which have more than 31 digits are converted 
+ to Double with setObject
+SELECT d1, d2 FROM doubletab
+rs.getString(1)=0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010
+rs.getString(2)=100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+conn.prepareStatement(UPDATE doubletab SET d1 = ?, d2 = ?)
+ps.setObject(1,0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010,java.sql.Types.DOUBLE)
+ps.setObject(2,100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000,java.sql.Types.DOUBLE)
+SELECT d1, d2 FROM doubletab
+values should match
+new d1:1.0E-130 old d1:1.0E-130
+new d2:1.0E125 old d2:1.0E125
+testBigDecimalSetObjectWithScale(). 
+Pass scale parameter of setObject
+CREATE TABLE numtab (num NUMERIC(10,6))
+conn.prepareStatement(INSERT INTO  numtab VALUES(?))
+ps.setObject(1,2.33333333,java.sql.Types.DECIMAL,2)
+num is:2.330000
 prepStmt Test Ends

Modified: 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/prepStmt.java
URL: 
http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/prepStmt.java?rev=167863&r1=167862&r2=167863&view=diff
==============================================================================
--- 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/prepStmt.java
 (original)
+++ 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/derbynet/prepStmt.java
 Mon May  2 22:35:28 2005
@@ -296,7 +296,8 @@
                        test4975(conn);
                        test5130(conn);
                        test5172(conn);
-
+                       testBigDecimalSetObject(conn);
+                       testBigDecimalSetObjectWithScale(conn);
                        conn.close();
                        System.out.println("prepStmt Test Ends");
         }
@@ -414,7 +415,7 @@
 
                        rBigDecimalVal = (BigDecimal) rs.getObject(1);
                        logMsg("Returned BigDecimal Value after Updation: " + 
rBigDecimalVal);
-                       logMsg("Value returned from ctssql.stmt: " + 
minBigDecimalVal);
+                       logMsg("Value returned from stmt: " + minBigDecimalVal);
 
                        if(rBigDecimalVal.compareTo(minBigDecimalVal) == 0)
                        {
@@ -528,6 +529,127 @@
                ps.close();
    
        }
+       private static void testBigDecimalSetObject(Connection conn) throws 
SQLException
+       {
+               setupTestBigDecimalTabs(conn);
+               testBigDecimalToDoubleConversion(conn);
+       }
+
+
+
+       private static void setupTestBigDecimalTabs(Connection conn) throws 
SQLException
+       {
+               String sql;
+               Statement stmt = conn.createStatement();
+               try {
+                       stmt.executeUpdate("DROP TABLE doubletab");
+               }
+               catch (SQLException se)
+               {
+                       //System.out.println("Table doubletab not dropped. " + 
se.getMessage());
+
+               }
+
+               sql = "CREATE TABLE doubletab (d1 DOUBLE , d2 DOUBLE)";
+
+               System.out.println(sql);
+               stmt.executeUpdate(sql);
+
+
+               // Insert little and big values
+               sql = "INSERT INTO doubletab VALUES(1.0E-130,1.0E125)";
+               System.out.println(sql);
+               stmt.executeUpdate(sql);
+               conn.commit();
+               
+       }
+
+       private static void testBigDecimalToDoubleConversion(Connection conn) 
throws SQLException
+       {
+               System.out.println("\n\ntestBigDecimalToDoubleConversion().");
+               System.out.println(" Check that values are preserved when 
BigDecimal \n values which have more than 31 digits are converted \n to Double 
with setObject");              
+               Statement stmt = conn.createStatement();
+               String sql ="SELECT d1, d2 FROM doubletab";             
+               System.out.println(sql);
+               ResultSet rs = stmt.executeQuery(sql);
+               rs.next();
+               String d1String = rs.getString(1);
+               String d2String = rs.getString(2);
+               // make BigDecimals from the Strings
+               BigDecimal bd1FromString = new BigDecimal(d1String);
+               BigDecimal bd2FromString = new BigDecimal(d2String);
+               System.out.println("rs.getString(1)=" + bd1FromString);
+               System.out.println("rs.getString(2)=" + bd2FromString);
+               // prepare a statement which updates the values in the table
+               sql = "UPDATE doubletab SET d1 = ?, d2 = ?";
+               System.out.println("conn.prepareStatement(" + sql + ")");
+               PreparedStatement ps =  conn.prepareStatement(sql);
+               ps = conn.prepareStatement(sql);
+               // setObject using the BigDecimal values
+               System.out.println("ps.setObject(1," + bd1FromString + 
",java.sql.Types.DOUBLE)");
+               System.out.println("ps.setObject(2," + bd2FromString + 
",java.sql.Types.DOUBLE)");
+               ps.setObject(1,bd1FromString,java.sql.Types.DOUBLE);
+               ps.setObject(2,bd2FromString,java.sql.Types.DOUBLE);
+               ps.executeUpdate();
+               // check that the values did not change
+               sql = "SELECT d1, d2 FROM doubletab";
+               System.out.println(sql);
+               rs = stmt.executeQuery(sql);
+               rs.next();
+               System.out.println("values should match");
+               System.out.println("new d1:" + rs.getObject(1).toString() +
+                                                  " old d1:"  +  d1String);
+               System.out.println("new d2:" + rs.getObject(2).toString() +
+                                                  " old d2:"  +  d2String);
+               
+               rs.close();
+               ps.close();
+               stmt.close();
+               conn.commit();
+       }
+
+       static void testBigDecimalSetObjectWithScale(Connection conn) throws 
Exception
+       {
+               Statement stmt = conn.createStatement();
+               String sql = null;
+
+               System.out.println("\n\ntestBigDecimalSetObjectWithScale(). 
\nPass scale parameter of setObject");              
+
+               try {
+                       stmt.executeUpdate("DROP TABLE numtab");
+               }
+               catch (SQLException se)
+               {
+                       //System.out.println("Table numtab not dropped. " + 
se.getMessage());
+               }
+               sql = "CREATE TABLE numtab (num NUMERIC(10,6))";
+               System.out.println(sql);
+               stmt.executeUpdate(sql);
+               
+               // make a big decimal from string
+               BigDecimal bdFromString = new BigDecimal("2.33333333");
+               
+               // prepare a statement which updates the third column of the 
table with
+               // the DOUBLE columns
+               sql =  "INSERT INTO  numtab VALUES(?)";
+               System.out.println("conn.prepareStatement(" + sql + ")");
+               PreparedStatement ps =  conn.prepareStatement(sql);
+               // setObject using the big decimal value
+               System.out.println("ps.setObject(1," + bdFromString + 
",java.sql.Types.DECIMAL,2)");
+               ps.setObject(1,bdFromString,java.sql.Types.DECIMAL,2);
+               ps.executeUpdate();
+               // check the value
+               sql = "SELECT num FROM numtab";
+               ResultSet rs = stmt.executeQuery(sql);
+               rs.next();
+               System.out.println("num is:" + rs.getObject(1).toString());
+               
+               rs.close();
+               ps.close();
+               stmt.close();
+
+               conn.commit();
+       }
 
        private static String bytesToString(byte[] ba)
        {
@@ -539,4 +661,7 @@
                        s += (Integer.toHexString(ba[i] & 0x00ff));
                return s;
        }
+
+       
 }
+

Modified: 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/testRelative.java
URL: 
http://svn.apache.org/viewcvs/incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/testRelative.java?rev=167863&r1=167862&r2=167863&view=diff
==============================================================================
--- 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/testRelative.java
 (original)
+++ 
incubator/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/testRelative.java
 Mon May  2 22:35:28 2005
@@ -8,32 +8,34 @@
 
 public class testRelative {
    
-   static final String EXPECTED_SQL_STATE = "24000";
-   static Connection con;
-   static ResultSet rs;
-   static PreparedStatement stmt = null;
-   static PreparedStatement pStmt = null;
-   static Statement stmt1 = null;
-   static String returnValue = null;
-
+   static final String NO_CURRENT_ROW_SQL_STATE = "24000";
+  
    public static void main(String[] args) {
-        test1(args);        
+          System.out.println("Test testRelative starting");
+          Connection con = null;
+          try {
+                  // use the ij utility to read the property file and
+                  // make the initial connection.
+                  ij.getPropertyArg(args);
+                  con = ij.startJBMS();
+                  test1(con);        
+          } catch (Exception e)
+          {
+                  unexpectedException(e);
+          }
     }
     
-    public static void test1(String []args) {   
-                System.out.println("Test testRelative starting");
-
-                try
-                {
-                        // use the ij utility to read the property file and
-                        // make the initial connection.
-                        ij.getPropertyArg(args);
-                        con = ij.startJBMS();
-                                       
-                       con.setAutoCommit(false);                               
                              
-                        
-                        stmt = con.prepareStatement("create table 
testRelative(name varchar(10), i int)");
-                       stmt.executeUpdate();
+    public static void test1(Connection con) {
+               ResultSet rs = null;
+               PreparedStatement pStmt = null;
+               Statement stmt1 = null;
+               String returnValue = null;
+               
+               try
+               {
+                       con.setAutoCommit(false);
+                       pStmt = con.prepareStatement("create table 
testRelative(name varchar(10), i int)");
+                       pStmt.executeUpdate();
                        con.commit();
                        
                        pStmt = con.prepareStatement("insert into testRelative 
values (?,?)");
@@ -89,7 +91,7 @@
                        System.out.println("Value="+returnValue);
 
                } catch(SQLException sqle) {
-                  dumpSQLExceptions(sqle);
+                  expectedException(sqle, NO_CURRENT_ROW_SQL_STATE);
                } catch(Throwable e) {
                   System.out.println("FAIL -- unexpected exception: 
"+e.getMessage());
                    e.printStackTrace(System.out);
@@ -98,28 +100,42 @@
       }
      
       /**
-        * This is to print the expected Exception's details. We are here 
because we got an Exception
-        * when we expected one, but checking to see that we got the right one.
-        **/
-      static private void dumpSQLExceptions (SQLException se) {
-           if( se.getSQLState() != null && 
(se.getSQLState().equals(EXPECTED_SQL_STATE))) { 
+          *  Print the expected Exception's details if the SQLException 
SQLState
+          * matches the expected SQLState. Otherwise fail
+          *
+          * @param se  SQLException that was thrown by the test
+          * @param expectedSQLState  The SQLState that we expect. 
+          *
+          **/
+       static private void expectedException (SQLException se, String 
expectedSQLState) {
+           if( se.getSQLState() != null && 
(se.getSQLState().equals(expectedSQLState))) { 
                 System.out.println("PASS -- expected exception");
                 while (se != null) {
                     System.out.println("SQLSTATE("+se.getSQLState()+"): 
"+se.getMessage());
                     se = se.getNextException();
                 }
             } else {
-               System.out.println("FAIL--Unexpected SQLException: 
"+se.getMessage());
+               System.out.println("FAIL--Unexpected SQLException: " +
+                                                          "SQLSTATE(" 
+se.getSQLState() + ")" +
+                                                          se.getMessage());
                se.printStackTrace(System.out);
            }
-        }
+       }
 
      /**
        * We are here because we got an exception when did not expect one.
        * Hence printing the message and stack trace here.
        **/
      static private void unexpectedSQLException(SQLException se) {
-        System.out.println("FAIL -- Unexpected Exception: "+ se.getMessage());
+        System.out.println("FAIL -- Unexpected Exception: "+ 
+                                               "SQLSTATE(" +se.getSQLState() 
+")" +
+                                               se.getMessage());
         se.printStackTrace(System.out);
      }
+
+       static private void unexpectedException(Exception e) {
+               System.out.println("FAIL -- Unexpected Exception: "+ 
+                                                  e.getMessage());
+       }
+       
 }


Reply via email to