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/regression/StatementRegressionTest.java
Log:
Fixed BUG#11798 - Pstmt.setObject(...., Types.BOOLEAN) throws exception.
Modified: branches/branch_3_1/connector-j/CHANGES
===================================================================
--- branches/branch_3_1/connector-j/CHANGES 2005-08-02 18:10:21 UTC (rev 4011)
+++ branches/branch_3_1/connector-j/CHANGES 2005-08-02 19:03:03 UTC (rev 4012)
@@ -41,6 +41,8 @@
multibyte character encodings and a length in _characters_ is
specified.
+ - Fixed BUG#11798 - Pstmt.setObject(...., Types.BOOLEAN) throws exception.
+
06-23-05 - Version 3.1.10-stable
- Fixed connecting without a database specified raised an exception
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 2005-08-02
18:10:21 UTC (rev 4011)
+++ branches/branch_3_1/connector-j/src/com/mysql/jdbc/PreparedStatement.java 2005-08-02
19:03:03 UTC (rev 4012)
@@ -24,8 +24,6 @@
*/
package com.mysql.jdbc;
-import com.mysql.jdbc.profiler.ProfilerEvent;
-
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -34,11 +32,8 @@
import java.io.Reader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
-
import java.math.BigDecimal;
-
import java.net.URL;
-
import java.sql.Array;
import java.sql.Clob;
import java.sql.ParameterMetaData;
@@ -47,15 +42,15 @@
import java.sql.Time;
import java.sql.Timestamp;
import java.sql.Types;
-
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
-
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;
+import com.mysql.jdbc.profiler.ProfilerEvent;
+
/**
* A SQL Statement is pre-compiled and stored in a PreparedStatement object.
* This object can then be used to efficiently execute this statement multiple
@@ -376,6 +371,8 @@
/** The number of parameters in this PreparedStatement */
protected int parameterCount;
+ protected MysqlParameterMetadata parameterMetaData;
+
private InputStream[] parameterStreams = null;
private byte[][] parameterValues = null;
@@ -394,8 +391,6 @@
private SimpleDateFormat tsdf = null;
- protected MysqlParameterMetadata parameterMetaData;
-
/**
* Are we using a version of MySQL where we can use 'true' boolean values?
*/
@@ -2335,6 +2330,127 @@
setNull(parameterIndex, sqlType);
}
+ private void setNumericObject(int parameterIndex, Object parameterObj, int
targetSqlType, int scale) throws SQLException {
+ Number parameterAsNum;
+
+ if (parameterObj instanceof Boolean) {
+ parameterAsNum = ((Boolean) parameterObj)
+ .booleanValue() ? new Integer(1) : new Integer(
+ 0);
+ } else if (parameterObj instanceof String) {
+ switch (targetSqlType) {
+ case Types.BIT:
+ boolean parameterAsBoolean = "true"
+ .equalsIgnoreCase((String) parameterObj);
+
+ parameterAsNum = parameterAsBoolean ? new Integer(1)
+ : new Integer(0);
+
+ break;
+
+ case Types.TINYINT:
+ case Types.SMALLINT:
+ case Types.INTEGER:
+ parameterAsNum = Integer
+ .valueOf((String) parameterObj);
+
+ break;
+
+ case Types.BIGINT:
+ parameterAsNum = Long
+ .valueOf((String) parameterObj);
+
+ break;
+
+ case Types.REAL:
+ parameterAsNum = Float
+ .valueOf((String) parameterObj);
+
+ break;
+
+ case Types.FLOAT:
+ case Types.DOUBLE:
+ parameterAsNum = Double
+ .valueOf((String) parameterObj);
+
+ break;
+
+ case Types.DECIMAL:
+ case Types.NUMERIC:
+ default:
+ parameterAsNum = new java.math.BigDecimal(
+ (String) parameterObj);
+ }
+ } else {
+ parameterAsNum = (Number) parameterObj;
+ }
+
+ switch (targetSqlType) {
+ case Types.BIT:
+ case Types.TINYINT:
+ case Types.SMALLINT:
+ case Types.INTEGER:
+ setInt(parameterIndex, parameterAsNum.intValue());
+
+ break;
+
+ case Types.BIGINT:
+ setLong(parameterIndex, parameterAsNum.longValue());
+
+ break;
+
+ case Types.REAL:
+ setFloat(parameterIndex, parameterAsNum.floatValue());
+
+ break;
+
+ case Types.FLOAT:
+ case Types.DOUBLE:
+ setDouble(parameterIndex, parameterAsNum.doubleValue());
+
+ break;
+
+ case Types.DECIMAL:
+ case Types.NUMERIC:
+
+ if (parameterAsNum instanceof java.math.BigDecimal) {
+ BigDecimal scaledBigDecimal = null;
+
+ try {
+ scaledBigDecimal = ((java.math.BigDecimal) parameterAsNum)
+ .setScale(scale);
+ } catch (ArithmeticException ex) {
+ try {
+ scaledBigDecimal = ((java.math.BigDecimal) parameterAsNum)
+ .setScale(scale,
+ BigDecimal.ROUND_HALF_UP);
+ } catch (ArithmeticException arEx) {
+ throw new SQLException(
+ "Can't set scale of '"
+ + scale
+ + "' for DECIMAL argument '"
+ + parameterAsNum + "'",
+ SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
+ }
+ }
+
+ setBigDecimal(parameterIndex, scaledBigDecimal);
+ } else if (parameterAsNum instanceof java.math.BigInteger) {
+ setBigDecimal(
+ parameterIndex,
+ new java.math.BigDecimal(
+ (java.math.BigInteger) parameterAsNum,
+ scale));
+ } else {
+ setBigDecimal(parameterIndex,
+ new java.math.BigDecimal(parameterAsNum
+ .doubleValue()));
+ }
+
+ break;
+ }
+ }
+
/**
* DOCUMENT ME!
*
@@ -2447,6 +2563,46 @@
} else {
try {
switch (targetSqlType) {
+ case Types.BOOLEAN:
+ /*
+ From Table-B5 in the JDBC-3.0 Spec
+
+ T S I B R F D D N B B C V L
+ I M N I E L O E U I O H A O
+ N A T G A O U C M T O A R N
+ Y L E I L A B I E L R C G
+ I L G N T L M R E H V
+ N I E T E A I A A A
+ T N R L C N R R
+ T C
+ H
+ A
+ R
+ -----------------------------------
+ Boolean x x x x x x x x x x x x x x
+ */
+
+ if (parameterObj instanceof Boolean) {
+ setBoolean(parameterIndex, ((Boolean)parameterObj).booleanValue());
+
+ break;
+ } else if (parameterObj instanceof String) {
+ setBoolean(parameterIndex, "true".equalsIgnoreCase((String)parameterObj) ||
+ !"0".equalsIgnoreCase((String)parameterObj));
+
+ break;
+ } else if (parameterObj instanceof Number) {
+ int intValue = ((Number)parameterObj).intValue();
+
+ setBoolean(parameterIndex, intValue != 0);
+
+ break;
+ } else {
+ throw new SQLException("No conversion from " + parameterObj.getClass().getName() +
+ " to Types.BOOLEAN possible.", SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
+ }
+
+
case Types.BIT:
case Types.TINYINT:
case Types.SMALLINT:
@@ -2458,125 +2614,8 @@
case Types.DECIMAL:
case Types.NUMERIC:
- Number parameterAsNum;
+ setNumericObject(parameterIndex, parameterObj, targetSqlType, scale);
- if (parameterObj instanceof Boolean) {
- parameterAsNum = ((Boolean) parameterObj)
- .booleanValue() ? new Integer(1) : new Integer(
- 0);
- } else if (parameterObj instanceof String) {
- switch (targetSqlType) {
- case Types.BIT:
- boolean parameterAsBoolean = "true"
- .equalsIgnoreCase((String) parameterObj);
-
- parameterAsNum = parameterAsBoolean ? new Integer(1)
- : new Integer(0);
-
- break;
-
- case Types.TINYINT:
- case Types.SMALLINT:
- case Types.INTEGER:
- parameterAsNum = Integer
- .valueOf((String) parameterObj);
-
- break;
-
- case Types.BIGINT:
- parameterAsNum = Long
- .valueOf((String) parameterObj);
-
- break;
-
- case Types.REAL:
- parameterAsNum = Float
- .valueOf((String) parameterObj);
-
- break;
-
- case Types.FLOAT:
- case Types.DOUBLE:
- parameterAsNum = Double
- .valueOf((String) parameterObj);
-
- break;
-
- case Types.DECIMAL:
- case Types.NUMERIC:
- default:
- parameterAsNum = new java.math.BigDecimal(
- (String) parameterObj);
- }
- } else {
- parameterAsNum = (Number) parameterObj;
- }
-
- switch (targetSqlType) {
- case Types.BIT:
- case Types.TINYINT:
- case Types.SMALLINT:
- case Types.INTEGER:
- setInt(parameterIndex, parameterAsNum.intValue());
-
- break;
-
- case Types.BIGINT:
- setLong(parameterIndex, parameterAsNum.longValue());
-
- break;
-
- case Types.REAL:
- setFloat(parameterIndex, parameterAsNum.floatValue());
-
- break;
-
- case Types.FLOAT:
- case Types.DOUBLE:
- setDouble(parameterIndex, parameterAsNum.doubleValue());
-
- break;
-
- case Types.DECIMAL:
- case Types.NUMERIC:
-
- if (parameterAsNum instanceof java.math.BigDecimal) {
- BigDecimal scaledBigDecimal = null;
-
- try {
- scaledBigDecimal = ((java.math.BigDecimal) parameterAsNum)
- .setScale(scale);
- } catch (ArithmeticException ex) {
- try {
- scaledBigDecimal = ((java.math.BigDecimal) parameterAsNum)
- .setScale(scale,
- BigDecimal.ROUND_HALF_UP);
- } catch (ArithmeticException arEx) {
- throw new SQLException(
- "Can't set scale of '"
- + scale
- + "' for DECIMAL argument '"
- + parameterAsNum + "'",
- SQLError.SQL_STATE_ILLEGAL_ARGUMENT);
- }
- }
-
- setBigDecimal(parameterIndex, scaledBigDecimal);
- } else if (parameterAsNum instanceof java.math.BigInteger) {
- setBigDecimal(
- parameterIndex,
- new java.math.BigDecimal(
- (java.math.BigInteger) parameterAsNum,
- scale));
- } else {
- setBigDecimal(parameterIndex,
- new java.math.BigDecimal(parameterAsNum
- .doubleValue()));
- }
-
- break;
- }
-
break;
case Types.CHAR:
Modified:
branches/branch_3_1/connector-j/src/testsuite/regression/StatementRegressionTest.java
===================================================================
---
branches/branch_3_1/connector-j/src/testsuite/regression/StatementRegressionTest.java 2005-08-02
18:10:21 UTC (rev 4011)
+++
branches/branch_3_1/connector-j/src/testsuite/regression/StatementRegressionTest.java 2005-08-02
19:03:03 UTC (rev 4012)
@@ -2592,6 +2592,27 @@
}
}
+
+ /**
+ * Tests fix for BUG#11798 - Pstmt.setObject(...., Types.BOOLEAN)
+ * throws exception.
+ *
+ * @throws Exception if the test fails.
+ */
+ public void testBug11798() throws Exception {
+ try {
+ this.pstmt = this.conn.prepareStatement("SELECT ?");
+ this.pstmt.setObject(1, Boolean.TRUE, Types.BOOLEAN);
+ this.pstmt.setObject(1, new BigDecimal(1), Types.BOOLEAN);
+ this.pstmt.setObject(1, "true", Types.BOOLEAN);
+ } finally {
+ if (this.pstmt != null) {
+ this.pstmt.close();
+ this.pstmt = null;
+ }
+ }
+ }
+
public void testBug11540() throws Exception {
Locale originalLocale = Locale.getDefault();
Connection thaiConn = null;
| Thread |
|---|
| • Connector/J commit: r4012 - in branches/branch_3_1/connector-j: . src/com/mysql/jdbc src/testsuite/regression | mmatthews | 2 Aug |