List:Internals« Previous MessageNext Message »
From:mmatthews Date:August 2 2005 9:03pm
Subject:Connector/J commit: r4012 - in branches/branch_3_1/connector-j: . src/com/mysql/jdbc src/testsuite/regression
View as plain text  
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/regressionmmatthews2 Aug