From: Date: May 9 2006 5:50pm Subject: Connector/J commit: r5247 - in branches/branch_3_1/connector-j: . src/com/mysql/jdbc src/testsuite src/testsuite/regression List-Archive: http://lists.mysql.com/commits/6158 X-Bug: 19615 Message-Id: <200605091550.k49Focmt017421@bk-internal.mysql.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified: branches/branch_3_1/connector-j/CHANGES branches/branch_3_1/connector-j/src/com/mysql/jdbc/PreparedStatement.java branches/branch_3_1/connector-j/src/testsuite/BaseTestCase.java branches/branch_3_1/connector-j/src/testsuite/regression/StatementRegressionTest.java Log: Fix for BUG#19615, PreparedStatement.setObject(int, Object, int) doesn't respect scale of BigDecimals. Modified: branches/branch_3_1/connector-j/CHANGES =================================================================== --- branches/branch_3_1/connector-j/CHANGES 2006-05-09 00:02:37 UTC (rev 5246) +++ branches/branch_3_1/connector-j/CHANGES 2006-05-09 15:50:33 UTC (rev 5247) @@ -1,7 +1,7 @@ # Changelog # $Id$ -xx-xx-05 - Version 3.1.13 +05-04-05 - Version 3.1.13 - Fixed BUG#15464 - INOUT parameter does not store IN value. @@ -105,7 +105,10 @@ - Driver now aware of fix for BIT type metadata that went into MySQL-5.0.21 for server not reporting length consistently (bug number 13601). - + + - Fixed BUG#19615, PreparedStatement.setObject(int, Object, int) + doesn't respect scale of BigDecimals. + - Fixed BUG#19282 - ResultSet.wasNull() returns incorrect value when extracting native string from server-side prepared statement generated result set. Modified: branches/branch_3_1/connector-j/src/com/mysql/jdbc/PreparedStatement.java =================================================================== --- branches/branch_3_1/connector-j/src/com/mysql/jdbc/PreparedStatement.java 2006-05-09 00:02:37 UTC (rev 5246) +++ branches/branch_3_1/connector-j/src/com/mysql/jdbc/PreparedStatement.java 2006-05-09 15:50:33 UTC (rev 5247) @@ -2744,7 +2744,12 @@ */ public void setObject(int parameterIndex, Object parameterObj, int targetSqlType) throws SQLException { - setObject(parameterIndex, parameterObj, targetSqlType, 0); + if (!(parameterObj instanceof BigDecimal)) { + setObject(parameterIndex, parameterObj, targetSqlType, 0); + } else { + setObject(parameterIndex, parameterObj, targetSqlType, + ((BigDecimal)parameterObj).scale()); + } } /** Modified: branches/branch_3_1/connector-j/src/testsuite/BaseTestCase.java =================================================================== --- branches/branch_3_1/connector-j/src/testsuite/BaseTestCase.java 2006-05-09 00:02:37 UTC (rev 5246) +++ branches/branch_3_1/connector-j/src/testsuite/BaseTestCase.java 2006-05-09 15:50:33 UTC (rev 5247) @@ -519,4 +519,28 @@ return false; } } + + protected void closeMemberJDBCResources() { + if (this.rs != null) { + ResultSet toClose = this.rs; + this.rs = null; + + try { + toClose.close(); + } catch (SQLException sqlEx) { + // ignore + } + } + + if (this.pstmt != null) { + PreparedStatement toClose = this.pstmt; + this.pstmt = null; + + try { + toClose.close(); + } catch (SQLException sqlEx) { + // ignore + } + } + } } Modified: branches/branch_3_1/connector-j/src/testsuite/regression/StatementRegressionTest.java =================================================================== --- branches/branch_3_1/connector-j/src/testsuite/regression/StatementRegressionTest.java 2006-05-09 00:02:37 UTC (rev 5246) +++ branches/branch_3_1/connector-j/src/testsuite/regression/StatementRegressionTest.java 2006-05-09 15:50:33 UTC (rev 5247) @@ -3112,4 +3112,44 @@ assertEquals("01000", sqlWarn.getNextWarning().getSQLState()); } } + + /** + * Tests fix for BUG#19615, PreparedStatement.setObject(int, Object, int) + * doesn't respect scale of BigDecimals. + * + * @throws Exception if the test fails. + */ + public void testBug19615() throws Exception { + createTable("testBug19615", "(field1 DECIMAL(19, 12))"); + + try { + BigDecimal dec = new BigDecimal("1.234567"); + + this.pstmt = this.conn.prepareStatement("INSERT INTO testBug19615 VALUES (?)"); + this.pstmt.setObject(1, dec, Types.DECIMAL); + this.pstmt.executeUpdate(); + this.pstmt.close(); + + + this.rs = this.stmt.executeQuery("SELECT field1 FROM testBug19615"); + this.rs.next(); + assertEquals(dec, this.rs.getBigDecimal(1).setScale(6)); + this.rs.close(); + this.stmt.executeUpdate("TRUNCATE TABLE testBug19615"); + + this.pstmt = ((com.mysql.jdbc.Connection)this.conn).clientPrepareStatement("INSERT INTO testBug19615 VALUES (?)"); + this.pstmt.setObject(1, dec, Types.DECIMAL); + this.pstmt.executeUpdate(); + this.pstmt.close(); + + + this.rs = this.stmt.executeQuery("SELECT field1 FROM testBug19615"); + this.rs.next(); + assertEquals(dec, this.rs.getBigDecimal(1).setScale(6)); + this.rs.close(); + } finally { + closeMemberJDBCResources(); + } + + } }