Skip to content

Commit 44d6010

Browse files
authored
Revert "Properly Insert Accented Characters When Using Bulk Copy and Non-Unic…" (#2736)
This reverts commit 1dc9eb7.
1 parent 1ed161f commit 44d6010

File tree

3 files changed

+63
-65
lines changed

3 files changed

+63
-65
lines changed

src/main/java/com/microsoft/sqlserver/jdbc/SQLServerBulkBatchInsertRecord.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import java.math.BigDecimal;
99
import java.math.RoundingMode;
10-
import java.nio.charset.Charset;
1110
import java.sql.Types;
1211
import java.text.DecimalFormat;
1312
import java.text.MessageFormat;
@@ -35,7 +34,6 @@ class SQLServerBulkBatchInsertRecord extends SQLServerBulkRecord {
3534
private int batchParamIndex = -1;
3635
private List<String> columnList;
3736
private List<String> valueList;
38-
private Charset charset;
3937

4038
/*
4139
* Class name for logging.
@@ -46,10 +44,10 @@ class SQLServerBulkBatchInsertRecord extends SQLServerBulkRecord {
4644
* Constructs a SQLServerBulkBatchInsertRecord with the batch parameter, column list, value list, and encoding
4745
*/
4846
SQLServerBulkBatchInsertRecord(ArrayList<Parameter[]> batchParam, ArrayList<String> columnList,
49-
ArrayList<String> valueList, Charset charset, boolean columnNameCaseSensitive) throws SQLServerException {
47+
ArrayList<String> valueList, String encoding, boolean columnNameCaseSensitive) throws SQLServerException {
5048
initLoggerResources();
5149
if (loggerExternal.isLoggable(java.util.logging.Level.FINER)) {
52-
loggerExternal.entering(loggerPackageName, loggerClassName, new Object[] {batchParam, charset.name()});
50+
loggerExternal.entering(loggerPackageName, loggerClassName, new Object[] {batchParam, encoding});
5351
}
5452

5553
if (null == batchParam) {
@@ -64,7 +62,6 @@ class SQLServerBulkBatchInsertRecord extends SQLServerBulkRecord {
6462
this.columnList = columnList;
6563
this.valueList = valueList;
6664
this.columnNameCaseSensitive = columnNameCaseSensitive;
67-
this.charset = charset;
6865
columnMetadata = new HashMap<>();
6966

7067
loggerExternal.exiting(loggerPackageName, loggerClassName);
@@ -196,7 +193,7 @@ else if (dateTimeFormatter != null)
196193
* If the data is already a string, return it as is.
197194
*/
198195
if (data instanceof byte[]) {
199-
return new String((byte[]) data, charset);
196+
return new String((byte[]) data);
200197
}
201198
return data;
202199
}

src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2218,8 +2218,7 @@ public int[] executeBatch() throws SQLServerException, BatchUpdateException, SQL
22182218
}
22192219

22202220
SQLServerBulkBatchInsertRecord batchRecord = new SQLServerBulkBatchInsertRecord(
2221-
batchParamValues, bcOperationColumnList, bcOperationValueList,
2222-
connection.getDatabaseCollation().getCharset(), isDBColationCaseSensitive());
2221+
batchParamValues, bcOperationColumnList, bcOperationValueList, null, isDBColationCaseSensitive());
22232222

22242223
for (int i = 1; i <= rs.getColumnCount(); i++) {
22252224
Column c = rs.getColumn(i);
@@ -2427,8 +2426,7 @@ public long[] executeLargeBatch() throws SQLServerException, BatchUpdateExceptio
24272426
}
24282427

24292428
SQLServerBulkBatchInsertRecord batchRecord = new SQLServerBulkBatchInsertRecord(
2430-
batchParamValues, bcOperationColumnList, bcOperationValueList,
2431-
connection.getDatabaseCollation().getCharset(), isDBColationCaseSensitive());
2429+
batchParamValues, bcOperationColumnList, bcOperationValueList, null, isDBColationCaseSensitive());
24322430

24332431
for (int i = 1; i <= rs.getColumnCount(); i++) {
24342432
Column c = rs.getColumn(i);

src/test/java/com/microsoft/sqlserver/jdbc/preparedStatement/BatchExecutionWithBulkCopyTest.java

Lines changed: 58 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1408,76 +1408,82 @@ private void getCreateTableTemporalSQL(String tableName) throws SQLException {
14081408
}
14091409

14101410
/**
1411-
* Test string values using prepared statement using accented and unicode characters.
1412-
* This test covers all combinations of useBulkCopyForBatchInsert and sendStringParametersAsUnicode.
1413-
*
1414-
* @throws Exception
1411+
* Test batch insert using bulk copy with string values when setSendStringParametersAsUnicode is true.
14151412
*/
14161413
@Test
1417-
public void testBulkInsertStringAllCombinations() throws Exception {
1418-
boolean[] bulkCopyOptions = { true, false };
1419-
boolean[] unicodeOptions = { true, false };
1420-
for (boolean useBulkCopy : bulkCopyOptions) {
1421-
for (boolean sendUnicode : unicodeOptions) {
1422-
runBulkInsertStringTest(useBulkCopy, sendUnicode);
1414+
public void testBulkInsertStringWhenSentAsUnicode() throws Exception {
1415+
String insertSQL = "INSERT INTO " + AbstractSQLGenerator.escapeIdentifier(tableNameBulkString)
1416+
+ " (charCol, varcharCol, longvarcharCol, ncharCol, nvarcharCol, longnvarcharCol) VALUES (?, ?, ?, ?, ?, ?)";
1417+
1418+
String selectSQL = "SELECT charCol, varcharCol, longvarcharCol, ncharCol, nvarcharCol, longnvarcharCol FROM "
1419+
+ AbstractSQLGenerator.escapeIdentifier(tableNameBulkString);
1420+
1421+
try (Connection connection = PrepUtil.getConnection(
1422+
connectionString + ";useBulkCopyForBatchInsert=true;sendStringParametersAsUnicode=true;");
1423+
SQLServerPreparedStatement pstmt = (SQLServerPreparedStatement) connection.prepareStatement(insertSQL);
1424+
Statement stmt = (SQLServerStatement) connection.createStatement()) {
1425+
1426+
getCreateTableWithStringData();
1427+
1428+
pstmt.setString(1, "CHAR_VAL");
1429+
pstmt.setString(2, "VARCHAR_VALUE");
1430+
pstmt.setString(3, "LONGVARCHAR_VALUE_WITH_MORE_TEXT");
1431+
pstmt.setString(4, "NCHAR_VAL");
1432+
pstmt.setString(5, "NVARCHAR_VALUE");
1433+
pstmt.setString(6, "LONGNVARCHAR_VALUE_WITH_UNICODE_TEXT");
1434+
pstmt.addBatch();
1435+
pstmt.executeBatch();
1436+
1437+
// Validate inserted data
1438+
try (ResultSet rs = stmt.executeQuery(selectSQL)) {
1439+
assertTrue(rs.next(), "Expected at least one row in result set");
1440+
assertEquals("CHAR_VAL", rs.getString("charCol"));
1441+
assertEquals("VARCHAR_VALUE", rs.getString("varcharCol"));
1442+
assertEquals("LONGVARCHAR_VALUE_WITH_MORE_TEXT", rs.getString("longvarcharCol"));
1443+
assertEquals("NCHAR_VAL", rs.getString("ncharCol"));
1444+
assertEquals("NVARCHAR_VALUE", rs.getString("nvarcharCol"));
1445+
assertEquals("LONGNVARCHAR_VALUE_WITH_UNICODE_TEXT", rs.getString("longnvarcharCol"));
1446+
assertFalse(rs.next());
14231447
}
14241448
}
14251449
}
14261450

14271451
/**
1428-
* Test batch insert using accented and unicode characters.
1452+
* Test batch insert using bulk copy with string values when setSendStringParametersAsUnicode is false.
14291453
*/
1430-
public void runBulkInsertStringTest(boolean useBulkCopy, boolean sendUnicode) throws Exception {
1454+
@Test
1455+
public void testBulkInsertStringWhenNotSentAsUnicode() throws Exception {
14311456
String insertSQL = "INSERT INTO " + AbstractSQLGenerator.escapeIdentifier(tableNameBulkString)
1432-
+ " (charCol, varcharCol, longvarcharCol, ncharCol1, nvarcharCol1, longnvarcharCol1, "
1433-
+ "ncharCol2, nvarcharCol2, longnvarcharCol2) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";
1457+
+ " (charCol, varcharCol, longvarcharCol, ncharCol, nvarcharCol, longnvarcharCol) VALUES (?, ?, ?, ?, ?, ?)";
14341458

1435-
String selectSQL = "SELECT charCol, varcharCol, longvarcharCol, ncharCol1, nvarcharCol1, "
1436-
+ "longnvarcharCol1, ncharCol2, nvarcharCol2, longnvarcharCol2 FROM "
1459+
String selectSQL = "SELECT charCol, varcharCol, longvarcharCol, ncharCol, nvarcharCol, longnvarcharCol FROM "
14371460
+ AbstractSQLGenerator.escapeIdentifier(tableNameBulkString);
14381461

14391462
try (Connection connection = PrepUtil.getConnection(
1440-
connectionString + ";useBulkCopyForBatchInsert=" + useBulkCopy + ";sendStringParametersAsUnicode="
1441-
+ sendUnicode + ";");
1463+
connectionString + ";useBulkCopyForBatchInsert=true;sendStringParametersAsUnicode=false;");
14421464
SQLServerPreparedStatement pstmt = (SQLServerPreparedStatement) connection.prepareStatement(insertSQL);
14431465
Statement stmt = (SQLServerStatement) connection.createStatement()) {
14441466

14451467
getCreateTableWithStringData();
14461468

1447-
String charValue = "Anaïs_Ni";
1448-
String varcharValue = "café";
1449-
String longVarcharValue = "Sørén Kierkégaard";
1450-
String ncharValue1 = "José Müll";
1451-
String nvarcharValue1 = "José Müller";
1452-
String longNvarcharValue1 = "François Saldaña";
1453-
String ncharValue2 = "Test1汉字😀";
1454-
String nvarcharValue2 = "汉字";
1455-
String longNvarcharValue2 = "日本語";
1456-
1457-
pstmt.setString(1, charValue);
1458-
pstmt.setString(2, varcharValue);
1459-
pstmt.setString(3, longVarcharValue);
1460-
pstmt.setString(4, ncharValue1);
1461-
pstmt.setString(5, nvarcharValue1);
1462-
pstmt.setString(6, longNvarcharValue1);
1463-
pstmt.setNString(7, ncharValue2);
1464-
pstmt.setNString(8, nvarcharValue2);
1465-
pstmt.setNString(9, longNvarcharValue2);
1469+
pstmt.setString(1, "CHAR_VAL");
1470+
pstmt.setString(2, "VARCHAR_VALUE");
1471+
pstmt.setString(3, "LONGVARCHAR_VALUE_WITH_MORE_TEXT");
1472+
pstmt.setString(4, "NCHAR_VAL");
1473+
pstmt.setString(5, "NVARCHAR_VALUE");
1474+
pstmt.setString(6, "LONGNVARCHAR_VALUE_WITH_UNICODE_TEXT");
14661475
pstmt.addBatch();
14671476
pstmt.executeBatch();
14681477

14691478
// Validate inserted data
14701479
try (ResultSet rs = stmt.executeQuery(selectSQL)) {
14711480
assertTrue(rs.next(), "Expected at least one row in result set");
1472-
assertEquals(charValue, rs.getString("charCol"));
1473-
assertEquals(varcharValue, rs.getString("varcharCol"));
1474-
assertEquals(longVarcharValue, rs.getString("longvarcharCol"));
1475-
assertEquals(ncharValue1, rs.getString("ncharCol1"));
1476-
assertEquals(nvarcharValue1, rs.getString("nvarcharCol1"));
1477-
assertEquals(longNvarcharValue1, rs.getString("longnvarcharCol1"));
1478-
assertEquals(ncharValue2, rs.getString("ncharCol2"));
1479-
assertEquals(nvarcharValue2, rs.getString("nvarcharCol2"));
1480-
assertEquals(longNvarcharValue2, rs.getString("longnvarcharCol2"));
1481+
assertEquals("CHAR_VAL", rs.getString("charCol"));
1482+
assertEquals("VARCHAR_VALUE", rs.getString("varcharCol"));
1483+
assertEquals("LONGVARCHAR_VALUE_WITH_MORE_TEXT", rs.getString("longvarcharCol"));
1484+
assertEquals("NCHAR_VAL", rs.getString("ncharCol"));
1485+
assertEquals("NVARCHAR_VALUE", rs.getString("nvarcharCol"));
1486+
assertEquals("LONGNVARCHAR_VALUE_WITH_UNICODE_TEXT", rs.getString("longnvarcharCol"));
14811487
assertFalse(rs.next());
14821488
}
14831489
}
@@ -1487,15 +1493,12 @@ private void getCreateTableWithStringData() throws SQLException {
14871493
try (Statement stmt = connection.createStatement()) {
14881494
TestUtils.dropTableIfExists(AbstractSQLGenerator.escapeIdentifier(tableNameBulkString), stmt);
14891495
String createTableSQL = "CREATE TABLE " + AbstractSQLGenerator.escapeIdentifier(tableNameBulkString) + " (" +
1490-
"charCol CHAR(8), " +
1491-
"varcharCol VARCHAR(50), " +
1492-
"longvarcharCol VARCHAR(MAX), " +
1493-
"ncharCol1 NCHAR(9), " +
1494-
"nvarcharCol1 NVARCHAR(50), " +
1495-
"longnvarcharCol1 NVARCHAR(MAX), " +
1496-
"ncharCol2 NCHAR(9), " +
1497-
"nvarcharCol2 NVARCHAR(50), " +
1498-
"longnvarcharCol2 NVARCHAR(MAX)" + ")";
1496+
"charCol CHAR(8) NOT NULL, " +
1497+
"varcharCol VARCHAR(50) NOT NULL, " +
1498+
"longvarcharCol VARCHAR(MAX) NOT NULL, " +
1499+
"ncharCol NCHAR(9) NOT NULL, " +
1500+
"nvarcharCol NVARCHAR(50) NOT NULL, " +
1501+
"longnvarcharCol NVARCHAR(MAX) NOT NULL" + ")";
14991502

15001503
stmt.execute(createTableSQL);
15011504
}

0 commit comments

Comments
 (0)