Skip to content

Commit 6408cc4

Browse files
committed
test(BatchExecutionTest): Add case sensitive and case insensitive database in unit test.
1 parent 4f12d72 commit 6408cc4

File tree

1 file changed

+90
-60
lines changed

1 file changed

+90
-60
lines changed

src/test/java/com/microsoft/sqlserver/jdbc/unit/statement/BatchExecutionTest.java

+90-60
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import java.util.concurrent.ExecutorService;
3535
import java.util.concurrent.Executors;
3636

37-
import com.microsoft.sqlserver.jdbc.SQLServerException;
3837
import org.junit.jupiter.api.AfterAll;
3938
import org.junit.jupiter.api.BeforeAll;
4039
import org.junit.jupiter.api.Tag;
@@ -74,8 +73,8 @@ public class BatchExecutionTest extends AbstractTest {
7473
.escapeIdentifier(RandomUtil.getIdentifier("timestamptable1"));
7574
private static String timestampTable2 = AbstractSQLGenerator
7675
.escapeIdentifier(RandomUtil.getIdentifier("timestamptable2"));
77-
private static String caseSensitiveTable = AbstractSQLGenerator
78-
.escapeIdentifier(RandomUtil.getIdentifier("caseSensitiveTable"));
76+
private static String caseSensitiveDatabase = "BD_Collation_SQL_Latin1_General_CP1_CS_AS";
77+
private static String caseInsensitiveDatabase = "BD_Collation_SQL_Latin1_General_CP1_CI_AS";
7978

8079
/**
8180
* This tests the updateCount when the error query does cause a SQL state HY008.
@@ -574,74 +573,106 @@ public void testBatchStatementCancellation() throws Exception {
574573

575574
@Test
576575
public void testExecuteBatchColumnCaseMismatch_CI() throws Exception {
577-
// Insert Timestamp using prepared statement when useBulkCopyForBatchInsert=true
578-
try (Connection con = DriverManager.getConnection(connectionString
579-
+ ";useBulkCopyForBatchInsert=true;sendTemporalDataTypesAsStringForBulkCopy=false;")) {
580-
try (Statement statement = con.createStatement()) {
581-
TestUtils.dropTableIfExists(caseSensitiveTable, statement);
582-
String createSql = "CREATE TABLE" + caseSensitiveTable + " (c1 varchar(10))";
583-
statement.execute(createSql);
584-
}
585-
// upper case C1
586-
try (PreparedStatement preparedStatement = con.prepareStatement("INSERT INTO " + caseSensitiveTable + "(C1) VALUES(?)")) {
587-
preparedStatement.setObject(1, "value1");
588-
preparedStatement.addBatch();
589-
preparedStatement.setObject(1, "value2");
590-
preparedStatement.addBatch();
591-
preparedStatement.executeBatch();
576+
String connectionStringCollationCaseInsensitive = TestUtils.addOrOverrideProperty(connectionString, "databaseName", caseInsensitiveDatabase);
577+
String tableName = AbstractSQLGenerator.escapeIdentifier(RandomUtil.getIdentifier("caseInsensitiveTable"));
578+
579+
try (Connection conTemp = DriverManager.getConnection(connectionString); Statement stmt = conTemp.createStatement()) {
580+
TestUtils.dropDatabaseIfExists(caseInsensitiveDatabase, connectionString);
581+
stmt.executeUpdate("CREATE DATABASE " + caseInsensitiveDatabase);
582+
stmt.executeUpdate("ALTER DATABASE " + caseInsensitiveDatabase + " COLLATE SQL_Latin1_General_CP1_CI_AS;");
583+
584+
// Insert Timestamp using prepared statement when useBulkCopyForBatchInsert=true
585+
try (Connection con = DriverManager.getConnection(connectionStringCollationCaseInsensitive
586+
+ ";useBulkCopyForBatchInsert=true;sendTemporalDataTypesAsStringForBulkCopy=false;")) {
587+
try (Statement statement = con.createStatement()) {
588+
TestUtils.dropTableIfExists(tableName, statement);
589+
String createSql = "CREATE TABLE" + tableName + " (c1 varchar(10))";
590+
statement.execute(createSql);
591+
}
592+
// upper case C1
593+
try (PreparedStatement preparedStatement = con.prepareStatement("INSERT INTO " + tableName + "(C1) VALUES(?)")) {
594+
preparedStatement.setObject(1, "value1");
595+
preparedStatement.addBatch();
596+
preparedStatement.setObject(1, "value2");
597+
preparedStatement.addBatch();
598+
preparedStatement.executeBatch();
599+
}
592600
}
601+
} finally {
602+
TestUtils.dropDatabaseIfExists(caseInsensitiveDatabase, connectionString);
593603
}
594604
}
595605

596-
// TODO: adapter CI, use connectionString for _CS_
597-
// @Test
606+
// adapter Azure pipeline CI, need to add a new environment variable `mssql_jdbc_test_connection_properties_collation_cs`
607+
@Test
598608
public void testExecuteBatchColumnCaseMismatch_CS_throwException() throws Exception {
599-
// Insert Timestamp using prepared statement when useBulkCopyForBatchInsert=true
600-
try (Connection con = DriverManager.getConnection(connectionString
601-
+ ";useBulkCopyForBatchInsert=true;sendTemporalDataTypesAsStringForBulkCopy=false;")) {
602-
try (Statement statement = con.createStatement()) {
603-
TestUtils.dropTableIfExists(caseSensitiveTable, statement);
604-
String createSql = "CREATE TABLE" + caseSensitiveTable + " (c1 varchar(10))";
605-
statement.execute(createSql);
606-
}
607-
// upper case C1
608-
try (PreparedStatement preparedStatement = con.prepareStatement("INSERT INTO " + caseSensitiveTable + "(C1) VALUES(?)")) {
609-
preparedStatement.setObject(1, "value1");
610-
preparedStatement.addBatch();
611-
preparedStatement.setObject(1, "value2");
612-
preparedStatement.addBatch();
613-
try {
614-
preparedStatement.executeBatch();
615-
fail("Should have failed");
616-
} catch (Exception ex) {
617-
assertInstanceOf(SQLServerException.class, ex);
618-
assertEquals("Unable to retrieve column metadata.", ex.getMessage());
609+
String connectionStringCollationCaseSensitive = TestUtils.addOrOverrideProperty(connectionString, "databaseName", caseSensitiveDatabase);
610+
String tableName = AbstractSQLGenerator.escapeIdentifier(RandomUtil.getIdentifier("caseSensitiveTable"));
611+
612+
try (Connection conTemp = DriverManager.getConnection(connectionString); Statement stmt = conTemp.createStatement()) {
613+
TestUtils.dropDatabaseIfExists(caseSensitiveDatabase, connectionString);
614+
stmt.executeUpdate("CREATE DATABASE " + caseSensitiveDatabase);
615+
stmt.executeUpdate("ALTER DATABASE " + caseSensitiveDatabase + " COLLATE SQL_Latin1_General_CP1_CS_AS;");
616+
617+
try (Connection con = DriverManager.getConnection(connectionStringCollationCaseSensitive
618+
+ ";useBulkCopyForBatchInsert=true;sendTemporalDataTypesAsStringForBulkCopy=false;")) {
619+
try (Statement statement = con.createStatement()) {
620+
TestUtils.dropTableIfExists(tableName, statement);
621+
String createSql = "CREATE TABLE" + tableName + " (c1 varchar(10))";
622+
statement.execute(createSql);
623+
}
624+
// upper case C1
625+
try (PreparedStatement preparedStatement = con.prepareStatement("INSERT INTO " + tableName + "(C1) VALUES(?)")) {
626+
preparedStatement.setObject(1, "value1");
627+
preparedStatement.addBatch();
628+
preparedStatement.setObject(1, "value2");
629+
preparedStatement.addBatch();
630+
try {
631+
preparedStatement.executeBatch();
632+
fail("Should have failed");
633+
} catch (Exception ex) {
634+
assertInstanceOf(java.sql.BatchUpdateException.class, ex);
635+
assertEquals("Unable to retrieve column metadata.", ex.getMessage());
636+
}
619637
}
620638
}
639+
} finally {
640+
TestUtils.dropDatabaseIfExists(caseSensitiveDatabase, connectionString);
621641
}
622642
}
623643

624-
// TODO: adapter CI, use connectionString for _CS_
625-
// @Test
644+
// adapter Azure pipeline CI, need to add a new environment variable `mssql_jdbc_test_connection_properties_collation_cs`
645+
@Test
626646
public void testExecuteBatchColumnCaseMismatch_CS() throws Exception {
627-
// Insert Timestamp using prepared statement when useBulkCopyForBatchInsert=true
628-
try (Connection con = DriverManager.getConnection(connectionString
629-
+ ";useBulkCopyForBatchInsert=true;sendTemporalDataTypesAsStringForBulkCopy=false;")) {
630-
try (Statement statement = con.createStatement()) {
631-
TestUtils.dropTableIfExists(caseSensitiveTable, statement);
632-
String createSql = "CREATE TABLE" + caseSensitiveTable + " (c1 varchar(10), C1 varchar(10))";
633-
statement.execute(createSql);
634-
}
635-
// upper case C1
636-
try (PreparedStatement preparedStatement = con.prepareStatement("INSERT INTO " + caseSensitiveTable + "(c1, C1) VALUES(?,?)")) {
637-
preparedStatement.setObject(1, "value1-1");
638-
preparedStatement.setObject(2, "value1-2");
639-
preparedStatement.addBatch();
640-
preparedStatement.setObject(1, "value2-1");
641-
preparedStatement.setObject(2, "value2-2");
642-
preparedStatement.addBatch();
643-
preparedStatement.executeBatch();
647+
String connectionStringCollationCaseSensitive = TestUtils.addOrOverrideProperty(connectionString, "databaseName", caseSensitiveDatabase);
648+
String tableName = AbstractSQLGenerator.escapeIdentifier(RandomUtil.getIdentifier("caseSensitiveTable"));
649+
650+
try (Connection conTemp = DriverManager.getConnection(connectionString); Statement stmt = conTemp.createStatement()) {
651+
TestUtils.dropDatabaseIfExists(caseSensitiveDatabase, connectionString);
652+
stmt.executeUpdate("CREATE DATABASE " + caseSensitiveDatabase);
653+
stmt.executeUpdate("ALTER DATABASE " + caseSensitiveDatabase + " COLLATE SQL_Latin1_General_CP1_CS_AS;");
654+
655+
// Insert Timestamp using prepared statement when useBulkCopyForBatchInsert=true
656+
try (Connection con = DriverManager.getConnection(connectionStringCollationCaseSensitive
657+
+ ";useBulkCopyForBatchInsert=true;sendTemporalDataTypesAsStringForBulkCopy=false;")) {
658+
try (Statement statement = con.createStatement()) {
659+
TestUtils.dropTableIfExists(tableName, statement);
660+
String createSql = "CREATE TABLE" + tableName + " (c1 varchar(10), C1 varchar(10))";
661+
statement.execute(createSql);
662+
}
663+
// upper case C1
664+
try (PreparedStatement preparedStatement = con.prepareStatement("INSERT INTO " + tableName + "(c1, C1) VALUES(?,?)")) {
665+
preparedStatement.setObject(1, "value1-1");
666+
preparedStatement.setObject(2, "value1-2");
667+
preparedStatement.addBatch();
668+
preparedStatement.setObject(1, "value2-1");
669+
preparedStatement.setObject(2, "value2-2");
670+
preparedStatement.addBatch();
671+
preparedStatement.executeBatch();
672+
}
644673
}
674+
} finally {
675+
TestUtils.dropDatabaseIfExists(caseSensitiveDatabase, connectionString);
645676
}
646677
}
647678

@@ -916,7 +947,6 @@ private static void dropTable() throws SQLException {
916947
TestUtils.dropTableIfExists(AbstractSQLGenerator.escapeIdentifier(ctstable4), stmt);
917948
TestUtils.dropTableIfExists(timestampTable1, stmt);
918949
TestUtils.dropTableIfExists(timestampTable2, stmt);
919-
TestUtils.dropTableIfExists(caseSensitiveTable, stmt);
920950
}
921951
}
922952

0 commit comments

Comments
 (0)