From a4956ac1b0fc32dba0fabb53af20648e1f2c2c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20de=20Launois?= <> Date: Fri, 10 May 2024 11:48:16 +0200 Subject: [PATCH 1/6] Add support for JavaType UUID (#1582) --- .../microsoft/sqlserver/jdbc/DataTypes.java | 2 + .../com/microsoft/sqlserver/jdbc/dtv.java | 9 +++ .../sqlserver/jdbc/datatypes/GuidTest.java | 77 +++++++++++++------ 3 files changed, 63 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/DataTypes.java b/src/main/java/com/microsoft/sqlserver/jdbc/DataTypes.java index 018c483f8..2ee4b773b 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/DataTypes.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/DataTypes.java @@ -21,6 +21,7 @@ import java.time.OffsetTime; import java.util.EnumMap; import java.util.EnumSet; +import java.util.UUID; enum TDSType { @@ -424,6 +425,7 @@ enum JavaType { TVP(com.microsoft.sqlserver.jdbc.TVP.class, JDBCType.TVP), GEOMETRY(Geometry.class, JDBCType.GEOMETRY), GEOGRAPHY(Geography.class, JDBCType.GEOGRAPHY), + UUID(UUID.class, JDBCType.GUID), INPUTSTREAM(InputStream.class, JDBCType.UNKNOWN) { // InputStreams are either ASCII or binary diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/dtv.java b/src/main/java/com/microsoft/sqlserver/jdbc/dtv.java index 3c08a80cd..e0db03608 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/dtv.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/dtv.java @@ -1902,6 +1902,15 @@ else if ((JDBCType.VARCHAR == jdbcTypeSetByUser) || (JDBCType.CHAR == jdbcTypeSe op.execute(this, (Clob) value); break; + case UUID: + if (null != cryptoMeta) { + byte[] bArray = Util.asGuidByteArray((UUID) value); + op.execute(this, bArray); + } else { + op.execute(this, (UUID) value); + } + break; + case INPUTSTREAM: op.execute(this, (InputStream) value); break; diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/GuidTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/GuidTest.java index 6eb7fc51d..13652bc38 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/GuidTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/GuidTest.java @@ -6,6 +6,7 @@ import com.microsoft.sqlserver.jdbc.TestUtils; import com.microsoft.sqlserver.testframework.AbstractSQLGenerator; import com.microsoft.sqlserver.testframework.AbstractTest; +import com.microsoft.sqlserver.testframework.Constants; import microsoft.sql.Types; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Tag; @@ -15,6 +16,7 @@ import java.sql.Connection; import java.sql.PreparedStatement; +import java.sql.SQLException; import java.sql.Statement; import java.util.UUID; @@ -23,8 +25,6 @@ import static org.junit.Assert.fail; import static org.junit.jupiter.api.Assertions.assertEquals; -import com.microsoft.sqlserver.testframework.Constants; - /* * This test is for testing the serialisation of String as microsoft.sql.Types.GUID @@ -32,6 +32,12 @@ @RunWith(JUnitPlatform.class) public class GuidTest extends AbstractTest { + enum TestType { + SETOBJECT_WITHTYPE, // This is to test conversions with type + SETOBJECT_WITHOUTTYPE, // This is to test conversions without type + SETNULL // This is to test setNull method + } + final static String tableName = RandomUtil.getIdentifier("GuidTestTable"); final static String escapedTableName = AbstractSQLGenerator.escapeIdentifier(tableName); @@ -54,33 +60,24 @@ public void testGuid() throws Exception { String query = "create table " + escapedTableName + " (uuid uniqueidentifier, id int IDENTITY primary key)"; stmt.executeUpdate(query); - UUID uuid = UUID.randomUUID(); - String uuidString = uuid.toString(); - int id = 1; - try (PreparedStatement pstmt = conn.prepareStatement("INSERT INTO " + escapedTableName + " VALUES(?) SELECT * FROM " + escapedTableName + " where id = ?")) { - pstmt.setObject(1, uuidString, Types.GUID); - pstmt.setObject(2, id++); - pstmt.execute(); - pstmt.getMoreResults(); - try (SQLServerResultSet rs = (SQLServerResultSet) pstmt.getResultSet()) { - rs.next(); - assertEquals(uuid, UUID.fromString(rs.getUniqueIdentifier(1))); - } + UUID uuid = UUID.randomUUID(); + String uuidString = uuid.toString(); - // Test NULL GUID - pstmt.setObject(1, null, Types.GUID); - pstmt.setObject(2, id++); - pstmt.execute(); - pstmt.getMoreResults(); - try (SQLServerResultSet rs = (SQLServerResultSet) pstmt.getResultSet()) { - rs.next(); - String s = rs.getUniqueIdentifier(1); - assertNull(s); - assertTrue(rs.wasNull()); - } + int row = 1; + + // Test setObject method with SQL TYPE parameter + testSetObject(uuidString, row++, pstmt, TestType.SETOBJECT_WITHTYPE); + testSetObject(uuid, row++, pstmt, TestType.SETOBJECT_WITHTYPE); + + // Test setObject method without SQL TYPE parameter + testSetObject(uuidString, row++, pstmt, TestType.SETOBJECT_WITHOUTTYPE); + testSetObject(uuid, row++, pstmt, TestType.SETOBJECT_WITHOUTTYPE); + + // Test setNull + testSetObject(uuid, row, pstmt, TestType.SETNULL); // Test Illegal GUID try { @@ -97,4 +94,34 @@ public void testGuid() throws Exception { } } + private void testSetObject(Object obj, int id, PreparedStatement pstmt, + GuidTest.TestType testType) throws SQLException { + if (TestType.SETOBJECT_WITHTYPE == testType) { + pstmt.setObject(1, obj, Types.GUID); + } else if (GuidTest.TestType.SETOBJECT_WITHOUTTYPE == testType) { + pstmt.setObject(1, obj); + } else if (GuidTest.TestType.SETNULL == testType) { + pstmt.setNull(1, Types.GUID); + } else + return; + + // The id column + pstmt.setObject(2, id); + + pstmt.execute(); + pstmt.getMoreResults(); + try (SQLServerResultSet rs = (SQLServerResultSet) pstmt.getResultSet()) { + rs.next(); + + if (GuidTest.TestType.SETNULL == testType) { + String s = rs.getUniqueIdentifier(1); + assertNull(s); + assertTrue(rs.wasNull()); + } else { + assertEquals(obj, UUID.fromString(rs.getUniqueIdentifier(1))); + assertEquals(obj, rs.getObject(1, UUID.class)); + } + } + } + } From 508aae1b11f5f15909c10b7cd4adcccf9472f0b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20de=20Launois?= Date: Fri, 10 May 2024 13:35:46 +0200 Subject: [PATCH 2/6] Junit Fix --- .../com/microsoft/sqlserver/jdbc/datatypes/GuidTest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/GuidTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/GuidTest.java index 13652bc38..492ed626e 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/GuidTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/datatypes/GuidTest.java @@ -113,13 +113,15 @@ private void testSetObject(Object obj, int id, PreparedStatement pstmt, try (SQLServerResultSet rs = (SQLServerResultSet) pstmt.getResultSet()) { rs.next(); - if (GuidTest.TestType.SETNULL == testType) { + if (TestType.SETNULL == testType) { String s = rs.getUniqueIdentifier(1); assertNull(s); assertTrue(rs.wasNull()); } else { - assertEquals(obj, UUID.fromString(rs.getUniqueIdentifier(1))); - assertEquals(obj, rs.getObject(1, UUID.class)); + UUID expected = obj instanceof UUID ? (UUID) obj : UUID.fromString(obj.toString()); + assertEquals(expected, UUID.fromString(rs.getUniqueIdentifier(1))); + assertEquals(expected, UUID.fromString(rs.getObject(1, String.class))); + assertEquals(expected, rs.getObject(1, UUID.class)); } } } From ad40fa33b329c760de0a060b1936cc8d33c28945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20de=20Launois?= <> Date: Fri, 10 May 2024 16:49:53 +0200 Subject: [PATCH 3/6] Add tests for Encrypting JavaType UUID --- .../jdbc/AlwaysEncrypted/AESetup.java | 133 +++++++++++++++--- .../JDBCEncryptionDecryptionTest.java | 12 +- 2 files changed, 117 insertions(+), 28 deletions(-) diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/AESetup.java b/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/AESetup.java index 02336f79c..73b105180 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/AESetup.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/AESetup.java @@ -21,6 +21,7 @@ import java.util.LinkedList; import java.util.Map; import java.util.Properties; +import java.util.UUID; import java.util.logging.LogManager; import org.junit.jupiter.api.AfterAll; @@ -103,6 +104,7 @@ enum ColumnType { {"Nchar", "nchar(30) COLLATE Latin1_General_BIN2", "NCHAR"}, {"Nvarchar", "nvarchar(60) COLLATE Latin1_General_BIN2", "NCHAR"}, {"NvarcharMax", "nvarchar(max) COLLATE Latin1_General_BIN2", "LONGNVARCHAR"}, + {"UniqueidentifierString", "uniqueidentifier", "GUIDSTRING"}, {"Uniqueidentifier", "uniqueidentifier", "GUID"}, {"Varchar8000", "varchar(8000) COLLATE Latin1_General_BIN2", "CHAR"}, {"Nvarchar4000", "nvarchar(4000) COLLATE Latin1_General_BIN2", "NCHAR"},}; @@ -451,7 +453,7 @@ protected static String[] createCharValues(boolean nullable) { String nvarchar4000 = RandomData.generateNCharTypes("4000", nullable, encrypted); String[] values = {char20.trim(), varchar50, varcharmax, nchar30, nvarchar60, nvarcharmax, Constants.UID, - varchar8000, nvarchar4000}; + Constants.UID, varchar8000, nvarchar4000}; return values; } @@ -850,23 +852,34 @@ protected static void populateCharNormalCase(String[] charValues) throws SQLExce pstmt.setNString(i, charValues[5]); } - // uniqueidentifier + // uniqueidentifier as String for (int i = 19; i <= 21; i++) { if (null == charValues[6]) { pstmt.setUniqueIdentifier(i, null); } else { - pstmt.setUniqueIdentifier(i, Constants.UID); + pstmt.setUniqueIdentifier(i, charValues[6]); } } - // varchar8000 + // uniqueidentifier for (int i = 22; i <= 24; i++) { - pstmt.setString(i, charValues[7]); + if (null == charValues[7]) { + pstmt.setUniqueIdentifier(i, null); + } else { + // cannot override setUniqueIdentifier to accept UUID parameter without breaking compatibility + // falling back to testing UUID string parameter + pstmt.setUniqueIdentifier(i, charValues[6]); + } } - // nvarchar4000 + // varchar8000 for (int i = 25; i <= 27; i++) { - pstmt.setNString(i, charValues[8]); + pstmt.setString(i, charValues[8]); + } + + // nvarchar4000 + for (int i = 28; i <= 30; i++) { + pstmt.setNString(i, charValues[9]); } pstmt.execute(); @@ -917,25 +930,97 @@ protected static void populateCharSetObject(String[] charValues) throws SQLExcep pstmt.setObject(i, charValues[5], java.sql.Types.LONGNVARCHAR); } - // uniqueidentifier + // uniqueidentifier as String for (int i = 19; i <= 21; i++) { pstmt.setObject(i, charValues[6], microsoft.sql.Types.GUID); } - // varchar8000 + // uniqueidentifier for (int i = 22; i <= 24; i++) { - pstmt.setObject(i, charValues[7]); + pstmt.setObject(i, UUID.fromString(charValues[7]), microsoft.sql.Types.GUID); } - // nvarchar4000 + // varchar8000 for (int i = 25; i <= 27; i++) { - pstmt.setObject(i, charValues[8], java.sql.Types.NCHAR); + pstmt.setObject(i, charValues[8]); + } + + // nvarchar4000 + for (int i = 28; i <= 30; i++) { + pstmt.setObject(i, charValues[9], java.sql.Types.NCHAR); } pstmt.execute(); } } + /** + * Populate char data with null data. + * + * @throws SQLException + */ + protected static void populateCharSetObjectNull() throws SQLException { + String sql = "insert into " + CHAR_TABLE_AE + " values( " + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," + + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?" + ")"; + + try (SQLServerConnection con = (SQLServerConnection) PrepUtil.getConnection(AETestConnectionString, AEInfo); + SQLServerPreparedStatement pstmt = (SQLServerPreparedStatement) TestUtils.getPreparedStmt(con, sql, + stmtColEncSetting)) { + + // char + for (int i = 1; i <= 3; i++) { + pstmt.setObject(i, null, java.sql.Types.CHAR); + } + + // varchar + for (int i = 4; i <= 6; i++) { + pstmt.setObject(i, null, java.sql.Types.VARCHAR); + } + + // varchar(max) + for (int i = 7; i <= 9; i++) { + pstmt.setObject(i, null, java.sql.Types.LONGVARCHAR); + } + + // nchar + for (int i = 10; i <= 12; i++) { + pstmt.setObject(i, null, java.sql.Types.NCHAR); + } + + // nvarchar + for (int i = 13; i <= 15; i++) { + pstmt.setObject(i, null, java.sql.Types.NVARCHAR); + } + + // nvarchar(max) + for (int i = 16; i <= 18; i++) { + pstmt.setObject(i, null, java.sql.Types.LONGNVARCHAR); + } + + // uniqueidentifier as String + for (int i = 19; i <= 21; i++) { + pstmt.setObject(i, null, microsoft.sql.Types.GUID); + } + + // uniqueidentifier + for (int i = 22; i <= 24; i++) { + pstmt.setObject(i, null, microsoft.sql.Types.GUID); + } + + // varchar8000 + for (int i = 25; i <= 27; i++) { + pstmt.setObject(i, null, java.sql.Types.VARCHAR); + } + + // nvarchar4000 + for (int i = 28; i <= 30; i++) { + pstmt.setObject(i, null, java.sql.Types.NCHAR); + } + + pstmt.execute(); + } + } + /** * Populate char data using set object with JDBC types. * @@ -980,19 +1065,24 @@ protected static void populateCharSetObjectWithJDBCTypes(String[] charValues) th pstmt.setObject(i, charValues[5], JDBCType.LONGNVARCHAR); } - // uniqueidentifier + // uniqueidentifier as String for (int i = 19; i <= 21; i++) { pstmt.setObject(i, charValues[6], microsoft.sql.Types.GUID); } - // varchar8000 + // uniqueidentifier for (int i = 22; i <= 24; i++) { - pstmt.setObject(i, charValues[7], JDBCType.VARCHAR); + pstmt.setObject(i, UUID.fromString(charValues[7]), microsoft.sql.Types.GUID); } - // vnarchar4000 + // varchar8000 for (int i = 25; i <= 27; i++) { - pstmt.setObject(i, charValues[8], JDBCType.NVARCHAR); + pstmt.setObject(i, charValues[8], JDBCType.VARCHAR); + } + + // vnarchar4000 + for (int i = 28; i <= 30; i++) { + pstmt.setObject(i, charValues[9], JDBCType.NVARCHAR); } pstmt.execute(); @@ -1032,19 +1122,18 @@ protected static void populateCharNullCase() throws SQLException { pstmt.setNull(i, java.sql.Types.NVARCHAR); } - // uniqueidentifier - for (int i = 19; i <= 21; i++) { + // uniqueidentifier as String, uniqueidentifier + for (int i = 19; i <= 24; i++) { pstmt.setNull(i, microsoft.sql.Types.GUID); - } // varchar8000 - for (int i = 22; i <= 24; i++) { + for (int i = 24; i <= 27; i++) { pstmt.setNull(i, java.sql.Types.VARCHAR); } // nvarchar4000 - for (int i = 25; i <= 27; i++) { + for (int i = 28; i <= 30; i++) { pstmt.setNull(i, java.sql.Types.NVARCHAR); } diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/JDBCEncryptionDecryptionTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/JDBCEncryptionDecryptionTest.java index 7376baca7..67af8a1db 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/JDBCEncryptionDecryptionTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/JDBCEncryptionDecryptionTest.java @@ -29,9 +29,7 @@ import com.azure.identity.ClientSecretCredentialBuilder; import java.util.Set; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; +import java.util.UUID; import org.junit.jupiter.api.Tag; import org.junit.jupiter.params.ParameterizedTest; @@ -1910,10 +1908,12 @@ private void testRichQuery(SQLServerStatement stmt, String tableName, String tab case "LONGNVARCHAR": pstmt.setNString(1, values[i + 1 / 3]); break; - case "GUID": - pstmt.setUniqueIdentifier(1, null); + case "GUIDSTRING": pstmt.setUniqueIdentifier(1, Constants.UID); break; + case "GUID": + pstmt.setObject(1, UUID.fromString(Constants.UID)); + break; case "BIT": if (values[i + 1 / 3].equals("null")) { pstmt.setObject(1, null, java.sql.Types.BIT); @@ -2121,7 +2121,7 @@ void testChars(SQLServerStatement stmt, String cekName, String[][] table, String populateCharSetObject(values); break; case SETOBJECT_NULL: - populateDateSetObjectNull(); + populateCharSetObjectNull(); break; case SETOBJECT_WITH_JDBCTYPES: populateCharSetObjectWithJDBCTypes(values); From 650c261af4f631df6dd367bb243f27311df940bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20de=20Launois?= <> Date: Thu, 23 May 2024 14:06:51 +0200 Subject: [PATCH 4/6] Allow conversion from UUID to GUID for AE --- src/main/java/com/microsoft/sqlserver/jdbc/DataTypes.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/DataTypes.java b/src/main/java/com/microsoft/sqlserver/jdbc/DataTypes.java index 2ee4b773b..89a6e5fa7 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/DataTypes.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/DataTypes.java @@ -584,7 +584,9 @@ enum SetterConversionAE { TIMESTAMP(JavaType.TIMESTAMP, EnumSet.of(JDBCType.TIME, // This is needed to send nanoseconds to the driver as // setTime() is only milliseconds JDBCType.TIMESTAMP, // This is datetime2 - JDBCType.DATETIME, JDBCType.SMALLDATETIME)); + JDBCType.DATETIME, JDBCType.SMALLDATETIME)), + + UUID(JavaType.UUID, EnumSet.of(JDBCType.GUID)); private final EnumSet to; private final JavaType from; From b2f9e4872bea4fc9c493bc5e82140d74e1269764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20de=20Launois?= <> Date: Thu, 23 May 2024 14:07:47 +0200 Subject: [PATCH 5/6] Fix Unit Tests --- .../sqlserver/jdbc/AlwaysEncrypted/AESetup.java | 14 +++++++------- .../AlwaysEncrypted/CallableStatementTest.java | 16 ++++++++-------- .../JDBCEncryptionDecryptionTest.java | 6 +++--- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/AESetup.java b/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/AESetup.java index 73b105180..13aefc05b 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/AESetup.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/AESetup.java @@ -816,7 +816,7 @@ protected static void populateBinaryNullCase() throws SQLException { */ protected static void populateCharNormalCase(String[] charValues) throws SQLException { String sql = "insert into " + CHAR_TABLE_AE + " values( " + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," - + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?" + ")"; + + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?" + ")"; try (SQLServerConnection con = (SQLServerConnection) PrepUtil.getConnection(AETestConnectionString, AEInfo); SQLServerPreparedStatement pstmt = (SQLServerPreparedStatement) TestUtils.getPreparedStmt(con, sql, @@ -868,7 +868,7 @@ protected static void populateCharNormalCase(String[] charValues) throws SQLExce } else { // cannot override setUniqueIdentifier to accept UUID parameter without breaking compatibility // falling back to testing UUID string parameter - pstmt.setUniqueIdentifier(i, charValues[6]); + pstmt.setUniqueIdentifier(i, charValues[7]); } } @@ -894,7 +894,7 @@ protected static void populateCharNormalCase(String[] charValues) throws SQLExce */ protected static void populateCharSetObject(String[] charValues) throws SQLException { String sql = "insert into " + CHAR_TABLE_AE + " values( " + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," - + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?" + ")"; + + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?" + ")"; try (SQLServerConnection con = (SQLServerConnection) PrepUtil.getConnection(AETestConnectionString, AEInfo); SQLServerPreparedStatement pstmt = (SQLServerPreparedStatement) TestUtils.getPreparedStmt(con, sql, @@ -937,7 +937,7 @@ protected static void populateCharSetObject(String[] charValues) throws SQLExcep // uniqueidentifier for (int i = 22; i <= 24; i++) { - pstmt.setObject(i, UUID.fromString(charValues[7]), microsoft.sql.Types.GUID); + pstmt.setObject(i, charValues[7] == null ? null : UUID.fromString(charValues[7]), microsoft.sql.Types.GUID); } // varchar8000 @@ -961,7 +961,7 @@ protected static void populateCharSetObject(String[] charValues) throws SQLExcep */ protected static void populateCharSetObjectNull() throws SQLException { String sql = "insert into " + CHAR_TABLE_AE + " values( " + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," - + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?" + ")"; + + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?" + ")"; try (SQLServerConnection con = (SQLServerConnection) PrepUtil.getConnection(AETestConnectionString, AEInfo); SQLServerPreparedStatement pstmt = (SQLServerPreparedStatement) TestUtils.getPreparedStmt(con, sql, @@ -1029,7 +1029,7 @@ protected static void populateCharSetObjectNull() throws SQLException { */ protected static void populateCharSetObjectWithJDBCTypes(String[] charValues) throws SQLException { String sql = "insert into " + CHAR_TABLE_AE + " values( " + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," - + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?" + ")"; + + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?" + ")"; try (SQLServerConnection con = (SQLServerConnection) PrepUtil.getConnection(AETestConnectionString, AEInfo); SQLServerPreparedStatement pstmt = (SQLServerPreparedStatement) TestUtils.getPreparedStmt(con, sql, @@ -1096,7 +1096,7 @@ protected static void populateCharSetObjectWithJDBCTypes(String[] charValues) th */ protected static void populateCharNullCase() throws SQLException { String sql = "insert into " + CHAR_TABLE_AE + " values( " + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," - + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?" + ")"; + + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?," + "?,?,?" + ")"; try (SQLServerConnection con = (SQLServerConnection) PrepUtil.getConnection(AETestConnectionString, AEInfo); SQLServerPreparedStatement pstmt = (SQLServerPreparedStatement) TestUtils.getPreparedStmt(con, sql, diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/CallableStatementTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/CallableStatementTest.java index 95531d698..33be3a6aa 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/CallableStatementTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/CallableStatementTest.java @@ -700,8 +700,8 @@ private void testInputProcedure2(String sql) throws SQLException { callableStatement.setNString(4, charValues[3]); callableStatement.setNString(5, charValues[4]); callableStatement.setNString(6, charValues[5]); - callableStatement.setString(7, charValues[7]); - callableStatement.setNString(8, charValues[8]); + callableStatement.setString(7, charValues[8]); + callableStatement.setNString(8, charValues[9]); try (SQLServerResultSet rs = (SQLServerResultSet) callableStatement.executeQuery()) { rs.next(); @@ -712,8 +712,8 @@ private void testInputProcedure2(String sql) throws SQLException { assertEquals(rs.getString(4).trim(), charValues[3], TestResource.getResource("R_inputParamFailed")); assertEquals(rs.getString(5).trim(), charValues[4], TestResource.getResource("R_inputParamFailed")); assertEquals(rs.getString(6).trim(), charValues[5], TestResource.getResource("R_inputParamFailed")); - assertEquals(rs.getString(7).trim(), charValues[7], TestResource.getResource("R_inputParamFailed")); - assertEquals(rs.getString(8).trim(), charValues[8], TestResource.getResource("R_inputParamFailed")); + assertEquals(rs.getString(7).trim(), charValues[8], TestResource.getResource("R_inputParamFailed")); + assertEquals(rs.getString(8).trim(), charValues[9], TestResource.getResource("R_inputParamFailed")); } } catch (Exception e) { fail(e.getMessage()); @@ -1534,10 +1534,10 @@ private void testOutputProcedureCharInorder(String sql) throws SQLException { assertEquals(nvarcharValuemax, charValues[5], TestResource.getResource("R_outputParamFailed")); String varcharValue8000 = callableStatement.getString(8).trim(); - assertEquals(varcharValue8000, charValues[7], TestResource.getResource("R_outputParamFailed")); + assertEquals(varcharValue8000, charValues[8], TestResource.getResource("R_outputParamFailed")); String nvarcharValue4000 = callableStatement.getNString(9).trim(); - assertEquals(nvarcharValue4000, charValues[8], TestResource.getResource("R_outputParamFailed")); + assertEquals(nvarcharValue4000, charValues[9], TestResource.getResource("R_outputParamFailed")); } catch (Exception e) { fail(e.getMessage()); @@ -1587,10 +1587,10 @@ private void testOutputProcedureCharInorderObject(String sql) throws SQLExceptio assertEquals(nvarcharValuemax.trim(), charValues[5], TestResource.getResource("R_outputParamFailed")); String varcharValue8000 = (String) callableStatement.getObject(8); - assertEquals(varcharValue8000, charValues[7], TestResource.getResource("R_outputParamFailed")); + assertEquals(varcharValue8000, charValues[8], TestResource.getResource("R_outputParamFailed")); String nvarcharValue4000 = (String) callableStatement.getObject(9); - assertEquals(nvarcharValue4000, charValues[8], TestResource.getResource("R_outputParamFailed")); + assertEquals(nvarcharValue4000, charValues[9], TestResource.getResource("R_outputParamFailed")); } catch (Exception e) { fail(e.getMessage()); diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/JDBCEncryptionDecryptionTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/JDBCEncryptionDecryptionTest.java index 67af8a1db..cf5938c7a 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/JDBCEncryptionDecryptionTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/JDBCEncryptionDecryptionTest.java @@ -517,7 +517,7 @@ public void testCharSpecificSetterNull(String serverName, String url, String pro try (SQLServerConnection con = PrepUtil.getConnection(AETestConnectionString, AEInfo); SQLServerStatement stmt = (SQLServerStatement) con.createStatement()) { - String[] values = {null, null, null, null, null, null, null, null, null}; + String[] values = {null, null, null, null, null, null, null, null, null, null}; testChars(stmt, cekJks, charTable, values, TestCase.NORMAL, false); } @@ -554,7 +554,7 @@ public void testCharSetObjectNull(String serverName, String url, String protocol try (SQLServerConnection con = PrepUtil.getConnection(AETestConnectionString, AEInfo); SQLServerStatement stmt = (SQLServerStatement) con.createStatement()) { - String[] values = {null, null, null, null, null, null, null, null, null}; + String[] values = {null, null, null, null, null, null, null, null, null, null}; testChars(stmt, cekJks, charTable, values, TestCase.SETOBJECT, false); } @@ -591,7 +591,7 @@ public void testCharSetNull(String serverName, String url, String protocol) thro try (SQLServerConnection con = PrepUtil.getConnection(AETestConnectionString, AEInfo); SQLServerStatement stmt = (SQLServerStatement) con.createStatement()) { - String[] values = {null, null, null, null, null, null, null, null, null}; + String[] values = {null, null, null, null, null, null, null, null, null, null}; testChars(stmt, cekJks, charTable, values, TestCase.NULL, false); } From ae94a1b4f1f5a393d28ea59e45acd5ac41d8dd15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20de=20Launois?= <> Date: Fri, 7 Jun 2024 22:32:24 +0200 Subject: [PATCH 6/6] Fix Unit Tests --- .../com/microsoft/sqlserver/jdbc/AlwaysEncrypted/AESetup.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/AESetup.java b/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/AESetup.java index 13aefc05b..0d1bc7ce3 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/AESetup.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/AlwaysEncrypted/AESetup.java @@ -1128,7 +1128,7 @@ protected static void populateCharNullCase() throws SQLException { } // varchar8000 - for (int i = 24; i <= 27; i++) { + for (int i = 25; i <= 27; i++) { pstmt.setNull(i, java.sql.Types.VARCHAR); }