List:Commits« Previous MessageNext Message »
From:mmatthews Date:March 26 2007 6:09pm
Subject:Connector/J commit: r6370 - branches/branch_5_0/connector-j branches/branch_5_0/connector-j/src/com/mysql/jdbc branches/branch_5_0/connector-j/src/tes...
View as plain text  
Modified:
   branches/branch_5_0/connector-j/CHANGES
   branches/branch_5_0/connector-j/src/com/mysql/jdbc/CallableStatement.java
  
branches/branch_5_0/connector-j/src/testsuite/regression/CallableStatementRegressionTest.java
   trunk/connector-j/CHANGES
   trunk/connector-j/src/com/mysql/jdbc/CallableStatement.java
   trunk/connector-j/src/testsuite/regression/CallableStatementRegressionTest.java
Log:
- Fixed BUG#25715 - CallableStatements with OUT/INOUT parameters that
	  are "binary" (blobs, bits, (var)binary, java_object) have extra 7 bytes 
	  (which happens to be the _binary introducer!)

Refactored all of the if (versionMeetsMinimum(5, 0)) to a single
serverSupportsStoredProcedures() method (so we _could_ disable the stored procedure tests
if we wanted).

Need to eventually refactor _all_ of the tests to use createProcedure() (perhaps in
trunk).

Modified: branches/branch_5_0/connector-j/CHANGES
===================================================================
--- branches/branch_5_0/connector-j/CHANGES	2007-03-26 15:06:20 UTC (rev 6369)
+++ branches/branch_5_0/connector-j/CHANGES	2007-03-26 16:09:00 UTC (rev 6370)
@@ -63,7 +63,11 @@
 	  
 	- Fixed BUG#25328 - BIT(> 1) is returned as java.lang.String from
ResultSet.getObject()
 	  rather than byte[].
-	  	    
+	  
+	- Fixed BUG#25715 - CallableStatements with OUT/INOUT parameters that
+	  are "binary" (blobs, bits, (var)binary, java_object) have extra 7 bytes 
+	  (which happens to be the _binary introducer!)
+	  	  	    
 03-01-07 - Version 5.0.5
 
     - Fixed BUG#23645 - Some collations/character sets reported as "unknown"

Modified: branches/branch_5_0/connector-j/src/com/mysql/jdbc/CallableStatement.java
===================================================================
--- branches/branch_5_0/connector-j/src/com/mysql/jdbc/CallableStatement.java	2007-03-26
15:06:20 UTC (rev 6369)
+++ branches/branch_5_0/connector-j/src/com/mysql/jdbc/CallableStatement.java	2007-03-26
16:09:00 UTC (rev 6370)
@@ -1958,8 +1958,8 @@
 						setPstmt = this.connection
 								.clientPrepareStatement(queryBuf.toString());
 
-						byte[] parameterAsBytes = this
-								.getBytesRepresentation(inParamInfo.index);
+						byte[] parameterAsBytes = getBytesRepresentation(
+								inParamInfo.index);
 
 						if (parameterAsBytes != null) {
 							if (parameterAsBytes.length > 8
@@ -1974,8 +1974,22 @@
 								setPstmt.setBytesNoEscapeNoQuotes(1,
 										parameterAsBytes);
 							} else {
-								setPstmt.setBytesNoEscape(1, parameterAsBytes); // they've already been escaped
by
-																				// the inherited PreparedStatement methods
+								int sqlType = inParamInfo.desiredJdbcType;
+								
+								switch (sqlType) {
+								case Types.BIT:
+								case Types.BINARY: 
+								case Types.BLOB: 
+								case Types.JAVA_OBJECT:
+								case Types.LONGVARBINARY: 
+								case Types.VARBINARY:
+									setPstmt.setBytes(1, parameterAsBytes);
+									break;
+								default:
+									// the inherited PreparedStatement methods
+									// have already escaped and quoted these parameters
+									setPstmt.setBytesNoEscape(1, parameterAsBytes); 
+								}
 							}
 						} else {
 							setPstmt.setNull(1, Types.NULL);

Modified:
branches/branch_5_0/connector-j/src/testsuite/regression/CallableStatementRegressionTest.java
===================================================================
---
branches/branch_5_0/connector-j/src/testsuite/regression/CallableStatementRegressionTest.java	2007-03-26
15:06:20 UTC (rev 6369)
+++
branches/branch_5_0/connector-j/src/testsuite/regression/CallableStatementRegressionTest.java	2007-03-26
16:09:00 UTC (rev 6370)
@@ -1,5 +1,5 @@
 /*
- Copyright (C) 2002-2004 MySQL AB
+ Copyright (C) 2002-2007 MySQL AB
 
  This program is free software; you can redistribute it and/or modify
  it under the terms of version 2 of the GNU General Public License as 
@@ -24,6 +24,9 @@
  */
 package testsuite.regression;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
 import java.sql.CallableStatement;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
@@ -76,20 +79,22 @@
 	 *             if an error occurs.
 	 */
 	public void testBug3539() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			try {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3539");
-				this.stmt.executeUpdate("CREATE PROCEDURE testBug3539()\n"
-						+ "BEGIN\n" + "SELECT 1;" + "end\n");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-				this.rs = this.conn.getMetaData().getProcedures(null, null,
-						"testBug3539");
+		try {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3539");
+			this.stmt.executeUpdate("CREATE PROCEDURE testBug3539()\n"
+					+ "BEGIN\n" + "SELECT 1;" + "end\n");
 
-				assertTrue(this.rs.next());
-				assertTrue("testBug3539".equals(this.rs.getString(3)));
-			} finally {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3539");
-			}
+			this.rs = this.conn.getMetaData().getProcedures(null, null,
+			"testBug3539");
+
+			assertTrue(this.rs.next());
+			assertTrue("testBug3539".equals(this.rs.getString(3)));
+		} finally {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3539");
 		}
 	}
 
@@ -101,28 +106,29 @@
 	 *             if an error occurs.
 	 */
 	public void testBug3540() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			try {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3540");
-				this.stmt
-						.executeUpdate("CREATE PROCEDURE testBug3540(x int, out y int)\n"
-								+ "BEGIN\n" + "SELECT 1;" + "end\n");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
+		try {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3540");
+			this.stmt
+			.executeUpdate("CREATE PROCEDURE testBug3540(x int, out y int)\n"
+					+ "BEGIN\n" + "SELECT 1;" + "end\n");
 
-				this.rs = this.conn.getMetaData().getProcedureColumns(null,
-						null, "testBug3540%", "%");
+			this.rs = this.conn.getMetaData().getProcedureColumns(null,
+					null, "testBug3540%", "%");
 
-				assertTrue(this.rs.next());
-				assertTrue("testBug3540".equals(this.rs.getString(3)));
-				assertTrue("x".equals(this.rs.getString(4)));
+			assertTrue(this.rs.next());
+			assertTrue("testBug3540".equals(this.rs.getString(3)));
+			assertTrue("x".equals(this.rs.getString(4)));
 
-				assertTrue(this.rs.next());
-				assertTrue("testBug3540".equals(this.rs.getString(3)));
-				assertTrue("y".equals(this.rs.getString(4)));
+			assertTrue(this.rs.next());
+			assertTrue("testBug3540".equals(this.rs.getString(3)));
+			assertTrue("y".equals(this.rs.getString(4)));
 
-				assertTrue(!this.rs.next());
-			} finally {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3540");
-			}
+			assertTrue(!this.rs.next());
+		} finally {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3540");
 		}
 	}
 
@@ -134,46 +140,48 @@
 	 *             if the test fails.
 	 */
 	public void testBug7026() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			try {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug7026");
-				this.stmt
-						.executeUpdate("CREATE PROCEDURE testBug7026(x int, out y int)\n"
-								+ "BEGIN\n" + "SELECT 1;" + "end\n");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-				//
-				// Should be found this time.
-				//
-				this.rs = this.conn.getMetaData().getProcedures(
-						this.conn.getCatalog(), null, "testBug7026");
+		try {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug7026");
+			this.stmt
+			.executeUpdate("CREATE PROCEDURE testBug7026(x int, out y int)\n"
+					+ "BEGIN\n" + "SELECT 1;" + "end\n");
 
-				assertTrue(this.rs.next());
-				assertTrue("testBug7026".equals(this.rs.getString(3)));
+			//
+			// Should be found this time.
+			//
+			this.rs = this.conn.getMetaData().getProcedures(
+					this.conn.getCatalog(), null, "testBug7026");
 
-				assertTrue(!this.rs.next());
+			assertTrue(this.rs.next());
+			assertTrue("testBug7026".equals(this.rs.getString(3)));
 
-				//
-				// This time, shouldn't be found, because not associated with
-				// this (bogus) catalog
-				//
-				this.rs = this.conn.getMetaData().getProcedures("abfgerfg",
-						null, "testBug7026");
-				assertTrue(!this.rs.next());
+			assertTrue(!this.rs.next());
 
-				//
-				// Should be found this time as well, as we haven't
-				// specified a catalog.
-				//
-				this.rs = this.conn.getMetaData().getProcedures(null, null,
-						"testBug7026");
+			//
+			// This time, shouldn't be found, because not associated with
+			// this (bogus) catalog
+			//
+			this.rs = this.conn.getMetaData().getProcedures("abfgerfg",
+					null, "testBug7026");
+			assertTrue(!this.rs.next());
 
-				assertTrue(this.rs.next());
-				assertTrue("testBug7026".equals(this.rs.getString(3)));
+			//
+			// Should be found this time as well, as we haven't
+			// specified a catalog.
+			//
+			this.rs = this.conn.getMetaData().getProcedures(null, null,
+			"testBug7026");
 
-				assertTrue(!this.rs.next());
-			} finally {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug7026");
-			}
+			assertTrue(this.rs.next());
+			assertTrue("testBug7026".equals(this.rs.getString(3)));
+
+			assertTrue(!this.rs.next());
+		} finally {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug7026");
 		}
 	}
 
