For embedded,

public void *setObject*(int parameterIndex,
                     Object 
<http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html> x,
                     int targetSqlType)


and

public void *setObject*(int parameterIndex,
                     Object 
<http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html> x,
                     int targetSqlType,
                     int scale)
With a scale specified as zero

do not adjust the scale when the value is inserted into a double or real column. Client will truncate the fractional digits. I think this is a bug in embedded, but am not totally sure, so thought I would verify on the list before filing a bug. Below is a program to test and the output with embedded and client.

Thanks for confirming whether embedded or client is showing the correct behavior.

Thanks

Kathey



Embedded
       PASS: got expected value:123.00
       FAIL:expected:123 but got:123.45
       FAIL:expected:123 but got:123.45
       PASS: got expected value:123
       PASS: got expected value:123.00
       FAIL:expected:123 but got:123.45
       FAIL:expected:123 but got:123.45
       PASS: got expected value:123
client
       PASS: got expected value:123.00
       PASS: got expected value:123.0
       PASS: got expected value:123.0
       PASS: got expected value:123
       PASS: got expected value:123.00
       PASS: got expected value:123.0
       PASS: got expected value:123.0
       PASS: got expected value:123


import java.sql.*;
import java.math.BigDecimal;

public class ZeroScaleTest {

   public static void main(String[] args) throws Exception {
   System.out.println("Embedded");
   Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection conn = DriverManager.getConnection("jdbc:derby:wombat;create=true");
   testZeroScale(conn);
System.out.println("client");
   Class.forName("org.apache.derby.jdbc.ClientDriver");
conn = DriverManager.getConnection("jdbc:derby://localhost:1527/wombatns;create=true");
   testZeroScale(conn);
   }

   private static void testZeroScale(Connection conn) throws SQLException{
   Statement s = conn.createStatement();
s.executeUpdate("CREATE TABLE TAB (dc DECIMAL(10,2), db double, r real, i int)"); PreparedStatement ps = conn.prepareStatement("INSERT INTO TAB VALUES(?,?,?,?)");
       BigDecimal value = new BigDecimal("123.45");

       // Test with setObject and scale of 0
       ps.setObject(1, value,java.sql.Types.DECIMAL,0);
       ps.setObject(2, value,java.sql.Types.DECIMAL,0);
       ps.setObject(3, value,java.sql.Types.DECIMAL,0);
       ps.setObject(4, value,java.sql.Types.DECIMAL,0);
       ps.executeUpdate();
// Test with setObject and type with no scale.
       // should default to scale 0
       ps.setObject(1, value,java.sql.Types.DECIMAL);
       ps.setObject(2, value,java.sql.Types.DECIMAL);
       ps.setObject(3, value,java.sql.Types.DECIMAL);
       ps.setObject(4, value,java.sql.Types.DECIMAL);
       ps.executeUpdate();
// We expect the scale to be adjusted
   ResultSet rs = s.executeQuery("SELECT * FROM DERBY_2073_TAB");
   BigDecimal expectedValue = new BigDecimal("123");
   rs.next();
   assertCompares(expectedValue, rs.getBigDecimal(1));
   assertCompares(expectedValue, rs.getBigDecimal(2));
   assertCompares(expectedValue, rs.getBigDecimal(3));
   assertCompares(expectedValue, rs.getBigDecimal(4));
   rs.next();
   assertCompares(expectedValue, rs.getBigDecimal(1));
   assertCompares(expectedValue, rs.getBigDecimal(2));
   assertCompares(expectedValue, rs.getBigDecimal(3));
   assertCompares(expectedValue, rs.getBigDecimal(4));
   s.executeUpdate("DROP TABLE TAB");
   }


private static void assertCompares(BigDecimal expectedValue,BigDecimal value)
   {
   if (expectedValue.compareTo(value)== 0)
       System.out.println("\tPASS: got expected value:" + value);
   else
System.out.println("\tFAIL:expected:" + expectedValue + " but got:" + value);
   }
}


Reply via email to