Added:
branches/branch_5_0/connector-j/src/com/mysql/jdbc/jdbc2/optional/.MysqlConnectionPoolDataSource.java.swp
Modified:
branches/branch_5_0/connector-j/CHANGES
branches/branch_5_0/connector-j/src/com/mysql/jdbc/Connection.java
branches/branch_5_0/connector-j/src/com/mysql/jdbc/ServerPreparedStatement.java
branches/branch_5_0/connector-j/src/testsuite/regression/StatementRegressionTest.java
trunk/connector-j/CHANGES
trunk/connector-j/src/com/mysql/jdbc/Connection.java
trunk/connector-j/src/com/mysql/jdbc/ServerPreparedStatement.java
trunk/connector-j/src/testsuite/regression/StatementRegressionTest.java
Log:
Fixed BUG#22290 - Driver issues truncation on write exception when
it shouldn't (due to sending big decimal incorrectly to server with
server-side prepared statement).
Modified: branches/branch_5_0/connector-j/CHANGES
===================================================================
--- branches/branch_5_0/connector-j/CHANGES 2006-09-26 00:01:23 UTC (rev 5770)
+++ branches/branch_5_0/connector-j/CHANGES 2006-09-26 19:22:11 UTC (rev 5771)
@@ -37,6 +37,10 @@
- Added new _ci collations to CharsetMapping, fixing
Bug#22456 - utf8_unicode_ci not working.
+ - Fixed BUG#22290 - Driver issues truncation on write exception when
+ it shouldn't (due to sending big decimal incorrectly to server with
+ server-side prepared statement).
+
07-26-06 - Version 5.0.3
- Fixed BUG#20650 - Statement.cancel() causes NullPointerException
@@ -256,6 +260,10 @@
- Removed logger autodectection altogether, must now specify logger
explitly if you want to use a logger other than one that logs
to STDERR.
+
+ - Fixed BUG#22290 - Driver issues truncation on write exception when
+ it shouldn't (due to sending big decimal incorrectly to server with
+ server-side prepared statement).
05-26-06 - Version 3.1.13
Modified: branches/branch_5_0/connector-j/src/com/mysql/jdbc/Connection.java
===================================================================
--- branches/branch_5_0/connector-j/src/com/mysql/jdbc/Connection.java 2006-09-26 00:01:23
UTC (rev 5770)
+++ branches/branch_5_0/connector-j/src/com/mysql/jdbc/Connection.java 2006-09-26 19:22:11
UTC (rev 5771)
@@ -4109,12 +4109,14 @@
private void setupServerForTruncationChecks() throws SQLException {
if (getJdbcCompliantTruncation()) {
if (versionMeetsMinimum(5, 0, 2)) {
+
String currentSqlMode =
(String)this.serverVariables.get("sql_mode");
+ boolean strictTransTablesIsSet = StringUtils.indexOfIgnoreCase(currentSqlMode,
"STRICT_TRANS_TABLES") != -1;
+
if (currentSqlMode == null ||
- currentSqlMode.length() == 0 ||
- StringUtils.indexOfIgnoreCase(currentSqlMode, "STRICT_TRANS_TABLES") == -1) {
+ currentSqlMode.length() == 0 || !strictTransTablesIsSet) {
StringBuffer commandBuf = new StringBuffer("SET sql_mode='");
if (currentSqlMode != null && currentSqlMode.length() > 0) {
@@ -4130,6 +4132,9 @@
this.database, true, false);
setJdbcCompliantTruncation(false); // server's handling this for us now
+ } else if (strictTransTablesIsSet) {
+ // We didn't set it, but someone did, so we piggy back on it
+ setJdbcCompliantTruncation(false); // server's handling this for us now
}
}
@@ -5459,13 +5464,27 @@
}
/**
- * DOCUMENT ME!
- *
- * @param level
- * DOCUMENT ME!
- * @throws SQLException
- * DOCUMENT ME!
- */
+ * Attempts to change the transaction isolation level for this
+ * <code>Connection</code> object to the one given.
+ * The constants defined in the interface <code>Connection</code>
+ * are the possible transaction isolation levels.
+ * <P>
+ * <B>Note:</B> If this method is called during a transaction, the result
+ * is implementation-defined.
+ *
+ * @param level one of the following <code>Connection</code> constants:
+ * <code>Connection.TRANSACTION_READ_UNCOMMITTED</code>,
+ * <code>Connection.TRANSACTION_READ_COMMITTED</code>,
+ * <code>Connection.TRANSACTION_REPEATABLE_READ</code>, or
+ * <code>Connection.TRANSACTION_SERIALIZABLE</code>.
+ * (Note that <code>Connection.TRANSACTION_NONE</code> cannot be
used
+ * because it specifies that transactions are not supported.)
+ * @exception SQLException if a database access error occurs
+ * or the given parameter is not one of the
<code>Connection</code>
+ * constants
+ * @see DatabaseMetaData#supportsTransactionIsolationLevel
+ * @see #getTransactionIsolation
+ */
public synchronized void setTransactionIsolation(int level) throws SQLException {
checkClosed();
Modified: branches/branch_5_0/connector-j/src/com/mysql/jdbc/ServerPreparedStatement.java
===================================================================
---
branches/branch_5_0/connector-j/src/com/mysql/jdbc/ServerPreparedStatement.java 2006-09-26
00:01:23 UTC (rev 5770)
+++
branches/branch_5_0/connector-j/src/com/mysql/jdbc/ServerPreparedStatement.java 2006-09-26
19:22:11 UTC (rev 5771)
@@ -1531,8 +1531,18 @@
if (x == null) {
setNull(parameterIndex, java.sql.Types.DECIMAL);
} else {
- setString(parameterIndex, StringUtils.fixDecimalExponent(x
- .toString()));
+
+ BindValue binding = getBinding(parameterIndex, false);
+
+ if (this.connection.versionMeetsMinimum(5, 0, 3)) {
+ setType(binding, MysqlDefs.FIELD_TYPE_NEW_DECIMAL);
+ } else {
+ setType(binding, this.stringTypeCode);
+ }
+
+ binding.value = StringUtils.fixDecimalExponent(x.toString());
+ binding.isNull = false;
+ binding.isLongData = false;
}
}
@@ -2111,6 +2121,8 @@
case MysqlDefs.FIELD_TYPE_VAR_STRING:
case MysqlDefs.FIELD_TYPE_STRING:
case MysqlDefs.FIELD_TYPE_VARCHAR:
+ case MysqlDefs.FIELD_TYPE_DECIMAL:
+ case MysqlDefs.FIELD_TYPE_NEW_DECIMAL:
if (value instanceof byte[]) {
packet.writeLenBytes((byte[]) value);
} else if (!this.isLoadDataQuery) {
Added:
branches/branch_5_0/connector-j/src/com/mysql/jdbc/jdbc2/optional/.MysqlConnectionPoolDataSource.java.swp
===================================================================
(Binary files differ)
Property changes on:
branches/branch_5_0/connector-j/src/com/mysql/jdbc/jdbc2/optional/.MysqlConnectionPoolDataSource.java.swp
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified:
branches/branch_5_0/connector-j/src/testsuite/regression/StatementRegressionTest.java
===================================================================
---
branches/branch_5_0/connector-j/src/testsuite/regression/StatementRegressionTest.java 2006-09-26
00:01:23 UTC (rev 5770)
+++
branches/branch_5_0/connector-j/src/testsuite/regression/StatementRegressionTest.java 2006-09-26
19:22:11 UTC (rev 5771)
@@ -3431,4 +3431,54 @@
}
}
}
+
+ /**
+ * Tests fix for BUG#22290 - Driver issues truncation on write exception when
+ * it shouldn't (due to sending big decimal incorrectly to server with
+ * server-side prepared statement).
+ *
+ * @throws Exception if the test fails.
+ */
+ public void testBug22290() throws Exception {
+ if (!versionMeetsMinimum(5, 0)) {
+ return;
+ }
+
+ createTable(
+ "testbug22290",
+ "(`id` int(11) NOT NULL default '1',`cost` decimal(10,2) NOT NULL,PRIMARY KEY
(`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8");
+ assertEquals(
+ this.stmt
+ .executeUpdate("INSERT INTO testbug22290 (`id`,`cost`) VALUES (1,'1.00')"),
+ 1);
+
+ Connection configuredConn = null;
+
+ try {
+ Properties props = new Properties();
+ props.setProperty("sessionVariables", "sql_mode='STRICT_TRANS_TABLES'");
+
+
+ configuredConn = getConnectionWithProps(props);
+
+ this.pstmt = configuredConn
+ .prepareStatement("update testbug22290 set cost = cost + ? where id = 1");
+ this.pstmt.setBigDecimal(1, new BigDecimal("1.11"));
+ assertEquals(this.pstmt.executeUpdate(), 1);
+
+ assertEquals(this.stmt
+ .executeUpdate("UPDATE testbug22290 SET cost='1.00'"), 1);
+ this.pstmt = ((com.mysql.jdbc.Connection)configuredConn)
+ .clientPrepareStatement("update testbug22290 set cost = cost + ? where id = 1");
+ this.pstmt.setBigDecimal(1, new BigDecimal("1.11"));
+ assertEquals(this.pstmt.executeUpdate(), 1);
+ } finally {
+ closeMemberJDBCResources();
+
+ if (configuredConn != null) {
+ configuredConn.close();
+ }
+ }
+ }
+
}
Modified: trunk/connector-j/CHANGES
===================================================================
--- trunk/connector-j/CHANGES 2006-09-26 00:01:23 UTC (rev 5770)
+++ trunk/connector-j/CHANGES 2006-09-26 19:22:11 UTC (rev 5771)
@@ -36,7 +36,11 @@
- Added new _ci collations to CharsetMapping, fixing
Bug#22456 - utf8_unicode_ci not working.
-
+
+ - Fixed BUG#22290 - Driver issues truncation on write exception when
+ it shouldn't (due to sending big decimal incorrectly to server with
+ server-side prepared statement).
+
07-26-06 - Version 5.0.3
- Fixed BUG#20650 - Statement.cancel() causes NullPointerException
@@ -257,6 +261,10 @@
explitly if you want to use a logger other than one that logs
to STDERR.
+ - Fixed BUG#22290 - Driver issues truncation on write exception when
+ it shouldn't (due to sending big decimal incorrectly to server with
+ server-side prepared statement).
+
05-26-06 - Version 3.1.13
- Fixed BUG#15464 - INOUT parameter does not store IN value.
Modified: trunk/connector-j/src/com/mysql/jdbc/Connection.java
===================================================================
--- trunk/connector-j/src/com/mysql/jdbc/Connection.java 2006-09-26 00:01:23 UTC (rev
5770)
+++ trunk/connector-j/src/com/mysql/jdbc/Connection.java 2006-09-26 19:22:11 UTC (rev
5771)
@@ -3241,9 +3241,10 @@
String currentSqlMode =
(String)this.serverVariables.get("sql_mode");
+ boolean strictTransTablesIsSet = StringUtils.indexOfIgnoreCase(currentSqlMode,
"STRICT_TRANS_TABLES") != -1;
+
if (currentSqlMode == null ||
- currentSqlMode.length() == 0 ||
- StringUtils.indexOfIgnoreCase(currentSqlMode, "STRICT_TRANS_TABLES") == -1) {
+ currentSqlMode.length() == 0 || !strictTransTablesIsSet) {
StringBuffer commandBuf = new StringBuffer("SET sql_mode='");
if (currentSqlMode != null && currentSqlMode.length() > 0) {
@@ -3259,6 +3260,9 @@
this.database, true, false);
setJdbcCompliantTruncation(false); // server's handling this for us now
+ } else if (strictTransTablesIsSet) {
+ // We didn't set it, but someone did, so we piggy back on it
+ setJdbcCompliantTruncation(false); // server's handling this for us now
}
}
Modified: trunk/connector-j/src/com/mysql/jdbc/ServerPreparedStatement.java
===================================================================
--- trunk/connector-j/src/com/mysql/jdbc/ServerPreparedStatement.java 2006-09-26 00:01:23
UTC (rev 5770)
+++ trunk/connector-j/src/com/mysql/jdbc/ServerPreparedStatement.java 2006-09-26 19:22:11
UTC (rev 5771)
@@ -1528,8 +1528,18 @@
if (x == null) {
setNull(parameterIndex, java.sql.Types.DECIMAL);
} else {
- setString(parameterIndex, StringUtils.fixDecimalExponent(x
- .toString()));
+
+ BindValue binding = getBinding(parameterIndex, false);
+
+ if (this.connection.versionMeetsMinimum(5, 0, 3)) {
+ setType(binding, MysqlDefs.FIELD_TYPE_NEW_DECIMAL);
+ } else {
+ setType(binding, this.stringTypeCode);
+ }
+
+ binding.value = StringUtils.fixDecimalExponent(x.toString());
+ binding.isNull = false;
+ binding.isLongData = false;
}
}
@@ -2108,6 +2118,8 @@
case MysqlDefs.FIELD_TYPE_VAR_STRING:
case MysqlDefs.FIELD_TYPE_STRING:
case MysqlDefs.FIELD_TYPE_VARCHAR:
+ case MysqlDefs.FIELD_TYPE_DECIMAL:
+ case MysqlDefs.FIELD_TYPE_NEW_DECIMAL:
if (value instanceof byte[]) {
packet.writeLenBytes((byte[]) value);
} else if (!this.isLoadDataQuery) {
Modified: trunk/connector-j/src/testsuite/regression/StatementRegressionTest.java
===================================================================
--- trunk/connector-j/src/testsuite/regression/StatementRegressionTest.java 2006-09-26
00:01:23 UTC (rev 5770)
+++ trunk/connector-j/src/testsuite/regression/StatementRegressionTest.java 2006-09-26
19:22:11 UTC (rev 5771)
@@ -3435,4 +3435,53 @@
}
}
}
+
+ /**
+ * Tests fix for BUG#22290 - Driver issues truncation on write exception when
+ * it shouldn't (due to sending big decimal incorrectly to server with
+ * server-side prepared statement).
+ *
+ * @throws Exception if the test fails.
+ */
+ public void testBug22290() throws Exception {
+ if (!versionMeetsMinimum(5, 0)) {
+ return;
+ }
+
+ createTable(
+ "testbug22290",
+ "(`id` int(11) NOT NULL default '1',`cost` decimal(10,2) NOT NULL,PRIMARY KEY
(`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8");
+ assertEquals(
+ this.stmt
+ .executeUpdate("INSERT INTO testbug22290 (`id`,`cost`) VALUES (1,'1.00')"),
+ 1);
+
+ Connection configuredConn = null;
+
+ try {
+ Properties props = new Properties();
+ props.setProperty("sessionVariables", "sql_mode='STRICT_TRANS_TABLES'");
+
+
+ configuredConn = getConnectionWithProps(props);
+
+ this.pstmt = configuredConn
+ .prepareStatement("update testbug22290 set cost = cost + ? where id = 1");
+ this.pstmt.setBigDecimal(1, new BigDecimal("1.11"));
+ assertEquals(this.pstmt.executeUpdate(), 1);
+
+ assertEquals(this.stmt
+ .executeUpdate("UPDATE testbug22290 SET cost='1.00'"), 1);
+ this.pstmt = ((com.mysql.jdbc.Connection)configuredConn)
+ .clientPrepareStatement("update testbug22290 set cost = cost + ? where id = 1");
+ this.pstmt.setBigDecimal(1, new BigDecimal("1.11"));
+ assertEquals(this.pstmt.executeUpdate(), 1);
+ } finally {
+ closeMemberJDBCResources();
+
+ if (configuredConn != null) {
+ configuredConn.close();
+ }
+ }
+ }
}
| Thread |
|---|
| • Connector/J commit: r5771 - branches/branch_5_0/connector-j branches/branch_5_0/connector-j/src/com/mysql/jdbc branches/branch_5_0/connector-j/src/com... | mmatthews | 26 Sep |