@@ -186,151 +194,154 @@
 	 *             if the test fails
 	 */
 	public void testBug9319() throws Exception {
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
+
 		boolean doASelect = true; // SELECT currently causes the server to
 		// hang on the
 		// last execution of this testcase, filed as BUG#9405
 
-		if (versionMeetsMinimum(5, 0, 2)) {
-			if (isAdminConnectionConfigured()) {
-				Connection db2Connection = null;
-				Connection db1Connection = null;
 
-				try {
-					db2Connection = getAdminConnection();
-					db1Connection = getAdminConnection();
+		if (isAdminConnectionConfigured()) {
+			Connection db2Connection = null;
+			Connection db1Connection = null;
 
-					db2Connection.createStatement().executeUpdate(
-							"CREATE DATABASE IF NOT EXISTS db_9319_2");
-					db2Connection.setCatalog("db_9319_2");
+			try {
+				db2Connection = getAdminConnection();
+				db1Connection = getAdminConnection();
 
-					db2Connection.createStatement().executeUpdate(
-							"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
+				db2Connection.createStatement().executeUpdate(
+						"CREATE DATABASE IF NOT EXISTS db_9319_2");
+				db2Connection.setCatalog("db_9319_2");
 
-					db2Connection
-							.createStatement()
-							.executeUpdate(
-									"CREATE PROCEDURE COMPROVAR_USUARI(IN p_CodiUsuari VARCHAR(10),"
-											+ "\nIN p_contrasenya VARCHAR(10),"
-											+ "\nOUT p_userId INTEGER,"
-											+ "\nOUT p_userName VARCHAR(30),"
-											+ "\nOUT p_administrador VARCHAR(1),"
-											+ "\nOUT p_idioma VARCHAR(2))"
-											+ "\nBEGIN"
+				db2Connection.createStatement().executeUpdate(
+				"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
 
-											+ (doASelect ? "\nselect 2;"
-													: "\nSELECT 2 INTO p_administrador;")
-											+ "\nEND");
+				db2Connection
+				.createStatement()
+				.executeUpdate(
+						"CREATE PROCEDURE COMPROVAR_USUARI(IN p_CodiUsuari VARCHAR(10),"
+						+ "\nIN p_contrasenya VARCHAR(10),"
+						+ "\nOUT p_userId INTEGER,"
+						+ "\nOUT p_userName VARCHAR(30),"
+						+ "\nOUT p_administrador VARCHAR(1),"
+						+ "\nOUT p_idioma VARCHAR(2))"
+						+ "\nBEGIN"
 
-					db1Connection.createStatement().executeUpdate(
-							"CREATE DATABASE IF NOT EXISTS db_9319_1");
-					db1Connection.setCatalog("db_9319_1");
+						+ (doASelect ? "\nselect 2;"
+								: "\nSELECT 2 INTO p_administrador;")
+								+ "\nEND");
 
-					db1Connection.createStatement().executeUpdate(
-							"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
-					db1Connection
-							.createStatement()
-							.executeUpdate(
-									"CREATE PROCEDURE COMPROVAR_USUARI(IN p_CodiUsuari VARCHAR(10),"
-											+ "\nIN p_contrasenya VARCHAR(10),"
-											+ "\nOUT p_userId INTEGER,"
-											+ "\nOUT p_userName VARCHAR(30),"
-											+ "\nOUT p_administrador VARCHAR(1))"
-											+ "\nBEGIN"
-											+ (doASelect ? "\nselect 1;"
-													: "\nSELECT 1 INTO p_administrador;")
-											+ "\nEND");
+				db1Connection.createStatement().executeUpdate(
+				"CREATE DATABASE IF NOT EXISTS db_9319_1");
+				db1Connection.setCatalog("db_9319_1");
 
-					CallableStatement cstmt = db2Connection
-							.prepareCall("{ call COMPROVAR_USUARI(?, ?, ?, ?, ?, ?) }");
-					cstmt.setString(1, "abc");
-					cstmt.setString(2, "def");
-					cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
-					cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
-					cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
+				db1Connection.createStatement().executeUpdate(
+				"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
+				db1Connection
+				.createStatement()
+				.executeUpdate(
+						"CREATE PROCEDURE COMPROVAR_USUARI(IN p_CodiUsuari VARCHAR(10),"
+						+ "\nIN p_contrasenya VARCHAR(10),"
+						+ "\nOUT p_userId INTEGER,"
+						+ "\nOUT p_userName VARCHAR(30),"
+						+ "\nOUT p_administrador VARCHAR(1))"
+						+ "\nBEGIN"
+						+ (doASelect ? "\nselect 1;"
+								: "\nSELECT 1 INTO p_administrador;")
+								+ "\nEND");
 
-					cstmt.registerOutParameter(6, java.sql.Types.VARCHAR);
+				CallableStatement cstmt = db2Connection
+				.prepareCall("{ call COMPROVAR_USUARI(?, ?, ?, ?, ?, ?) }");
+				cstmt.setString(1, "abc");
+				cstmt.setString(2, "def");
+				cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
+				cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
+				cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
 
-					cstmt.execute();
+				cstmt.registerOutParameter(6, java.sql.Types.VARCHAR);
 
-					if (doASelect) {
-						this.rs = cstmt.getResultSet();
-						assertTrue(this.rs.next());
-						assertEquals(2, this.rs.getInt(1));
-					} else {
-						assertEquals(2, cstmt.getInt(5));
-					}
+				cstmt.execute();
 
-					cstmt = db1Connection
-							.prepareCall("{ call COMPROVAR_USUARI(?, ?, ?, ?, ?, ?) }");
-					cstmt.setString(1, "abc");
-					cstmt.setString(2, "def");
-					cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
-					cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
-					cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
+				if (doASelect) {
+					this.rs = cstmt.getResultSet();
+					assertTrue(this.rs.next());
+					assertEquals(2, this.rs.getInt(1));
+				} else {
+					assertEquals(2, cstmt.getInt(5));
+				}
 
-					try {
-						cstmt.registerOutParameter(6, java.sql.Types.VARCHAR);
-						fail("Should've thrown an exception");
-					} catch (SQLException sqlEx) {
-						assertEquals(SQLError.SQL_STATE_ILLEGAL_ARGUMENT, sqlEx
-								.getSQLState());
-					}
+				cstmt = db1Connection
+				.prepareCall("{ call COMPROVAR_USUARI(?, ?, ?, ?, ?, ?) }");
+				cstmt.setString(1, "abc");
+				cstmt.setString(2, "def");
+				cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
+				cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
+				cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
 
-					cstmt = db1Connection
-							.prepareCall("{ call COMPROVAR_USUARI(?, ?, ?, ?, ?) }");
-					cstmt.setString(1, "abc");
-					cstmt.setString(2, "def");
-					cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
-					cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
-					cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
+				try {
+					cstmt.registerOutParameter(6, java.sql.Types.VARCHAR);
+					fail("Should've thrown an exception");
+				} catch (SQLException sqlEx) {
+					assertEquals(SQLError.SQL_STATE_ILLEGAL_ARGUMENT, sqlEx
+							.getSQLState());
+				}
 
-					cstmt.execute();
+				cstmt = db1Connection
+				.prepareCall("{ call COMPROVAR_USUARI(?, ?, ?, ?, ?) }");
+				cstmt.setString(1, "abc");
+				cstmt.setString(2, "def");
+				cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
+				cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
+				cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
 
-					if (doASelect) {
-						this.rs = cstmt.getResultSet();
-						assertTrue(this.rs.next());
-						assertEquals(1, this.rs.getInt(1));
-					} else {
-						assertEquals(1, cstmt.getInt(5));
-					}
+				cstmt.execute();
 
-					String quoteChar = db2Connection.getMetaData()
-							.getIdentifierQuoteString();
+				if (doASelect) {
+					this.rs = cstmt.getResultSet();
+					assertTrue(this.rs.next());
+					assertEquals(1, this.rs.getInt(1));
+				} else {
+					assertEquals(1, cstmt.getInt(5));
+				}
 
-					cstmt = db2Connection.prepareCall("{ call " + quoteChar
-							+ db1Connection.getCatalog() + quoteChar + "."
-							+ quoteChar + "COMPROVAR_USUARI" + quoteChar
-							+ "(?, ?, ?, ?, ?) }");
-					cstmt.setString(1, "abc");
-					cstmt.setString(2, "def");
-					cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
-					cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
-					cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
+				String quoteChar = db2Connection.getMetaData()
+				.getIdentifierQuoteString();
 
-					cstmt.execute();
+				cstmt = db2Connection.prepareCall("{ call " + quoteChar
+						+ db1Connection.getCatalog() + quoteChar + "."
+						+ quoteChar + "COMPROVAR_USUARI" + quoteChar
+						+ "(?, ?, ?, ?, ?) }");
+				cstmt.setString(1, "abc");
+				cstmt.setString(2, "def");
+				cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
+				cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
+				cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
 
-					if (doASelect) {
-						this.rs = cstmt.getResultSet();
-						assertTrue(this.rs.next());
-						assertEquals(1, this.rs.getInt(1));
-					} else {
-						assertEquals(1, cstmt.getInt(5));
-					}
-				} finally {
-					if (db2Connection != null) {
-						db2Connection.createStatement().executeUpdate(
-								"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
-						db2Connection.createStatement().executeUpdate(
-								"DROP DATABASE IF EXISTS db_9319_2");
-					}
+				cstmt.execute();
 
-					if (db1Connection != null) {
-						db1Connection.createStatement().executeUpdate(
-								"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
-						db1Connection.createStatement().executeUpdate(
-								"DROP DATABASE IF EXISTS db_9319_1");
-					}
+				if (doASelect) {
+					this.rs = cstmt.getResultSet();
+					assertTrue(this.rs.next());
+					assertEquals(1, this.rs.getInt(1));
+				} else {
+					assertEquals(1, cstmt.getInt(5));
 				}
+			} finally {
+				if (db2Connection != null) {
+					db2Connection.createStatement().executeUpdate(
+							"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
+					db2Connection.createStatement().executeUpdate(
+					"DROP DATABASE IF EXISTS db_9319_2");
+				}
+
+				if (db1Connection != null) {
+					db1Connection.createStatement().executeUpdate(
+							"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
+					db1Connection.createStatement().executeUpdate(
+					"DROP DATABASE IF EXISTS db_9319_1");
+				}
 			}
 		}
 	}
@@ -434,24 +445,26 @@
 	 *             if the test fails.
 	 */
 	public void testBug9682() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			CallableStatement cStmt = null;
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-			try {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug9682");
-				this.stmt
-						.executeUpdate("CREATE PROCEDURE testBug9682(decimalParam DECIMAL(18,0))"
-								+ "\nBEGIN" + "\n   SELECT 1;" + "\nEND");
-				cStmt = this.conn.prepareCall("Call testBug9682(?)");
-				cStmt.setDouble(1, 18.0);
-				cStmt.execute();
-			} finally {
-				if (cStmt != null) {
-					cStmt.close();
-				}
+		CallableStatement cStmt = null;
 
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug9682");
+		try {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug9682");
+			this.stmt
+			.executeUpdate("CREATE PROCEDURE testBug9682(decimalParam DECIMAL(18,0))"
+					+ "\nBEGIN" + "\n   SELECT 1;" + "\nEND");
+			cStmt = this.conn.prepareCall("Call testBug9682(?)");
+			cStmt.setDouble(1, 18.0);
+			cStmt.execute();
+		} finally {
+			if (cStmt != null) {
+				cStmt.close();
 			}
+
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug9682");
 		}
 	}
 
@@ -464,114 +477,116 @@
 	 *             if the test fails.
 	 */
 	public void testBug10310() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			CallableStatement cStmt = null;
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-			try {
-				this.stmt.executeUpdate("DROP FUNCTION IF EXISTS testBug10310");
-				this.stmt
-						.executeUpdate("CREATE FUNCTION testBug10310(a float, b bigint, c int) RETURNS INT"
-								+ "\nBEGIN" + "\nRETURN a;" + "\nEND");
-				cStmt = this.conn.prepareCall("{? = CALL testBug10310(?,?,?)}");
-				cStmt.registerOutParameter(1, Types.INTEGER);
-				cStmt.setFloat(2, 2);
-				cStmt.setInt(3, 1);
-				cStmt.setInt(4, 1);
-				
-				if (!isRunningOnJdk131()) {
-					assertEquals(4, cStmt.getParameterMetaData().getParameterCount());
-					assertEquals(Types.INTEGER, cStmt.getParameterMetaData().getParameterType(1));
-				}
-				
-				assertFalse(cStmt.execute());
-				assertEquals(2f, cStmt.getInt(1), .001);
-				assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
-						.getName());
+		CallableStatement cStmt = null;
 
-				assertEquals(-1, cStmt.executeUpdate());
-				assertEquals(2f, cStmt.getInt(1), .001);
-				assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
-						.getName());
+		try {
+			this.stmt.executeUpdate("DROP FUNCTION IF EXISTS testBug10310");
+			this.stmt
+			.executeUpdate("CREATE FUNCTION testBug10310(a float, b bigint, c int) RETURNS INT"
+					+ "\nBEGIN" + "\nRETURN a;" + "\nEND");
+			cStmt = this.conn.prepareCall("{? = CALL testBug10310(?,?,?)}");
+			cStmt.registerOutParameter(1, Types.INTEGER);
+			cStmt.setFloat(2, 2);
+			cStmt.setInt(3, 1);
+			cStmt.setInt(4, 1);
 
-				if (!isRunningOnJdk131()) {
-					cStmt.setFloat("a", 4);
-					cStmt.setInt("b", 1);
-					cStmt.setInt("c", 1);
-					
-					assertFalse(cStmt.execute());
-					assertEquals(4f, cStmt.getInt(1), .001);
-					assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
-							.getName());
-					
-					assertEquals(-1, cStmt.executeUpdate());
-					assertEquals(4f, cStmt.getInt(1), .001);
-					assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
-							.getName());
-				}
-				
-				// Check metadata while we're at it
+			if (!isRunningOnJdk131()) {
+				assertEquals(4, cStmt.getParameterMetaData().getParameterCount());
+				assertEquals(Types.INTEGER, cStmt.getParameterMetaData().getParameterType(1));
+			}
 
-				java.sql.DatabaseMetaData dbmd = this.conn.getMetaData();
+			assertFalse(cStmt.execute());
+			assertEquals(2f, cStmt.getInt(1), .001);
+			assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
+					.getName());
 
-				this.rs = dbmd.getProcedures(this.conn.getCatalog(), null,
-						"testBug10310");
-				this.rs.next();
-				assertEquals("testBug10310", this.rs
-						.getString("PROCEDURE_NAME"));
-				assertEquals(DatabaseMetaData.procedureReturnsResult, this.rs
-						.getShort("PROCEDURE_TYPE"));
-				cStmt.setNull(2, Types.FLOAT);
-				cStmt.setInt(3, 1);
-				cStmt.setInt(4, 1);
-				
-				assertFalse(cStmt.execute());
-				assertEquals(0f, cStmt.getInt(1), .001);
-				assertEquals(true, cStmt.wasNull());
-				assertEquals(null, cStmt.getObject(1));
-				assertEquals(true, cStmt.wasNull());
+			assertEquals(-1, cStmt.executeUpdate());
+			assertEquals(2f, cStmt.getInt(1), .001);
+			assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
+					.getName());
 
-				assertEquals(-1, cStmt.executeUpdate());
-				assertEquals(0f, cStmt.getInt(1), .001);
-				assertEquals(true, cStmt.wasNull());
-				assertEquals(null, cStmt.getObject(1));
-				assertEquals(true, cStmt.wasNull());
+			if (!isRunningOnJdk131()) {
+				cStmt.setFloat("a", 4);
+				cStmt.setInt("b", 1);
+				cStmt.setInt("c", 1);
 
-
-				// Check with literals, not all parameters filled!
-				cStmt = this.conn.prepareCall("{? = CALL testBug10310(4,5,?)}");
-				cStmt.registerOutParameter(1, Types.INTEGER);
-				cStmt.setInt(2, 1);
-				
 				assertFalse(cStmt.execute());
 				assertEquals(4f, cStmt.getInt(1), .001);
 				assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
 						.getName());
-				
+
 				assertEquals(-1, cStmt.executeUpdate());
 				assertEquals(4f, cStmt.getInt(1), .001);
 				assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
 						.getName());
-				
-				if (!isRunningOnJdk131()) {
-					assertEquals(2, cStmt.getParameterMetaData().getParameterCount());
-					assertEquals(Types.INTEGER, cStmt.getParameterMetaData().getParameterType(1));
-					assertEquals(Types.INTEGER, cStmt.getParameterMetaData().getParameterType(2));
-				}
-			} finally {
-				if (this.rs != null) {
-					this.rs.close();
-					this.rs = null;
-				}
+			}
 
-				if (cStmt != null) {
-					cStmt.close();
-				}
+			// Check metadata while we're at it
 
-				this.stmt.executeUpdate("DROP FUNCTION IF EXISTS testBug10310");
+			java.sql.DatabaseMetaData dbmd = this.conn.getMetaData();
+
+			this.rs = dbmd.getProcedures(this.conn.getCatalog(), null,
+			"testBug10310");
+			this.rs.next();
+			assertEquals("testBug10310", this.rs
+					.getString("PROCEDURE_NAME"));
+			assertEquals(DatabaseMetaData.procedureReturnsResult, this.rs
+					.getShort("PROCEDURE_TYPE"));
+			cStmt.setNull(2, Types.FLOAT);
+			cStmt.setInt(3, 1);
+			cStmt.setInt(4, 1);
+
+			assertFalse(cStmt.execute());
+			assertEquals(0f, cStmt.getInt(1), .001);
+			assertEquals(true, cStmt.wasNull());
+			assertEquals(null, cStmt.getObject(1));
+			assertEquals(true, cStmt.wasNull());
+
+			assertEquals(-1, cStmt.executeUpdate());
+			assertEquals(0f, cStmt.getInt(1), .001);
+			assertEquals(true, cStmt.wasNull());
+			assertEquals(null, cStmt.getObject(1));
+			assertEquals(true, cStmt.wasNull());
+
+
+			// Check with literals, not all parameters filled!
+			cStmt = this.conn.prepareCall("{? = CALL testBug10310(4,5,?)}");
+			cStmt.registerOutParameter(1, Types.INTEGER);
+			cStmt.setInt(2, 1);
+
+			assertFalse(cStmt.execute());
+			assertEquals(4f, cStmt.getInt(1), .001);
+			assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
+					.getName());
+
+			assertEquals(-1, cStmt.executeUpdate());
+			assertEquals(4f, cStmt.getInt(1), .001);
+			assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
+					.getName());
+
+			if (!isRunningOnJdk131()) {
+				assertEquals(2, cStmt.getParameterMetaData().getParameterCount());
+				assertEquals(Types.INTEGER, cStmt.getParameterMetaData().getParameterType(1));
+				assertEquals(Types.INTEGER, cStmt.getParameterMetaData().getParameterType(2));
 			}
+		} finally {
+			if (this.rs != null) {
+				this.rs.close();
+				this.rs = null;
+			}
+
+			if (cStmt != null) {
+				cStmt.close();
+			}
+
+			this.stmt.executeUpdate("DROP FUNCTION IF EXISTS testBug10310");
 		}
 	}
-	
+
 	/**
 	 * Tests fix for Bug#12417 - stored procedure catalog name is case-sensitive
 	 * on Windows (this is actually a server bug, but we have a workaround in
@@ -581,12 +596,12 @@
 	 *             if the test fails.
 	 */
 	public void testBug12417() throws Exception {
-		if (versionMeetsMinimum(5, 0) && isServerRunningOnWindows()) {
+		if (serverSupportsStoredProcedures() && isServerRunningOnWindows()) {
 			Connection ucCatalogConn = null;
 
 			try {
 				this.stmt
-						.executeUpdate("DROP PROCEDURE IF EXISTS testBug12417");
+				.executeUpdate("DROP PROCEDURE IF EXISTS testBug12417");
 				this.stmt.executeUpdate("CREATE PROCEDURE testBug12417()\n"
 						+ "BEGIN\n" + "SELECT 1;" + "end\n");
 				ucCatalogConn = getConnectionWithProps(null);
@@ -606,7 +621,7 @@
 		if (false /* needs to be fixed on server */) {
 			if (versionMeetsMinimum(5, 0)) {
 				this.stmt
-						.executeUpdate("DROP PROCEDURE IF EXISTS p_testBug15121");
+				.executeUpdate("DROP PROCEDURE IF EXISTS p_testBug15121");
 
 				this.stmt.executeUpdate("CREATE PROCEDURE p_testBug15121()\n"
 						+ "BEGIN\n" + "SELECT * from idonotexist;\n" + "END");
@@ -621,7 +636,7 @@
 
 					StringBuffer queryBuf = new StringBuffer("{call ");
 					String quotedId = this.conn.getMetaData()
-							.getIdentifierQuoteString();
+					.getIdentifierQuoteString();
 					queryBuf.append(quotedId);
 					queryBuf.append(this.conn.getCatalog());
 					queryBuf.append(quotedId);
@@ -645,35 +660,36 @@
 	 */
 
 	public void testBug15464() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			CallableStatement storedProc = null;
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
+		CallableStatement storedProc = null;
 
-			try {
-				this.stmt
-						.executeUpdate("DROP PROCEDURE IF EXISTS testInOutParam");
-				this.stmt
-						.executeUpdate("create procedure testInOutParam(IN p1 VARCHAR(255), INOUT p2
INT)\n"
-								+ "begin\n"
-								+ " DECLARE z INT;\n"
-								+ "SET z = p2 + 1;\n"
-								+ "SET p2 = z;\n"
-								+ "SELECT p1;\n"
-								+ "SELECT CONCAT('zyxw', p1);\n" + "end\n");
+		try {
+			this.stmt
+			.executeUpdate("DROP PROCEDURE IF EXISTS testInOutParam");
+			this.stmt
+			.executeUpdate("create procedure testInOutParam(IN p1 VARCHAR(255), INOUT p2 INT)\n"
+					+ "begin\n"
+					+ " DECLARE z INT;\n"
+					+ "SET z = p2 + 1;\n"
+					+ "SET p2 = z;\n"
+					+ "SELECT p1;\n"
+					+ "SELECT CONCAT('zyxw', p1);\n" + "end\n");
 
-				storedProc = this.conn
-						.prepareCall("{call testInOutParam(?, ?)}");
+			storedProc = this.conn
+			.prepareCall("{call testInOutParam(?, ?)}");
 
-				storedProc.setString(1, "abcd");
-				storedProc.setInt(2, 4);
-				storedProc.registerOutParameter(2, Types.INTEGER);
+			storedProc.setString(1, "abcd");
+			storedProc.setInt(2, 4);
+			storedProc.registerOutParameter(2, Types.INTEGER);
 
-				storedProc.execute();
+			storedProc.execute();
 
-				assertEquals(5, storedProc.getInt(2));
-			} finally {
-				this.stmt
-						.executeUpdate("DROP PROCEDURE IF EXISTS testInOutParam");
-			}
+			assertEquals(5, storedProc.getInt(2));
+		} finally {
+			this.stmt
+			.executeUpdate("DROP PROCEDURE IF EXISTS testInOutParam");
 		}
 	}
 
@@ -687,24 +703,27 @@
 	 *             if the test fails
 	 */
 	public void testBug17898() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug17898");
-			this.stmt
-					.executeUpdate("CREATE PROCEDURE testBug17898(param1 VARCHAR(50), OUT param2
INT)\nBEGIN\nDECLARE rtn INT;\nSELECT 1 INTO rtn;\nSET param2=rtn;\nEND");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-			CallableStatement cstmt = this.conn
-					.prepareCall("{CALL testBug17898('foo', ?)}");
-			cstmt.registerOutParameter(1, Types.INTEGER);
+		this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug17898");
+		this.stmt
+		.executeUpdate("CREATE PROCEDURE testBug17898(param1 VARCHAR(50), OUT param2
INT)\nBEGIN\nDECLARE rtn INT;\nSELECT 1 INTO rtn;\nSET param2=rtn;\nEND");
+
+		CallableStatement cstmt = this.conn
+		.prepareCall("{CALL testBug17898('foo', ?)}");
+		cstmt.registerOutParameter(1, Types.INTEGER);
+		cstmt.execute();
+		assertEquals(1, cstmt.getInt(1));
+
+		if (!isRunningOnJdk131()) {
+			cstmt.clearParameters();
+			cstmt.registerOutParameter("param2", Types.INTEGER);
 			cstmt.execute();
 			assertEquals(1, cstmt.getInt(1));
+		}
 
-			if (!isRunningOnJdk131()) {
-				cstmt.clearParameters();
-				cstmt.registerOutParameter("param2", Types.INTEGER);
-				cstmt.execute();
-				assertEquals(1, cstmt.getInt(1));
-			}
-		}
 	}
 
 	/**
@@ -714,24 +733,27 @@
 	 * @throws Exception if the test fails.
 	 */
 	public void testBug21462() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			CallableStatement cstmt = null;
-			
-			try {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug21462");
-				this.stmt.executeUpdate("CREATE PROCEDURE testBug21462() BEGIN SELECT 1; END");
-				cstmt = this.conn.prepareCall("{CALL testBug21462}");
-				cstmt.execute();
-			} finally {
-				if (cstmt != null) {
-					cstmt.close();
-				}
-				
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug21462");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
+
+		CallableStatement cstmt = null;
+
+		try {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug21462");
+			this.stmt.executeUpdate("CREATE PROCEDURE testBug21462() BEGIN SELECT 1; END");
+			cstmt = this.conn.prepareCall("{CALL testBug21462}");
+			cstmt.execute();
+		} finally {
+			if (cstmt != null) {
+				cstmt.close();
 			}
+
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug21462");
 		}
+
 	}
-	
+
 	/** 
 	 * Tests fix for BUG#22024 - Newlines causing whitespace to span confuse
 	 * procedure parser when getting parameter metadata for stored procedures.
@@ -739,30 +761,33 @@
 	 * @throws Exception if the test fails
 	 */
 	public void testBug22024() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			CallableStatement cstmt = null;
-			
-			try {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22024");
-				this.stmt.executeUpdate("CREATE PROCEDURE testBug22024(\r\n)\r\n BEGIN SELECT 1;
END");
-				cstmt = this.conn.prepareCall("{CALL testBug22024()}");
-				cstmt.execute();
-				
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22024");
-				this.stmt.executeUpdate("CREATE PROCEDURE testBug22024(\r\na INT)\r\n BEGIN SELECT 1;
END");
-				cstmt = this.conn.prepareCall("{CALL testBug22024(?)}");
-				cstmt.setInt(1, 1);
-				cstmt.execute();
-			} finally {
-				if (cstmt != null) {
-					cstmt.close();
-				}
-				
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22024");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
+
+		CallableStatement cstmt = null;
+
+		try {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22024");
+			this.stmt.executeUpdate("CREATE PROCEDURE testBug22024(\r\n)\r\n BEGIN SELECT 1;
END");
+			cstmt = this.conn.prepareCall("{CALL testBug22024()}");
+			cstmt.execute();
+
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22024");
+			this.stmt.executeUpdate("CREATE PROCEDURE testBug22024(\r\na INT)\r\n BEGIN SELECT 1;
END");
+			cstmt = this.conn.prepareCall("{CALL testBug22024(?)}");
+			cstmt.setInt(1, 1);
+			cstmt.execute();
+		} finally {
+			if (cstmt != null) {
+				cstmt.close();
 			}
+
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22024");
 		}
+
 	}
-	
+
 	/**
 	 * Tests workaround for server crash when calling stored procedures
 	 * via a server-side prepared statement (driver now detects 
@@ -771,163 +796,172 @@
 	 * @throws Exception if the test fails
 	 */
 	public void testBug22297() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22297");
-			
-			createTable("tblTestBug2297_1", "("
-					+ "id varchar(20) NOT NULL default '',"
-					+ "Income double(19,2) default NULL)");	
-			
-			createTable("tblTestBug2297_2", "("
-					+ "id varchar(20) NOT NULL default ''," 
-					+ "CreatedOn datetime default NULL)");
-			
-			this.stmt.executeUpdate("CREATE PROCEDURE testBug22297(pcaseid INT)"
-					+ "BEGIN"
-					+ "\nSET @sql = \"DROP TEMPORARY TABLE IF EXISTS tmpOrders\";"
-					+ " PREPARE stmt FROM @sql;"
-					+ " EXECUTE stmt;"
-					+ " DEALLOCATE PREPARE stmt;"
-					+ "\nSET @sql = \"CREATE TEMPORARY TABLE tmpOrders SELECT id, 100 AS Income FROM
tblTestBug2297_1 GROUP BY id\";"
-					+ " PREPARE stmt FROM @sql;"
-					+ " EXECUTE stmt;"
-					+ " DEALLOCATE PREPARE stmt;"
-					+ "\n SELECT id, Income FROM (SELECT e.id AS id ,COALESCE(prof.Income,0) AS Income"
-					+ "\n FROM tblTestBug2297_2 e LEFT JOIN tmpOrders prof ON e.id = prof.id"
-					+ "\n WHERE e.CreatedOn > '2006-08-01') AS Final ORDER BY id;" 
-					+ "\nEND");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-			this.stmt.executeUpdate("INSERT INTO tblTestBug2297_1 (`id`,`Income`) VALUES "
-					+ "('a',4094.00),"
-					+ "('b',500.00),"
-					+ "('c',3462.17),"
-					+ " ('d',500.00),"
-					+ " ('e',600.00)");
-			
-			this.stmt.executeUpdate("INSERT INTO tblTestBug2297_2 (`id`,`CreatedOn`) VALUES "
-					+ "('d','2006-08-31 00:00:00'),"
-					+ "('e','2006-08-31 00:00:00'),"
+		this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22297");
+
+		createTable("tblTestBug2297_1", "("
+				+ "id varchar(20) NOT NULL default '',"
+				+ "Income double(19,2) default NULL)");	
+
+		createTable("tblTestBug2297_2", "("
+				+ "id varchar(20) NOT NULL default ''," 
+				+ "CreatedOn datetime default NULL)");
+
+		this.stmt.executeUpdate("CREATE PROCEDURE testBug22297(pcaseid INT)"
+				+ "BEGIN"
+				+ "\nSET @sql = \"DROP TEMPORARY TABLE IF EXISTS tmpOrders\";"
+				+ " PREPARE stmt FROM @sql;"
+				+ " EXECUTE stmt;"
+				+ " DEALLOCATE PREPARE stmt;"
+				+ "\nSET @sql = \"CREATE TEMPORARY TABLE tmpOrders SELECT id, 100 AS Income FROM
tblTestBug2297_1 GROUP BY id\";"
+				+ " PREPARE stmt FROM @sql;"
+				+ " EXECUTE stmt;"
+				+ " DEALLOCATE PREPARE stmt;"
+				+ "\n SELECT id, Income FROM (SELECT e.id AS id ,COALESCE(prof.Income,0) AS Income"
+				+ "\n FROM tblTestBug2297_2 e LEFT JOIN tmpOrders prof ON e.id = prof.id"
+				+ "\n WHERE e.CreatedOn > '2006-08-01') AS Final ORDER BY id;" 
+				+ "\nEND");
+
+		this.stmt.executeUpdate("INSERT INTO tblTestBug2297_1 (`id`,`Income`) VALUES "
+				+ "('a',4094.00),"
+				+ "('b',500.00),"
+				+ "('c',3462.17),"
+				+ " ('d',500.00),"
+				+ " ('e',600.00)");
+
+		this.stmt.executeUpdate("INSERT INTO tblTestBug2297_2 (`id`,`CreatedOn`) VALUES "
+				+ "('d','2006-08-31 00:00:00'),"
+				+ "('e','2006-08-31 00:00:00'),"
 				+ "('b','2006-08-31 00:00:00'),"
 				+ "('c','2006-08-31 00:00:00'),"
 				+ "('a','2006-08-31 00:00:00')");
-			
-			try {
-				this.pstmt = this.conn.prepareStatement("{CALL testBug22297(?)}");
-				this.pstmt.setInt(1, 1);
-				this.rs =this.pstmt.executeQuery();
-                
-				String[] ids = new String[] { "a", "b", "c", "d", "e"};
-                int pos = 0;
-                
-                while (this.rs.next()) {
-                	assertEquals(ids[pos++], rs.getString(1));
-                	assertEquals(100, rs.getInt(2));
-                }
-                
-                assertEquals(this.pstmt.getClass().getName(),
-                		com.mysql.jdbc.PreparedStatement.class.getName());
 
-			} finally {
-				closeMemberJDBCResources();
+		try {
+			this.pstmt = this.conn.prepareStatement("{CALL testBug22297(?)}");
+			this.pstmt.setInt(1, 1);
+			this.rs =this.pstmt.executeQuery();
+
+			String[] ids = new String[] { "a", "b", "c", "d", "e"};
+			int pos = 0;
+
+			while (this.rs.next()) {
+				assertEquals(ids[pos++], rs.getString(1));
+				assertEquals(100, rs.getInt(2));
 			}
+
+			assertEquals(this.pstmt.getClass().getName(),
+					com.mysql.jdbc.PreparedStatement.class.getName());
+
+		} finally {
+			closeMemberJDBCResources();
 		}
+
 	}
-	
+
 	public void testHugeNumberOfParameters() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			this.stmt
-					.executeUpdate("DROP PROCEDURE IF EXISTS testHugeNumberOfParameters");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-			StringBuffer procDef = new StringBuffer(
-					"CREATE PROCEDURE testHugeNumberOfParameters(");
+		this.stmt
+		.executeUpdate("DROP PROCEDURE IF EXISTS testHugeNumberOfParameters");
 
-			for (int i = 0; i < 274; i++) {
-				if (i != 0) {
-					procDef.append(",");
-				}
+		StringBuffer procDef = new StringBuffer(
+		"CREATE PROCEDURE testHugeNumberOfParameters(");
 
-				procDef.append(" OUT param_" + i + " VARCHAR(32)");
+		for (int i = 0; i < 274; i++) {
+			if (i != 0) {
+				procDef.append(",");
 			}
 
-			procDef.append(")\nBEGIN\nSELECT 1;\nEND");
-			this.stmt.executeUpdate(procDef.toString());
+			procDef.append(" OUT param_" + i + " VARCHAR(32)");
+		}
 
-			CallableStatement cStmt = null;
+		procDef.append(")\nBEGIN\nSELECT 1;\nEND");
+		this.stmt.executeUpdate(procDef.toString());
 
-			try {
-				cStmt = this.conn
-						.prepareCall("{call
testHugeNumberOfParameters(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
-								+
+		CallableStatement cStmt = null;
 
-								"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
-								+
"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
-								+
"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
-								+
"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
-								+
"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
-								+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
-				cStmt.registerOutParameter(274, Types.VARCHAR);
+		try {
+			cStmt = this.conn
+			.prepareCall("{call
testHugeNumberOfParameters(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
+					+
 
-				cStmt.execute();
-			} finally {
-				if (cStmt != null) {
-					cStmt.close();
-				}
+					"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
+					+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
+					+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
+					+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
+					+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
+					+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
+			cStmt.registerOutParameter(274, Types.VARCHAR);
+
+			cStmt.execute();
+		} finally {
+			if (cStmt != null) {
+				cStmt.close();
 			}
 		}
 	}
 
 	public void testPrepareOfMultiRs() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			this.stmt.executeUpdate("Drop procedure if exists p");
-			this.stmt
-					.executeUpdate("create procedure p () begin select 1; select 2; end;");
-			PreparedStatement ps = null;
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-			try {
-				ps = this.conn.prepareStatement("call p()");
 
-				ps.execute();
-				this.rs = ps.getResultSet();
-				assertTrue(this.rs.next());
-				assertEquals(1, this.rs.getInt(1));
-				assertTrue(ps.getMoreResults());
-				this.rs = ps.getResultSet();
-				assertTrue(this.rs.next());
-				assertEquals(2, this.rs.getInt(1));
-				assertTrue(!ps.getMoreResults());
-			} finally {
-				if (this.rs != null) {
-					this.rs.close();
-					this.rs = null;
-				}
+		this.stmt.executeUpdate("Drop procedure if exists p");
+		this.stmt
+		.executeUpdate("create procedure p () begin select 1; select 2; end;");
+		PreparedStatement ps = null;
 
-				if (ps != null) {
-					ps.close();
-				}
+		try {
+			ps = this.conn.prepareStatement("call p()");
+
+			ps.execute();
+			this.rs = ps.getResultSet();
+			assertTrue(this.rs.next());
+			assertEquals(1, this.rs.getInt(1));
+			assertTrue(ps.getMoreResults());
+			this.rs = ps.getResultSet();
+			assertTrue(this.rs.next());
+			assertEquals(2, this.rs.getInt(1));
+			assertTrue(!ps.getMoreResults());
+		} finally {
+			if (this.rs != null) {
+				this.rs.close();
+				this.rs = null;
 			}
+
+			if (ps != null) {
+				ps.close();
+			}
 		}
+
 	}
-	
+
 	/**
 	 * Tests fix for BUG#25379 - INOUT parameters in CallableStatements get doubly-escaped.
 	 * 
 	 * @throws Exception if the test fails.
 	 */
 	public void testBug25379() throws Exception {
-		if (!versionMeetsMinimum(5, 0)) {
+		if (!serverSupportsStoredProcedures()) {
 			return;
 		}
-		
+
 		createTable("testBug25379", "(col char(40))");
-		
+
 		try {
 			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS sp_testBug25379");
 			this.stmt.executeUpdate("CREATE PROCEDURE sp_testBug25379 (INOUT invalue char(255))"
 					+ "\nBEGIN"
 					+ "\ninsert into testBug25379(col) values(invalue);"
 					+ "\nEND");
-	
-			
+
+
 			CallableStatement cstmt = this.conn.prepareCall("{call sp_testBug25379(?)}");
 			cstmt.setString(1,"'john'");
 			cstmt.executeUpdate();
@@ -937,65 +971,131 @@
 			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS sp_testBug25379");
 		}
 	}
-	
+
+	/**
+	 * Tests fix for BUG#25715 - CallableStatements with OUT/INOUT parameters that
+	 * are "binary" have extra 7 bytes (which happens to be the _binary introducer!)
+	 * 
+	 * @throws Exception if the test fails.
+	 */
+	public void testBug25715() throws Exception {
+		if (!serverSupportsStoredProcedures()) {
+			return; // no stored procs
+		}
+
+		createProcedure("spbug25715", "(INOUT mblob MEDIUMBLOB)" + "BEGIN"
+				+ " SELECT 1 FROM DUAL WHERE 1=0;" + "\nEND");
+		CallableStatement cstmt = null;
+
+		try {
+			cstmt = this.conn.prepareCall("{call spbug25715(?)}");
+
+			byte[] buf = new byte[65];
+			for (int i = 0; i < 65; i++)
+				buf[i] = 1;
+			int il = buf.length;
+
+			int[] typesToTest = new int[] { Types.BIT, Types.BINARY, Types.BLOB,
Types.JAVA_OBJECT,
+					Types.LONGVARBINARY, Types.VARBINARY };
+
+			for (int i = 0; i < typesToTest.length; i++) {
+
+				cstmt.setBinaryStream("mblob", new ByteArrayInputStream(buf),
+						buf.length);
+				cstmt.registerOutParameter("mblob", typesToTest[i]);
+
+				cstmt.executeUpdate();
+
+				InputStream is = cstmt.getBlob("mblob").getBinaryStream();
+				ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+
+				int bytesRead = 0;
+				byte[] readBuf = new byte[256];
+
+				while ((bytesRead = is.read(readBuf)) != -1) {
+					bOut.write(readBuf, 0, bytesRead);
+				}
+
+				byte[] fromSelectBuf = bOut.toByteArray();
+
+				int ol = fromSelectBuf.length;
+
+				assertEquals(il, ol);
+			}
+
+			cstmt.close();
+		} finally {
+			closeMemberJDBCResources();
+
+			if (cstmt != null) {
+				cstmt.close();
+			}
+		}
+
+	}
+
+	protected boolean serverSupportsStoredProcedures() throws SQLException {
+		return versionMeetsMinimum(5, 0);
+	}
+
 	public void testBug26143() throws Exception {
-		if (!versionMeetsMinimum(5, 0)) {
+		if (!serverSupportsStoredProcedures()) {
 			return; // no stored procedure support
 		}
-		
+
 		this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug26143");
 
 		this.stmt.executeUpdate("CREATE DEFINER=CURRENT_USER PROCEDURE testBug26143(I INT)
COMMENT 'abcdefg'"
 				+ "\nBEGIN\n"
 				+ "SELECT I * 10;"
 				+ "\nEND");
-		
+
 		this.conn.prepareCall("{call testBug26143(?)").close();
 	}
-	
+
 	/**
 	 * Tests fix for BUG#26959 - comments confuse procedure parser.
 	 * 
 	 * @throws Exception if the test fails
 	 */
 	public void testBug26959() throws Exception {
-		if (!versionMeetsMinimum(5, 0)) {
+		if (!serverSupportsStoredProcedures()) {
 			return;
 		}
 
 		createProcedure(
 				"testBug26959",
 				"(_ACTION varchar(20),"
-						+ "\n`/*dumb-identifier-1*/` int,"
-						+ "\n`#dumb-identifier-2` int,"
-						+ "\n`--dumb-identifier-3` int,"
-						+ "\n_CLIENT_ID int, -- ABC"
-						+ "\n_LOGIN_ID  int, # DEF"
-						+ "\n_WHERE varchar(2000),"
-						+ "\n_SORT varchar(2000),"
-						+ "\n out _SQL varchar(/* inline right here - oh my gosh! */ 8000),"
-						+ "\n _SONG_ID int,"
-						+ "\n  _NOTES varchar(2000),"
-						+ "\n out _RESULT varchar(10)"
-						+ "\n /*"
-						+ "\n ,    -- Generic result parameter"
-						+ "\n out _PERIOD_ID int,         -- Returns the period_id. Useful when using
@PREDEFLINK to return which is the last period"
-						+ "\n   _SONGS_LIST varchar(8000),"
-						+ "\n  _COMPOSERID int,"
-						+ "\n  _PUBLISHERID int,"
-						+ "\n   _PREDEFLINK int        -- If the user is accessing through a predefined
link: 0=none  1=last period"
-						+ "\n */) BEGIN SELECT 1; END");
+				+ "\n`/*dumb-identifier-1*/` int,"
+				+ "\n`#dumb-identifier-2` int,"
+				+ "\n`--dumb-identifier-3` int,"
+				+ "\n_CLIENT_ID int, -- ABC"
+				+ "\n_LOGIN_ID  int, # DEF"
+				+ "\n_WHERE varchar(2000),"
+				+ "\n_SORT varchar(2000),"
+				+ "\n out _SQL varchar(/* inline right here - oh my gosh! */ 8000),"
+				+ "\n _SONG_ID int,"
+				+ "\n  _NOTES varchar(2000),"
+				+ "\n out _RESULT varchar(10)"
+				+ "\n /*"
+				+ "\n ,    -- Generic result parameter"
+				+ "\n out _PERIOD_ID int,         -- Returns the period_id. Useful when using
@PREDEFLINK to return which is the last period"
+				+ "\n   _SONGS_LIST varchar(8000),"
+				+ "\n  _COMPOSERID int,"
+				+ "\n  _PUBLISHERID int,"
+				+ "\n   _PREDEFLINK int        -- If the user is accessing through a predefined link:
0=none  1=last period"
+				+ "\n */) BEGIN SELECT 1; END");
 
 		createProcedure(
 				"testBug26959_1",
 				"(`/*id*/` /* before type 1 */ varchar(20),"
-						+ "/* after type 1 */ OUT result2 DECIMAL(/*size1*/10,/*size2*/2) /* p2 */)"
-						+ "BEGIN SELECT action, result; END");
+				+ "/* after type 1 */ OUT result2 DECIMAL(/*size1*/10,/*size2*/2) /* p2 */)"
+				+ "BEGIN SELECT action, result; END");
 
 		try {
 			this.conn.prepareCall(
-					"{call testBug26959(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}")
-					.close();
+			"{call testBug26959(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}")
+			.close();
 			this.rs = this.conn.getMetaData().getProcedureColumns(
 					this.conn.getCatalog(), null, "testBug26959", "%");
 
@@ -1065,19 +1165,19 @@
 			closeMemberJDBCResources();
 		}
 	}
-	
+
 	/**
 	 * Tests fix for BUG#27400 - CALL [comment] some_proc() doesn't work
 	 */
 	public void testBug27400() throws Exception {
-		if (!versionMeetsMinimum(5, 0)) {
+		if (!serverSupportsStoredProcedures()) {
 			return; // SPs not supported
 		}
-		
+
 		createProcedure("testBug27400", "(a INT, b VARCHAR(32)) BEGIN SELECT 1; END");
-		
+
 		CallableStatement cStmt = null;
-		
+
 		try {
 			cStmt = this.conn.prepareCall("{CALL /* SOME COMMENT */ testBug27400( /* does this
work too? */ ?, ?)} # and a commented ? here too");
 			assertTrue(cStmt.toString().indexOf("/*") != -1); // we don't want to strip the
comments

Modified: trunk/connector-j/CHANGES
===================================================================
--- trunk/connector-j/CHANGES	2007-03-26 15:06:20 UTC (rev 6369)
+++ trunk/connector-j/CHANGES	2007-03-26 16:09:00 UTC (rev 6370)
@@ -88,7 +88,11 @@
 	  
 	- Fixed BUG#25328 - BIT(> 1) is returned as java.lang.String from
ResultSet.getObject()
 	  rather than byte[].
-	  	      
+	  
+	- Fixed BUG#25715 - CallableStatements with OUT/INOUT parameters that
+	  are "binary" (blobs, bits, (var)binary, java_object) have extra 7 bytes 
+	  (which happens to be the _binary introducer!)
+	  	  	      
 03-01-07 - Version 5.0.5
 
     - Fixed BUG#23645 - Some collations/character sets reported as "unknown"

Modified: trunk/connector-j/src/com/mysql/jdbc/CallableStatement.java
===================================================================
--- trunk/connector-j/src/com/mysql/jdbc/CallableStatement.java	2007-03-26 15:06:20 UTC
(rev 6369)
+++ trunk/connector-j/src/com/mysql/jdbc/CallableStatement.java	2007-03-26 16:09:00 UTC
(rev 6370)
@@ -2057,8 +2057,8 @@
 						setPstmt = this.connection
 								.clientPrepareStatement(queryBuf.toString());
 
-						byte[] parameterAsBytes = this
-								.getBytesRepresentation(inParamInfo.index);
+						byte[] parameterAsBytes = getBytesRepresentation(
+								inParamInfo.index);
 
 						if (parameterAsBytes != null) {
 							if (parameterAsBytes.length > 8
@@ -2073,7 +2073,22 @@
 								setPstmt.setBytesNoEscapeNoQuotes(1,
 										parameterAsBytes);
 							} else {
-								setPstmt.setBytesNoEscape(1, parameterAsBytes);
+								int sqlType = inParamInfo.desiredJdbcType;
+								
+								switch (sqlType) {
+								case Types.BIT:
+								case Types.BINARY: 
+								case Types.BLOB: 
+								case Types.JAVA_OBJECT:
+								case Types.LONGVARBINARY: 
+								case Types.VARBINARY:
+									setPstmt.setBytes(1, parameterAsBytes);
+									break;
+								default:
+									// the inherited PreparedStatement methods
+									// have already escaped and quoted these parameters
+									setPstmt.setBytesNoEscape(1, parameterAsBytes);
+								}
 							}
 						} else {
 							setPstmt.setNull(1, Types.NULL);

Modified: trunk/connector-j/src/testsuite/regression/CallableStatementRegressionTest.java
===================================================================
---
trunk/connector-j/src/testsuite/regression/CallableStatementRegressionTest.java	2007-03-26
15:06:20 UTC (rev 6369)
+++
trunk/connector-j/src/testsuite/regression/CallableStatementRegressionTest.java	2007-03-26
16:09:00 UTC (rev 6370)
@@ -1,5 +1,5 @@
 /*
- Copyright (C) 2002-2004 MySQL AB
+ Copyright (C) 2002-2007 MySQL AB
 
  This program is free software; you can redistribute it and/or modify
  it under the terms of version 2 of the GNU General Public License as 
@@ -24,17 +24,22 @@
  */
 package testsuite.regression;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
 import java.sql.CallableStatement;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.sql.Types;
+import java.util.List;
 import java.util.Properties;
 
 import com.mysql.jdbc.DatabaseMetaData;
 import com.mysql.jdbc.NonRegisteringDriver;
 import com.mysql.jdbc.SQLError;
+import com.mysql.jdbc.StringUtils;
 
 import testsuite.BaseTestCase;
 
@@ -74,20 +79,22 @@
 	 *             if an error occurs.
 	 */
 	public void testBug3539() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			try {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3539");
-				this.stmt.executeUpdate("CREATE PROCEDURE testBug3539()\n"
-						+ "BEGIN\n" + "SELECT 1;" + "end\n");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-				this.rs = this.conn.getMetaData().getProcedures(null, null,
-						"testBug3539");
+		try {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3539");
+			this.stmt.executeUpdate("CREATE PROCEDURE testBug3539()\n"
+					+ "BEGIN\n" + "SELECT 1;" + "end\n");
 
-				assertTrue(this.rs.next());
-				assertTrue("testBug3539".equals(this.rs.getString(3)));
-			} finally {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3539");
-			}
+			this.rs = this.conn.getMetaData().getProcedures(null, null,
+			"testBug3539");
+
+			assertTrue(this.rs.next());
+			assertTrue("testBug3539".equals(this.rs.getString(3)));
+		} finally {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3539");
 		}
 	}
 
@@ -99,28 +106,29 @@
 	 *             if an error occurs.
 	 */
 	public void testBug3540() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			try {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3540");
-				this.stmt
-						.executeUpdate("CREATE PROCEDURE testBug3540(x int, out y int)\n"
-								+ "BEGIN\n" + "SELECT 1;" + "end\n");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
+		try {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3540");
+			this.stmt
+			.executeUpdate("CREATE PROCEDURE testBug3540(x int, out y int)\n"
+					+ "BEGIN\n" + "SELECT 1;" + "end\n");
 
-				this.rs = this.conn.getMetaData().getProcedureColumns(null,
-						null, "testBug3540%", "%");
+			this.rs = this.conn.getMetaData().getProcedureColumns(null,
+					null, "testBug3540%", "%");
 
-				assertTrue(this.rs.next());
-				assertTrue("testBug3540".equals(this.rs.getString(3)));
-				assertTrue("x".equals(this.rs.getString(4)));
+			assertTrue(this.rs.next());
+			assertTrue("testBug3540".equals(this.rs.getString(3)));
+			assertTrue("x".equals(this.rs.getString(4)));
 
-				assertTrue(this.rs.next());
-				assertTrue("testBug3540".equals(this.rs.getString(3)));
-				assertTrue("y".equals(this.rs.getString(4)));
+			assertTrue(this.rs.next());
+			assertTrue("testBug3540".equals(this.rs.getString(3)));
+			assertTrue("y".equals(this.rs.getString(4)));
 
-				assertTrue(!this.rs.next());
-			} finally {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3540");
-			}
+			assertTrue(!this.rs.next());
+		} finally {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug3540");
 		}
 	}
 
@@ -132,46 +140,48 @@
 	 *             if the test fails.
 	 */
 	public void testBug7026() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			try {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug7026");
-				this.stmt
-						.executeUpdate("CREATE PROCEDURE testBug7026(x int, out y int)\n"
-								+ "BEGIN\n" + "SELECT 1;" + "end\n");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-				//
-				// Should be found this time.
-				//
-				this.rs = this.conn.getMetaData().getProcedures(
-						this.conn.getCatalog(), null, "testBug7026");
+		try {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug7026");
+			this.stmt
+			.executeUpdate("CREATE PROCEDURE testBug7026(x int, out y int)\n"
+					+ "BEGIN\n" + "SELECT 1;" + "end\n");
 
-				assertTrue(this.rs.next());
-				assertTrue("testBug7026".equals(this.rs.getString(3)));
+			//
+			// Should be found this time.
+			//
+			this.rs = this.conn.getMetaData().getProcedures(
+					this.conn.getCatalog(), null, "testBug7026");
 
-				assertTrue(!this.rs.next());
+			assertTrue(this.rs.next());
+			assertTrue("testBug7026".equals(this.rs.getString(3)));
 
-				//
-				// This time, shouldn't be found, because not associated with
-				// this (bogus) catalog
-				//
-				this.rs = this.conn.getMetaData().getProcedures("abfgerfg",
-						null, "testBug7026");
-				assertTrue(!this.rs.next());
+			assertTrue(!this.rs.next());
 
-				//
-				// Should be found this time as well, as we haven't
-				// specified a catalog.
-				//
-				this.rs = this.conn.getMetaData().getProcedures(null, null,
-						"testBug7026");
+			//
+			// This time, shouldn't be found, because not associated with
+			// this (bogus) catalog
+			//
+			this.rs = this.conn.getMetaData().getProcedures("abfgerfg",
+					null, "testBug7026");
+			assertTrue(!this.rs.next());
 
-				assertTrue(this.rs.next());
-				assertTrue("testBug7026".equals(this.rs.getString(3)));
+			//
+			// Should be found this time as well, as we haven't
+			// specified a catalog.
+			//
+			this.rs = this.conn.getMetaData().getProcedures(null, null,
+			"testBug7026");
 
-				assertTrue(!this.rs.next());
-			} finally {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug7026");
-			}
+			assertTrue(this.rs.next());
+			assertTrue("testBug7026".equals(this.rs.getString(3)));
+
+			assertTrue(!this.rs.next());
+		} finally {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug7026");
 		}
 	}
 
@@ -184,151 +194,154 @@
 	 *             if the test fails
 	 */
 	public void testBug9319() throws Exception {
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
+
 		boolean doASelect = true; // SELECT currently causes the server to
 		// hang on the
 		// last execution of this testcase, filed as BUG#9405
 
-		if (versionMeetsMinimum(5, 0, 2)) {
-			if (isAdminConnectionConfigured()) {
-				Connection db2Connection = null;
-				Connection db1Connection = null;
 
-				try {
-					db2Connection = getAdminConnection();
-					db1Connection = getAdminConnection();
+		if (isAdminConnectionConfigured()) {
+			Connection db2Connection = null;
+			Connection db1Connection = null;
 
-					db2Connection.createStatement().executeUpdate(
-							"CREATE DATABASE IF NOT EXISTS db_9319_2");
-					db2Connection.setCatalog("db_9319_2");
+			try {
+				db2Connection = getAdminConnection();
+				db1Connection = getAdminConnection();
 
-					db2Connection.createStatement().executeUpdate(
-							"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
+				db2Connection.createStatement().executeUpdate(
+						"CREATE DATABASE IF NOT EXISTS db_9319_2");
+				db2Connection.setCatalog("db_9319_2");
 
-					db2Connection
-							.createStatement()
-							.executeUpdate(
-									"CREATE PROCEDURE COMPROVAR_USUARI(IN p_CodiUsuari VARCHAR(10),"
-											+ "\nIN p_contrasenya VARCHAR(10),"
-											+ "\nOUT p_userId INTEGER,"
-											+ "\nOUT p_userName VARCHAR(30),"
-											+ "\nOUT p_administrador VARCHAR(1),"
-											+ "\nOUT p_idioma VARCHAR(2))"
-											+ "\nBEGIN"
+				db2Connection.createStatement().executeUpdate(
+				"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
 
-											+ (doASelect ? "\nselect 2;"
-													: "\nSELECT 2 INTO p_administrador;")
-											+ "\nEND");
+				db2Connection
+				.createStatement()
+				.executeUpdate(
+						"CREATE PROCEDURE COMPROVAR_USUARI(IN p_CodiUsuari VARCHAR(10),"
+						+ "\nIN p_contrasenya VARCHAR(10),"
+						+ "\nOUT p_userId INTEGER,"
+						+ "\nOUT p_userName VARCHAR(30),"
+						+ "\nOUT p_administrador VARCHAR(1),"
+						+ "\nOUT p_idioma VARCHAR(2))"
+						+ "\nBEGIN"
 
-					db1Connection.createStatement().executeUpdate(
-							"CREATE DATABASE IF NOT EXISTS db_9319_1");
-					db1Connection.setCatalog("db_9319_1");
+						+ (doASelect ? "\nselect 2;"
+								: "\nSELECT 2 INTO p_administrador;")
+								+ "\nEND");
 
-					db1Connection.createStatement().executeUpdate(
-							"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
-					db1Connection
-							.createStatement()
-							.executeUpdate(
-									"CREATE PROCEDURE COMPROVAR_USUARI(IN p_CodiUsuari VARCHAR(10),"
-											+ "\nIN p_contrasenya VARCHAR(10),"
-											+ "\nOUT p_userId INTEGER,"
-											+ "\nOUT p_userName VARCHAR(30),"
-											+ "\nOUT p_administrador VARCHAR(1))"
-											+ "\nBEGIN"
-											+ (doASelect ? "\nselect 1;"
-													: "\nSELECT 1 INTO p_administrador;")
-											+ "\nEND");
+				db1Connection.createStatement().executeUpdate(
+				"CREATE DATABASE IF NOT EXISTS db_9319_1");
+				db1Connection.setCatalog("db_9319_1");
 
-					CallableStatement cstmt = db2Connection
-							.prepareCall("{ call COMPROVAR_USUARI(?, ?, ?, ?, ?, ?) }");
-					cstmt.setString(1, "abc");
-					cstmt.setString(2, "def");
-					cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
-					cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
-					cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
+				db1Connection.createStatement().executeUpdate(
+				"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
+				db1Connection
+				.createStatement()
+				.executeUpdate(
+						"CREATE PROCEDURE COMPROVAR_USUARI(IN p_CodiUsuari VARCHAR(10),"
+						+ "\nIN p_contrasenya VARCHAR(10),"
+						+ "\nOUT p_userId INTEGER,"
+						+ "\nOUT p_userName VARCHAR(30),"
+						+ "\nOUT p_administrador VARCHAR(1))"
+						+ "\nBEGIN"
+						+ (doASelect ? "\nselect 1;"
+								: "\nSELECT 1 INTO p_administrador;")
+								+ "\nEND");
 
-					cstmt.registerOutParameter(6, java.sql.Types.VARCHAR);
+				CallableStatement cstmt = db2Connection
+				.prepareCall("{ call COMPROVAR_USUARI(?, ?, ?, ?, ?, ?) }");
+				cstmt.setString(1, "abc");
+				cstmt.setString(2, "def");
+				cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
+				cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
+				cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
 
-					cstmt.execute();
+				cstmt.registerOutParameter(6, java.sql.Types.VARCHAR);
 
-					if (doASelect) {
-						this.rs = cstmt.getResultSet();
-						assertTrue(this.rs.next());
-						assertEquals(2, this.rs.getInt(1));
-					} else {
-						assertEquals(2, cstmt.getInt(5));
-					}
+				cstmt.execute();
 
-					cstmt = db1Connection
-							.prepareCall("{ call COMPROVAR_USUARI(?, ?, ?, ?, ?, ?) }");
-					cstmt.setString(1, "abc");
-					cstmt.setString(2, "def");
-					cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
-					cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
-					cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
+				if (doASelect) {
+					this.rs = cstmt.getResultSet();
+					assertTrue(this.rs.next());
+					assertEquals(2, this.rs.getInt(1));
+				} else {
+					assertEquals(2, cstmt.getInt(5));
+				}
 
-					try {
-						cstmt.registerOutParameter(6, java.sql.Types.VARCHAR);
-						fail("Should've thrown an exception");
-					} catch (SQLException sqlEx) {
-						assertEquals(SQLError.SQL_STATE_ILLEGAL_ARGUMENT, sqlEx
-								.getSQLState());
-					}
+				cstmt = db1Connection
+				.prepareCall("{ call COMPROVAR_USUARI(?, ?, ?, ?, ?, ?) }");
+				cstmt.setString(1, "abc");
+				cstmt.setString(2, "def");
+				cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
+				cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
+				cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
 
-					cstmt = db1Connection
-							.prepareCall("{ call COMPROVAR_USUARI(?, ?, ?, ?, ?) }");
-					cstmt.setString(1, "abc");
-					cstmt.setString(2, "def");
-					cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
-					cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
-					cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
+				try {
+					cstmt.registerOutParameter(6, java.sql.Types.VARCHAR);
+					fail("Should've thrown an exception");
+				} catch (SQLException sqlEx) {
+					assertEquals(SQLError.SQL_STATE_ILLEGAL_ARGUMENT, sqlEx
+							.getSQLState());
+				}
 
-					cstmt.execute();
+				cstmt = db1Connection
+				.prepareCall("{ call COMPROVAR_USUARI(?, ?, ?, ?, ?) }");
+				cstmt.setString(1, "abc");
+				cstmt.setString(2, "def");
+				cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
+				cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
+				cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
 
-					if (doASelect) {
-						this.rs = cstmt.getResultSet();
-						assertTrue(this.rs.next());
-						assertEquals(1, this.rs.getInt(1));
-					} else {
-						assertEquals(1, cstmt.getInt(5));
-					}
+				cstmt.execute();
 
-					String quoteChar = db2Connection.getMetaData()
-							.getIdentifierQuoteString();
+				if (doASelect) {
+					this.rs = cstmt.getResultSet();
+					assertTrue(this.rs.next());
+					assertEquals(1, this.rs.getInt(1));
+				} else {
+					assertEquals(1, cstmt.getInt(5));
+				}
 
-					cstmt = db2Connection.prepareCall("{ call " + quoteChar
-							+ db1Connection.getCatalog() + quoteChar + "."
-							+ quoteChar + "COMPROVAR_USUARI" + quoteChar
-							+ "(?, ?, ?, ?, ?) }");
-					cstmt.setString(1, "abc");
-					cstmt.setString(2, "def");
-					cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
-					cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
-					cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
+				String quoteChar = db2Connection.getMetaData()
+				.getIdentifierQuoteString();
 
-					cstmt.execute();
+				cstmt = db2Connection.prepareCall("{ call " + quoteChar
+						+ db1Connection.getCatalog() + quoteChar + "."
+						+ quoteChar + "COMPROVAR_USUARI" + quoteChar
+						+ "(?, ?, ?, ?, ?) }");
+				cstmt.setString(1, "abc");
+				cstmt.setString(2, "def");
+				cstmt.registerOutParameter(3, java.sql.Types.INTEGER);
+				cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);
+				cstmt.registerOutParameter(5, java.sql.Types.VARCHAR);
 
-					if (doASelect) {
-						this.rs = cstmt.getResultSet();
-						assertTrue(this.rs.next());
-						assertEquals(1, this.rs.getInt(1));
-					} else {
-						assertEquals(1, cstmt.getInt(5));
-					}
-				} finally {
-					if (db2Connection != null) {
-						db2Connection.createStatement().executeUpdate(
-								"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
-						db2Connection.createStatement().executeUpdate(
-								"DROP DATABASE IF EXISTS db_9319_2");
-					}
+				cstmt.execute();
 
-					if (db1Connection != null) {
-						db1Connection.createStatement().executeUpdate(
-								"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
-						db1Connection.createStatement().executeUpdate(
-								"DROP DATABASE IF EXISTS db_9319_1");
-					}
+				if (doASelect) {
+					this.rs = cstmt.getResultSet();
+					assertTrue(this.rs.next());
+					assertEquals(1, this.rs.getInt(1));
+				} else {
+					assertEquals(1, cstmt.getInt(5));
 				}
+			} finally {
+				if (db2Connection != null) {
+					db2Connection.createStatement().executeUpdate(
+							"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
+					db2Connection.createStatement().executeUpdate(
+					"DROP DATABASE IF EXISTS db_9319_2");
+				}
+
+				if (db1Connection != null) {
+					db1Connection.createStatement().executeUpdate(
+							"DROP PROCEDURE IF EXISTS COMPROVAR_USUARI");
+					db1Connection.createStatement().executeUpdate(
+					"DROP DATABASE IF EXISTS db_9319_1");
+				}
 			}
 		}
 	}
@@ -432,24 +445,26 @@
 	 *             if the test fails.
 	 */
 	public void testBug9682() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			CallableStatement cStmt = null;
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-			try {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug9682");
-				this.stmt
-						.executeUpdate("CREATE PROCEDURE testBug9682(decimalParam DECIMAL(18,0))"
-								+ "\nBEGIN" + "\n   SELECT 1;" + "\nEND");
-				cStmt = this.conn.prepareCall("Call testBug9682(?)");
-				cStmt.setDouble(1, 18.0);
-				cStmt.execute();
-			} finally {
-				if (cStmt != null) {
-					cStmt.close();
-				}
+		CallableStatement cStmt = null;
 
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug9682");
+		try {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug9682");
+			this.stmt
+			.executeUpdate("CREATE PROCEDURE testBug9682(decimalParam DECIMAL(18,0))"
+					+ "\nBEGIN" + "\n   SELECT 1;" + "\nEND");
+			cStmt = this.conn.prepareCall("Call testBug9682(?)");
+			cStmt.setDouble(1, 18.0);
+			cStmt.execute();
+		} finally {
+			if (cStmt != null) {
+				cStmt.close();
 			}
+
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug9682");
 		}
 	}
 
@@ -462,114 +477,116 @@
 	 *             if the test fails.
 	 */
 	public void testBug10310() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			CallableStatement cStmt = null;
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-			try {
-				this.stmt.executeUpdate("DROP FUNCTION IF EXISTS testBug10310");
-				this.stmt
-						.executeUpdate("CREATE FUNCTION testBug10310(a float, b bigint, c int) RETURNS INT"
-								+ "\nBEGIN" + "\nRETURN a;" + "\nEND");
-				cStmt = this.conn.prepareCall("{? = CALL testBug10310(?,?,?)}");
-				cStmt.registerOutParameter(1, Types.INTEGER);
-				cStmt.setFloat(2, 2);
-				cStmt.setInt(3, 1);
-				cStmt.setInt(4, 1);
-				
-				if (!isRunningOnJdk131()) {
-					assertEquals(4, cStmt.getParameterMetaData().getParameterCount());
-					assertEquals(Types.INTEGER, cStmt.getParameterMetaData().getParameterType(1));
-				}
-				
-				assertFalse(cStmt.execute());
-				assertEquals(2f, cStmt.getInt(1), .001);
-				assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
-						.getName());
+		CallableStatement cStmt = null;
 
-				assertEquals(-1, cStmt.executeUpdate());
-				assertEquals(2f, cStmt.getInt(1), .001);
-				assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
-						.getName());
+		try {
+			this.stmt.executeUpdate("DROP FUNCTION IF EXISTS testBug10310");
+			this.stmt
+			.executeUpdate("CREATE FUNCTION testBug10310(a float, b bigint, c int) RETURNS INT"
+					+ "\nBEGIN" + "\nRETURN a;" + "\nEND");
+			cStmt = this.conn.prepareCall("{? = CALL testBug10310(?,?,?)}");
+			cStmt.registerOutParameter(1, Types.INTEGER);
+			cStmt.setFloat(2, 2);
+			cStmt.setInt(3, 1);
+			cStmt.setInt(4, 1);
 
-				if (!isRunningOnJdk131()) {
-					cStmt.setFloat("a", 4);
-					cStmt.setInt("b", 1);
-					cStmt.setInt("c", 1);
-					
-					assertFalse(cStmt.execute());
-					assertEquals(4f, cStmt.getInt(1), .001);
-					assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
-							.getName());
-					
-					assertEquals(-1, cStmt.executeUpdate());
-					assertEquals(4f, cStmt.getInt(1), .001);
-					assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
-							.getName());
-				}
-				
-				// Check metadata while we're at it
+			if (!isRunningOnJdk131()) {
+				assertEquals(4, cStmt.getParameterMetaData().getParameterCount());
+				assertEquals(Types.INTEGER, cStmt.getParameterMetaData().getParameterType(1));
+			}
 
-				java.sql.DatabaseMetaData dbmd = this.conn.getMetaData();
+			assertFalse(cStmt.execute());
+			assertEquals(2f, cStmt.getInt(1), .001);
+			assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
+					.getName());
 
-				this.rs = dbmd.getProcedures(this.conn.getCatalog(), null,
-						"testBug10310");
-				this.rs.next();
-				assertEquals("testBug10310", this.rs
-						.getString("PROCEDURE_NAME"));
-				assertEquals(DatabaseMetaData.procedureReturnsResult, this.rs
-						.getShort("PROCEDURE_TYPE"));
-				cStmt.setNull(2, Types.FLOAT);
-				cStmt.setInt(3, 1);
-				cStmt.setInt(4, 1);
-				
-				assertFalse(cStmt.execute());
-				assertEquals(0f, cStmt.getInt(1), .001);
-				assertEquals(true, cStmt.wasNull());
-				assertEquals(null, cStmt.getObject(1));
-				assertEquals(true, cStmt.wasNull());
+			assertEquals(-1, cStmt.executeUpdate());
+			assertEquals(2f, cStmt.getInt(1), .001);
+			assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
+					.getName());
 
-				assertEquals(-1, cStmt.executeUpdate());
-				assertEquals(0f, cStmt.getInt(1), .001);
-				assertEquals(true, cStmt.wasNull());
-				assertEquals(null, cStmt.getObject(1));
-				assertEquals(true, cStmt.wasNull());
+			if (!isRunningOnJdk131()) {
+				cStmt.setFloat("a", 4);
+				cStmt.setInt("b", 1);
+				cStmt.setInt("c", 1);
 
-
-				// Check with literals, not all parameters filled!
-				cStmt = this.conn.prepareCall("{? = CALL testBug10310(4,5,?)}");
-				cStmt.registerOutParameter(1, Types.INTEGER);
-				cStmt.setInt(2, 1);
-				
 				assertFalse(cStmt.execute());
 				assertEquals(4f, cStmt.getInt(1), .001);
 				assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
 						.getName());
-				
+
 				assertEquals(-1, cStmt.executeUpdate());
 				assertEquals(4f, cStmt.getInt(1), .001);
 				assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
 						.getName());
-				
-				if (!isRunningOnJdk131()) {
-					assertEquals(2, cStmt.getParameterMetaData().getParameterCount());
-					assertEquals(Types.INTEGER, cStmt.getParameterMetaData().getParameterType(1));
-					assertEquals(Types.INTEGER, cStmt.getParameterMetaData().getParameterType(2));
-				}
-			} finally {
-				if (this.rs != null) {
-					this.rs.close();
-					this.rs = null;
-				}
+			}
 
-				if (cStmt != null) {
-					cStmt.close();
-				}
+			// Check metadata while we're at it
 
-				this.stmt.executeUpdate("DROP FUNCTION IF EXISTS testBug10310");
+			java.sql.DatabaseMetaData dbmd = this.conn.getMetaData();
+
+			this.rs = dbmd.getProcedures(this.conn.getCatalog(), null,
+			"testBug10310");
+			this.rs.next();
+			assertEquals("testBug10310", this.rs
+					.getString("PROCEDURE_NAME"));
+			assertEquals(DatabaseMetaData.procedureReturnsResult, this.rs
+					.getShort("PROCEDURE_TYPE"));
+			cStmt.setNull(2, Types.FLOAT);
+			cStmt.setInt(3, 1);
+			cStmt.setInt(4, 1);
+
+			assertFalse(cStmt.execute());
+			assertEquals(0f, cStmt.getInt(1), .001);
+			assertEquals(true, cStmt.wasNull());
+			assertEquals(null, cStmt.getObject(1));
+			assertEquals(true, cStmt.wasNull());
+
+			assertEquals(-1, cStmt.executeUpdate());
+			assertEquals(0f, cStmt.getInt(1), .001);
+			assertEquals(true, cStmt.wasNull());
+			assertEquals(null, cStmt.getObject(1));
+			assertEquals(true, cStmt.wasNull());
+
+
+			// Check with literals, not all parameters filled!
+			cStmt = this.conn.prepareCall("{? = CALL testBug10310(4,5,?)}");
+			cStmt.registerOutParameter(1, Types.INTEGER);
+			cStmt.setInt(2, 1);
+
+			assertFalse(cStmt.execute());
+			assertEquals(4f, cStmt.getInt(1), .001);
+			assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
+					.getName());
+
+			assertEquals(-1, cStmt.executeUpdate());
+			assertEquals(4f, cStmt.getInt(1), .001);
+			assertEquals("java.lang.Integer", cStmt.getObject(1).getClass()
+					.getName());
+
+			if (!isRunningOnJdk131()) {
+				assertEquals(2, cStmt.getParameterMetaData().getParameterCount());
+				assertEquals(Types.INTEGER, cStmt.getParameterMetaData().getParameterType(1));
+				assertEquals(Types.INTEGER, cStmt.getParameterMetaData().getParameterType(2));
 			}
+		} finally {
+			if (this.rs != null) {
+				this.rs.close();
+				this.rs = null;
+			}
+
+			if (cStmt != null) {
+				cStmt.close();
+			}
+
+			this.stmt.executeUpdate("DROP FUNCTION IF EXISTS testBug10310");
 		}
 	}
-	
+
 	/**
 	 * Tests fix for Bug#12417 - stored procedure catalog name is case-sensitive
 	 * on Windows (this is actually a server bug, but we have a workaround in
@@ -579,15 +596,15 @@
 	 *             if the test fails.
 	 */
 	public void testBug12417() throws Exception {
-		if (versionMeetsMinimum(5, 0) && isServerRunningOnWindows()) {
+		if (serverSupportsStoredProcedures() && isServerRunningOnWindows()) {
 			Connection ucCatalogConn = null;
 
 			try {
 				this.stmt
-						.executeUpdate("DROP PROCEDURE IF EXISTS testBug12417");
+				.executeUpdate("DROP PROCEDURE IF EXISTS testBug12417");
 				this.stmt.executeUpdate("CREATE PROCEDURE testBug12417()\n"
 						+ "BEGIN\n" + "SELECT 1;" + "end\n");
-				ucCatalogConn = getConnectionWithProps((String)null);
+				ucCatalogConn = getConnectionWithProps(null);
 				ucCatalogConn.setCatalog(this.conn.getCatalog().toUpperCase());
 				ucCatalogConn.prepareCall("{call testBug12417()}");
 			} finally {
@@ -604,7 +621,7 @@
 		if (false /* needs to be fixed on server */) {
 			if (versionMeetsMinimum(5, 0)) {
 				this.stmt
-						.executeUpdate("DROP PROCEDURE IF EXISTS p_testBug15121");
+				.executeUpdate("DROP PROCEDURE IF EXISTS p_testBug15121");
 
 				this.stmt.executeUpdate("CREATE PROCEDURE p_testBug15121()\n"
 						+ "BEGIN\n" + "SELECT * from idonotexist;\n" + "END");
@@ -619,7 +636,7 @@
 
 					StringBuffer queryBuf = new StringBuffer("{call ");
 					String quotedId = this.conn.getMetaData()
-							.getIdentifierQuoteString();
+					.getIdentifierQuoteString();
 					queryBuf.append(quotedId);
 					queryBuf.append(this.conn.getCatalog());
 					queryBuf.append(quotedId);
@@ -643,35 +660,36 @@
 	 */
 
 	public void testBug15464() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			CallableStatement storedProc = null;
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
+		CallableStatement storedProc = null;
 
-			try {
-				this.stmt
-						.executeUpdate("DROP PROCEDURE IF EXISTS testInOutParam");
-				this.stmt
-						.executeUpdate("create procedure testInOutParam(IN p1 VARCHAR(255), INOUT p2
INT)\n"
-								+ "begin\n"
-								+ " DECLARE z INT;\n"
-								+ "SET z = p2 + 1;\n"
-								+ "SET p2 = z;\n"
-								+ "SELECT p1;\n"
-								+ "SELECT CONCAT('zyxw', p1);\n" + "end\n");
+		try {
+			this.stmt
+			.executeUpdate("DROP PROCEDURE IF EXISTS testInOutParam");
+			this.stmt
+			.executeUpdate("create procedure testInOutParam(IN p1 VARCHAR(255), INOUT p2 INT)\n"
+					+ "begin\n"
+					+ " DECLARE z INT;\n"
+					+ "SET z = p2 + 1;\n"
+					+ "SET p2 = z;\n"
+					+ "SELECT p1;\n"
+					+ "SELECT CONCAT('zyxw', p1);\n" + "end\n");
 
-				storedProc = this.conn
-						.prepareCall("{call testInOutParam(?, ?)}");
+			storedProc = this.conn
+			.prepareCall("{call testInOutParam(?, ?)}");
 
-				storedProc.setString(1, "abcd");
-				storedProc.setInt(2, 4);
-				storedProc.registerOutParameter(2, Types.INTEGER);
+			storedProc.setString(1, "abcd");
+			storedProc.setInt(2, 4);
+			storedProc.registerOutParameter(2, Types.INTEGER);
 
-				storedProc.execute();
+			storedProc.execute();
 
-				assertEquals(5, storedProc.getInt(2));
-			} finally {
-				this.stmt
-						.executeUpdate("DROP PROCEDURE IF EXISTS testInOutParam");
-			}
+			assertEquals(5, storedProc.getInt(2));
+		} finally {
+			this.stmt
+			.executeUpdate("DROP PROCEDURE IF EXISTS testInOutParam");
 		}
 	}
 
@@ -685,24 +703,27 @@
 	 *             if the test fails
 	 */
 	public void testBug17898() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug17898");
-			this.stmt
-					.executeUpdate("CREATE PROCEDURE testBug17898(param1 VARCHAR(50), OUT param2
INT)\nBEGIN\nDECLARE rtn INT;\nSELECT 1 INTO rtn;\nSET param2=rtn;\nEND");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-			CallableStatement cstmt = this.conn
-					.prepareCall("{CALL testBug17898('foo', ?)}");
-			cstmt.registerOutParameter(1, Types.INTEGER);
+		this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug17898");
+		this.stmt
+		.executeUpdate("CREATE PROCEDURE testBug17898(param1 VARCHAR(50), OUT param2
INT)\nBEGIN\nDECLARE rtn INT;\nSELECT 1 INTO rtn;\nSET param2=rtn;\nEND");
+
+		CallableStatement cstmt = this.conn
+		.prepareCall("{CALL testBug17898('foo', ?)}");
+		cstmt.registerOutParameter(1, Types.INTEGER);
+		cstmt.execute();
+		assertEquals(1, cstmt.getInt(1));
+
+		if (!isRunningOnJdk131()) {
+			cstmt.clearParameters();
+			cstmt.registerOutParameter("param2", Types.INTEGER);
 			cstmt.execute();
 			assertEquals(1, cstmt.getInt(1));
+		}
 
-			if (!isRunningOnJdk131()) {
-				cstmt.clearParameters();
-				cstmt.registerOutParameter("param2", Types.INTEGER);
-				cstmt.execute();
-				assertEquals(1, cstmt.getInt(1));
-			}
-		}
 	}
 
 	/**
@@ -712,24 +733,27 @@
 	 * @throws Exception if the test fails.
 	 */
 	public void testBug21462() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			CallableStatement cstmt = null;
-			
-			try {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug21462");
-				this.stmt.executeUpdate("CREATE PROCEDURE testBug21462() BEGIN SELECT 1; END");
-				cstmt = this.conn.prepareCall("{CALL testBug21462}");
-				cstmt.execute();
-			} finally {
-				if (cstmt != null) {
-					cstmt.close();
-				}
-				
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug21462");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
+
+		CallableStatement cstmt = null;
+
+		try {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug21462");
+			this.stmt.executeUpdate("CREATE PROCEDURE testBug21462() BEGIN SELECT 1; END");
+			cstmt = this.conn.prepareCall("{CALL testBug21462}");
+			cstmt.execute();
+		} finally {
+			if (cstmt != null) {
+				cstmt.close();
 			}
+
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug21462");
 		}
+
 	}
-	
+
 	/** 
 	 * Tests fix for BUG#22024 - Newlines causing whitespace to span confuse
 	 * procedure parser when getting parameter metadata for stored procedures.
@@ -737,30 +761,33 @@
 	 * @throws Exception if the test fails
 	 */
 	public void testBug22024() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			CallableStatement cstmt = null;
-			
-			try {
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22024");
-				this.stmt.executeUpdate("CREATE PROCEDURE testBug22024(\r\n)\r\n BEGIN SELECT 1;
END");
-				cstmt = this.conn.prepareCall("{CALL testBug22024()}");
-				cstmt.execute();
-				
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22024");
-				this.stmt.executeUpdate("CREATE PROCEDURE testBug22024(\r\na INT)\r\n BEGIN SELECT 1;
END");
-				cstmt = this.conn.prepareCall("{CALL testBug22024(?)}");
-				cstmt.setInt(1, 1);
-				cstmt.execute();
-			} finally {
-				if (cstmt != null) {
-					cstmt.close();
-				}
-				
-				this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22024");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
+
+		CallableStatement cstmt = null;
+
+		try {
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22024");
+			this.stmt.executeUpdate("CREATE PROCEDURE testBug22024(\r\n)\r\n BEGIN SELECT 1;
END");
+			cstmt = this.conn.prepareCall("{CALL testBug22024()}");
+			cstmt.execute();
+
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22024");
+			this.stmt.executeUpdate("CREATE PROCEDURE testBug22024(\r\na INT)\r\n BEGIN SELECT 1;
END");
+			cstmt = this.conn.prepareCall("{CALL testBug22024(?)}");
+			cstmt.setInt(1, 1);
+			cstmt.execute();
+		} finally {
+			if (cstmt != null) {
+				cstmt.close();
 			}
+
+			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22024");
 		}
+
 	}
-	
+
 	/**
 	 * Tests workaround for server crash when calling stored procedures
 	 * via a server-side prepared statement (driver now detects 
@@ -769,163 +796,172 @@
 	 * @throws Exception if the test fails
 	 */
 	public void testBug22297() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22297");
-			
-			createTable("tblTestBug2297_1", "("
-					+ "id varchar(20) NOT NULL default '',"
-					+ "Income double(19,2) default NULL)");	
-			
-			createTable("tblTestBug2297_2", "("
-					+ "id varchar(20) NOT NULL default ''," 
-					+ "CreatedOn datetime default NULL)");
-			
-			this.stmt.executeUpdate("CREATE PROCEDURE testBug22297(pcaseid INT)"
-					+ "BEGIN"
-					+ "\nSET @sql = \"DROP TEMPORARY TABLE IF EXISTS tmpOrders\";"
-					+ " PREPARE stmt FROM @sql;"
-					+ " EXECUTE stmt;"
-					+ " DEALLOCATE PREPARE stmt;"
-					+ "\nSET @sql = \"CREATE TEMPORARY TABLE tmpOrders SELECT id, 100 AS Income FROM
tblTestBug2297_1 GROUP BY id\";"
-					+ " PREPARE stmt FROM @sql;"
-					+ " EXECUTE stmt;"
-					+ " DEALLOCATE PREPARE stmt;"
-					+ "\n SELECT id, Income FROM (SELECT e.id AS id ,COALESCE(prof.Income,0) AS Income"
-					+ "\n FROM tblTestBug2297_2 e LEFT JOIN tmpOrders prof ON e.id = prof.id"
-					+ "\n WHERE e.CreatedOn > '2006-08-01') AS Final ORDER BY id;" 
-					+ "\nEND");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-			this.stmt.executeUpdate("INSERT INTO tblTestBug2297_1 (`id`,`Income`) VALUES "
-					+ "('a',4094.00),"
-					+ "('b',500.00),"
-					+ "('c',3462.17),"
-					+ " ('d',500.00),"
-					+ " ('e',600.00)");
-			
-			this.stmt.executeUpdate("INSERT INTO tblTestBug2297_2 (`id`,`CreatedOn`) VALUES "
-					+ "('d','2006-08-31 00:00:00'),"
-					+ "('e','2006-08-31 00:00:00'),"
+		this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug22297");
+
+		createTable("tblTestBug2297_1", "("
+				+ "id varchar(20) NOT NULL default '',"
+				+ "Income double(19,2) default NULL)");	
+
+		createTable("tblTestBug2297_2", "("
+				+ "id varchar(20) NOT NULL default ''," 
+				+ "CreatedOn datetime default NULL)");
+
+		this.stmt.executeUpdate("CREATE PROCEDURE testBug22297(pcaseid INT)"
+				+ "BEGIN"
+				+ "\nSET @sql = \"DROP TEMPORARY TABLE IF EXISTS tmpOrders\";"
+				+ " PREPARE stmt FROM @sql;"
+				+ " EXECUTE stmt;"
+				+ " DEALLOCATE PREPARE stmt;"
+				+ "\nSET @sql = \"CREATE TEMPORARY TABLE tmpOrders SELECT id, 100 AS Income FROM
tblTestBug2297_1 GROUP BY id\";"
+				+ " PREPARE stmt FROM @sql;"
+				+ " EXECUTE stmt;"
+				+ " DEALLOCATE PREPARE stmt;"
+				+ "\n SELECT id, Income FROM (SELECT e.id AS id ,COALESCE(prof.Income,0) AS Income"
+				+ "\n FROM tblTestBug2297_2 e LEFT JOIN tmpOrders prof ON e.id = prof.id"
+				+ "\n WHERE e.CreatedOn > '2006-08-01') AS Final ORDER BY id;" 
+				+ "\nEND");
+
+		this.stmt.executeUpdate("INSERT INTO tblTestBug2297_1 (`id`,`Income`) VALUES "
+				+ "('a',4094.00),"
+				+ "('b',500.00),"
+				+ "('c',3462.17),"
+				+ " ('d',500.00),"
+				+ " ('e',600.00)");
+
+		this.stmt.executeUpdate("INSERT INTO tblTestBug2297_2 (`id`,`CreatedOn`) VALUES "
+				+ "('d','2006-08-31 00:00:00'),"
+				+ "('e','2006-08-31 00:00:00'),"
 				+ "('b','2006-08-31 00:00:00'),"
 				+ "('c','2006-08-31 00:00:00'),"
 				+ "('a','2006-08-31 00:00:00')");
-			
-			try {
-				this.pstmt = this.conn.prepareStatement("{CALL testBug22297(?)}");
-				this.pstmt.setInt(1, 1);
-				this.rs =this.pstmt.executeQuery();
-                
-				String[] ids = new String[] { "a", "b", "c", "d", "e"};
-                int pos = 0;
-                
-                while (this.rs.next()) {
-                	assertEquals(ids[pos++], rs.getString(1));
-                	assertEquals(100, rs.getInt(2));
-                }
-                
-                assertEquals(this.pstmt.getClass().getName(),
-                		com.mysql.jdbc.PreparedStatement.class.getName());
 
-			} finally {
-				closeMemberJDBCResources();
+		try {
+			this.pstmt = this.conn.prepareStatement("{CALL testBug22297(?)}");
+			this.pstmt.setInt(1, 1);
+			this.rs =this.pstmt.executeQuery();
+
+			String[] ids = new String[] { "a", "b", "c", "d", "e"};
+			int pos = 0;
+
+			while (this.rs.next()) {
+				assertEquals(ids[pos++], rs.getString(1));
+				assertEquals(100, rs.getInt(2));
 			}
+
+			assertEquals(this.pstmt.getClass().getName(),
+					com.mysql.jdbc.PreparedStatement.class.getName());
+
+		} finally {
+			closeMemberJDBCResources();
 		}
+
 	}
-	
+
 	public void testHugeNumberOfParameters() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			this.stmt
-					.executeUpdate("DROP PROCEDURE IF EXISTS testHugeNumberOfParameters");
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-			StringBuffer procDef = new StringBuffer(
-					"CREATE PROCEDURE testHugeNumberOfParameters(");
+		this.stmt
+		.executeUpdate("DROP PROCEDURE IF EXISTS testHugeNumberOfParameters");
 
-			for (int i = 0; i < 274; i++) {
-				if (i != 0) {
-					procDef.append(",");
-				}
+		StringBuffer procDef = new StringBuffer(
+		"CREATE PROCEDURE testHugeNumberOfParameters(");
 
-				procDef.append(" OUT param_" + i + " VARCHAR(32)");
+		for (int i = 0; i < 274; i++) {
+			if (i != 0) {
+				procDef.append(",");
 			}
 
-			procDef.append(")\nBEGIN\nSELECT 1;\nEND");
-			this.stmt.executeUpdate(procDef.toString());
+			procDef.append(" OUT param_" + i + " VARCHAR(32)");
+		}
 
-			CallableStatement cStmt = null;
+		procDef.append(")\nBEGIN\nSELECT 1;\nEND");
+		this.stmt.executeUpdate(procDef.toString());
 
-			try {
-				cStmt = this.conn
-						.prepareCall("{call
testHugeNumberOfParameters(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
-								+
+		CallableStatement cStmt = null;
 
-								"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
-								+
"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
-								+
"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
-								+
"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
-								+
"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
-								+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
-				cStmt.registerOutParameter(274, Types.VARCHAR);
+		try {
+			cStmt = this.conn
+			.prepareCall("{call
testHugeNumberOfParameters(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
+					+
 
-				cStmt.execute();
-			} finally {
-				if (cStmt != null) {
-					cStmt.close();
-				}
+					"?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
+					+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
+					+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
+					+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
+					+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
+					+ "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
+			cStmt.registerOutParameter(274, Types.VARCHAR);
+
+			cStmt.execute();
+		} finally {
+			if (cStmt != null) {
+				cStmt.close();
 			}
 		}
 	}
 
 	public void testPrepareOfMultiRs() throws Exception {
-		if (versionMeetsMinimum(5, 0)) {
-			this.stmt.executeUpdate("Drop procedure if exists p");
-			this.stmt
-					.executeUpdate("create procedure p () begin select 1; select 2; end;");
-			PreparedStatement ps = null;
+		if (!serverSupportsStoredProcedures()) {
+			return;
+		}
 
-			try {
-				ps = this.conn.prepareStatement("call p()");
 
-				ps.execute();
-				this.rs = ps.getResultSet();
-				assertTrue(this.rs.next());
-				assertEquals(1, this.rs.getInt(1));
-				assertTrue(ps.getMoreResults());
-				this.rs = ps.getResultSet();
-				assertTrue(this.rs.next());
-				assertEquals(2, this.rs.getInt(1));
-				assertTrue(!ps.getMoreResults());
-			} finally {
-				if (this.rs != null) {
-					this.rs.close();
-					this.rs = null;
-				}
+		this.stmt.executeUpdate("Drop procedure if exists p");
+		this.stmt
+		.executeUpdate("create procedure p () begin select 1; select 2; end;");
+		PreparedStatement ps = null;
 
-				if (ps != null) {
-					ps.close();
-				}
+		try {
+			ps = this.conn.prepareStatement("call p()");
+
+			ps.execute();
+			this.rs = ps.getResultSet();
+			assertTrue(this.rs.next());
+			assertEquals(1, this.rs.getInt(1));
+			assertTrue(ps.getMoreResults());
+			this.rs = ps.getResultSet();
+			assertTrue(this.rs.next());
+			assertEquals(2, this.rs.getInt(1));
+			assertTrue(!ps.getMoreResults());
+		} finally {
+			if (this.rs != null) {
+				this.rs.close();
+				this.rs = null;
 			}
+
+			if (ps != null) {
+				ps.close();
+			}
 		}
+
 	}
-	
+
 	/**
 	 * Tests fix for BUG#25379 - INOUT parameters in CallableStatements get doubly-escaped.
 	 * 
 	 * @throws Exception if the test fails.
 	 */
 	public void testBug25379() throws Exception {
-		if (!versionMeetsMinimum(5, 0)) {
+		if (!serverSupportsStoredProcedures()) {
 			return;
 		}
-		
+
 		createTable("testBug25379", "(col char(40))");
-		
+
 		try {
 			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS sp_testBug25379");
 			this.stmt.executeUpdate("CREATE PROCEDURE sp_testBug25379 (INOUT invalue char(255))"
 					+ "\nBEGIN"
 					+ "\ninsert into testBug25379(col) values(invalue);"
 					+ "\nEND");
-	
-			
+
+
 			CallableStatement cstmt = this.conn.prepareCall("{call sp_testBug25379(?)}");
 			cstmt.setString(1,"'john'");
 			cstmt.executeUpdate();
@@ -935,65 +971,131 @@
 			this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS sp_testBug25379");
 		}
 	}
-	
+
+	/**
+	 * Tests fix for BUG#25715 - CallableStatements with OUT/INOUT parameters that
+	 * are "binary" have extra 7 bytes (which happens to be the _binary introducer!)
+	 * 
+	 * @throws Exception if the test fails.
+	 */
+	public void testBug25715() throws Exception {
+		if (!serverSupportsStoredProcedures()) {
+			return; // no stored procs
+		}
+
+		createProcedure("spbug25715", "(INOUT mblob MEDIUMBLOB)" + "BEGIN"
+				+ " SELECT 1 FROM DUAL WHERE 1=0;" + "\nEND");
+		CallableStatement cstmt = null;
+
+		try {
+			cstmt = this.conn.prepareCall("{call spbug25715(?)}");
+
+			byte[] buf = new byte[65];
+			for (int i = 0; i < 65; i++)
+				buf[i] = 1;
+			int il = buf.length;
+
+			int[] typesToTest = new int[] { Types.BIT, Types.BINARY, Types.BLOB,
Types.JAVA_OBJECT,
+					Types.LONGVARBINARY, Types.VARBINARY };
+
+			for (int i = 0; i < typesToTest.length; i++) {
+
+				cstmt.setBinaryStream("mblob", new ByteArrayInputStream(buf),
+						buf.length);
+				cstmt.registerOutParameter("mblob", typesToTest[i]);
+
+				cstmt.executeUpdate();
+
+				InputStream is = cstmt.getBlob("mblob").getBinaryStream();
+				ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+
+				int bytesRead = 0;
+				byte[] readBuf = new byte[256];
+
+				while ((bytesRead = is.read(readBuf)) != -1) {
+					bOut.write(readBuf, 0, bytesRead);
+				}
+
+				byte[] fromSelectBuf = bOut.toByteArray();
+
+				int ol = fromSelectBuf.length;
+
+				assertEquals(il, ol);
+			}
+
+			cstmt.close();
+		} finally {
+			closeMemberJDBCResources();
+
+			if (cstmt != null) {
+				cstmt.close();
+			}
+		}
+
+	}
+
+	protected boolean serverSupportsStoredProcedures() throws SQLException {
+		return versionMeetsMinimum(5, 0);
+	}
+
 	public void testBug26143() throws Exception {
-		if (!versionMeetsMinimum(5, 0)) {
+		if (!serverSupportsStoredProcedures()) {
 			return; // no stored procedure support
 		}
-		
+
 		this.stmt.executeUpdate("DROP PROCEDURE IF EXISTS testBug26143");
 
 		this.stmt.executeUpdate("CREATE DEFINER=CURRENT_USER PROCEDURE testBug26143(I INT)
COMMENT 'abcdefg'"
 				+ "\nBEGIN\n"
 				+ "SELECT I * 10;"
 				+ "\nEND");
-		
+
 		this.conn.prepareCall("{call testBug26143(?)").close();
 	}
-	
+
 	/**
 	 * Tests fix for BUG#26959 - comments confuse procedure parser.
 	 * 
 	 * @throws Exception if the test fails
 	 */
 	public void testBug26959() throws Exception {
-		if (!versionMeetsMinimum(5, 0)) {
+		if (!serverSupportsStoredProcedures()) {
 			return;
 		}
 
 		createProcedure(
 				"testBug26959",
 				"(_ACTION varchar(20),"
-						+ "\n`/*dumb-identifier-1*/` int,"
-						+ "\n`#dumb-identifier-2` int,"
-						+ "\n`--dumb-identifier-3` int,"
-						+ "\n_CLIENT_ID int, -- ABC"
-						+ "\n_LOGIN_ID  int, # DEF"
-						+ "\n_WHERE varchar(2000),"
-						+ "\n_SORT varchar(2000),"
-						+ "\n out _SQL varchar(/* inline right here - oh my gosh! */ 8000),"
-						+ "\n _SONG_ID int,"
-						+ "\n  _NOTES varchar(2000),"
-						+ "\n out _RESULT varchar(10)"
-						+ "\n /*"
-						+ "\n ,    -- Generic result parameter"
-						+ "\n out _PERIOD_ID int,         -- Returns the period_id. Useful when using
@PREDEFLINK to return which is the last period"
-						+ "\n   _SONGS_LIST varchar(8000),"
-						+ "\n  _COMPOSERID int,"
-						+ "\n  _PUBLISHERID int,"
-						+ "\n   _PREDEFLINK int        -- If the user is accessing through a predefined
link: 0=none  1=last period"
-						+ "\n */) BEGIN SELECT 1; END");
+				+ "\n`/*dumb-identifier-1*/` int,"
+				+ "\n`#dumb-identifier-2` int,"
+				+ "\n`--dumb-identifier-3` int,"
+				+ "\n_CLIENT_ID int, -- ABC"
+				+ "\n_LOGIN_ID  int, # DEF"
+				+ "\n_WHERE varchar(2000),"
+				+ "\n_SORT varchar(2000),"
+				+ "\n out _SQL varchar(/* inline right here - oh my gosh! */ 8000),"
+				+ "\n _SONG_ID int,"
+				+ "\n  _NOTES varchar(2000),"
+				+ "\n out _RESULT varchar(10)"
+				+ "\n /*"
+				+ "\n ,    -- Generic result parameter"
+				+ "\n out _PERIOD_ID int,         -- Returns the period_id. Useful when using
@PREDEFLINK to return which is the last period"
+				+ "\n   _SONGS_LIST varchar(8000),"
+				+ "\n  _COMPOSERID int,"
+				+ "\n  _PUBLISHERID int,"
+				+ "\n   _PREDEFLINK int        -- If the user is accessing through a predefined link:
0=none  1=last period"
+				+ "\n */) BEGIN SELECT 1; END");
 
 		createProcedure(
 				"testBug26959_1",
 				"(`/*id*/` /* before type 1 */ varchar(20),"
-						+ "/* after type 1 */ OUT result2 DECIMAL(/*size1*/10,/*size2*/2) /* p2 */)"
-						+ "BEGIN SELECT action, result; END");
+				+ "/* after type 1 */ OUT result2 DECIMAL(/*size1*/10,/*size2*/2) /* p2 */)"
+				+ "BEGIN SELECT action, result; END");
 
 		try {
 			this.conn.prepareCall(
-					"{call testBug26959(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}")
-					.close();
+			"{call testBug26959(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}")
+			.close();
 			this.rs = this.conn.getMetaData().getProcedureColumns(
 					this.conn.getCatalog(), null, "testBug26959", "%");
 
@@ -1063,19 +1165,19 @@
 			closeMemberJDBCResources();
 		}
 	}
-	
+
 	/**
 	 * Tests fix for BUG#27400 - CALL [comment] some_proc() doesn't work
 	 */
 	public void testBug27400() throws Exception {
-		if (!versionMeetsMinimum(5, 0)) {
+		if (!serverSupportsStoredProcedures()) {
 			return; // SPs not supported
 		}
-		
+
 		createProcedure("testBug27400", "(a INT, b VARCHAR(32)) BEGIN SELECT 1; END");
-		
+
 		CallableStatement cStmt = null;
-		
+
 		try {
 			cStmt = this.conn.prepareCall("{CALL /* SOME COMMENT */ testBug27400( /* does this
work too? */ ?, ?)} # and a commented ? here too");
 			assertTrue(cStmt.toString().indexOf("/*") != -1); // we don't want to strip the
comments

Thread
Connector/J commit: r6370 - branches/branch_5_0/connector-j branches/branch_5_0/connector-j/src/com/mysql/jdbc branches/branch_5_0/connector-j/src/tes...mmatthews26 Mar