From 314551eb4bde7ee39dfc53138eb266aa0584fe7b Mon Sep 17 00:00:00 2001 From: wang_hong <1337151114@qq.com> Date: Mon, 20 Dec 2021 14:13:13 +0800 Subject: [PATCH] Update ServerPreparedStatement.java Fix for bug#105915 , server prepared statement precision loss in execute batch --- .../com/mysql/cj/jdbc/ServerPreparedStatement.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/user-impl/java/com/mysql/cj/jdbc/ServerPreparedStatement.java b/src/main/user-impl/java/com/mysql/cj/jdbc/ServerPreparedStatement.java index d69296cea..ebe941011 100644 --- a/src/main/user-impl/java/com/mysql/cj/jdbc/ServerPreparedStatement.java +++ b/src/main/user-impl/java/com/mysql/cj/jdbc/ServerPreparedStatement.java @@ -33,6 +33,7 @@ import java.io.InputStream; import java.io.Reader; import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; import java.net.URL; import java.sql.Date; import java.sql.ParameterMetaData; @@ -768,11 +769,20 @@ protected int setOneBatchedParameterSet(java.sql.PreparedStatement batchedStatem case MysqlType.FIELD_TYPE_TIMESTAMP: batchedStatement.setTimestamp(batchedParamIndex++, (Timestamp) paramArg[j].value); break; + case MysqlType.FIELD_TYPE_DECIMAL: + case MysqlType.FIELD_TYPE_NEWDECIMAL: + Object decimalValue = paramArg[j].value; + if (decimalValue instanceof String) { + String plainString = (String) paramArg[j].value; + batchedStatement.setBigDecimal(batchedParamIndex++, new BigDecimal(plainString)); + break; + } else if (decimalValue instanceof BigDecimal) { + batchedStatement.setBigDecimal(batchedParamIndex++, (BigDecimal) decimalValue); + break; + } case MysqlType.FIELD_TYPE_VAR_STRING: case MysqlType.FIELD_TYPE_STRING: case MysqlType.FIELD_TYPE_VARCHAR: - case MysqlType.FIELD_TYPE_DECIMAL: - case MysqlType.FIELD_TYPE_NEWDECIMAL: Object value = paramArg[j].value; if (value instanceof byte[]) {