From 22864c297667443be89934c679b4797cbdd8e7c7 Mon Sep 17 00:00:00 2001 From: Karina Zhou Date: Thu, 27 May 2021 11:50:00 -0700 Subject: [PATCH] Fix | Clear batch params when clearing params in pstmt (#1578) Port changes from https://github.com/microsoft/mssql-jdbc/pull/1509 and fix test failure --- .../jdbc/SQLServerPreparedStatement.java | 1 + .../BatchExecutionWithNullTest.java | 63 +++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java index c9d72d3367..ab46fc0b92 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java @@ -373,6 +373,7 @@ public final void clearParameters() throws SQLServerException { loggerExternal.entering(getClassNameLogging(), "clearParameters"); checkClosed(); encryptionMetadataIsRetrieved = false; + cryptoMetaBatch.clear(); int i; if (inOutParam == null) return; diff --git a/src/test/java/com/microsoft/sqlserver/jdbc/preparedStatement/BatchExecutionWithNullTest.java b/src/test/java/com/microsoft/sqlserver/jdbc/preparedStatement/BatchExecutionWithNullTest.java index b66434b8b0..1da2e4744c 100644 --- a/src/test/java/com/microsoft/sqlserver/jdbc/preparedStatement/BatchExecutionWithNullTest.java +++ b/src/test/java/com/microsoft/sqlserver/jdbc/preparedStatement/BatchExecutionWithNullTest.java @@ -110,6 +110,69 @@ public void testAddbatch2AEOnConnection() throws SQLException { public void testAddbatch2() throws SQLException { testAddBatch2(getConnection()); } + + /** + * TestClearBatch with AE enabled on the connection + * + * @throws SQLException + */ + @Test + @Tag(Constants.xSQLv12) + public void testClearBatchAEOnConnection() throws SQLException { + try (Connection connection = PrepUtil.getConnection(connectionString + ";columnEncryptionSetting=Enabled;")) { + testClearBatch(connection); + } + } + + /** + * Test the same as testClearBatchAEOnConnection, with AE disabled + * + * @throws SQLException + */ + @Test + public void testClearBatch() throws SQLException { + testClearBatch(getConnection()); + } + + private void testClearBatch(Connection conn) throws SQLException { + // Use specific table for this testing + String batchTable = TestUtils + .escapeSingleQuotes(AbstractSQLGenerator.escapeIdentifier(RandomUtil.getIdentifier("batchTable"))); + String CREATE_TABLE_SQL = "create table " + batchTable + " (KEY1 numeric(19,0) not null, KEY2 numeric(19,0) not null, primary key (KEY1, KEY2))"; + String INSERT_ROW_SQL = "INSERT INTO " + batchTable + "(KEY1, KEY2) VALUES(?, ?)"; + + try (Statement s = conn.createStatement()) { + try ( PreparedStatement pstmt = conn.prepareStatement(INSERT_ROW_SQL)) { + s.execute(CREATE_TABLE_SQL); + // Set auto-commit to false + conn.setAutoCommit(false); + executeBatch(pstmt, 10, "foo".hashCode() + 1); + pstmt.clearParameters(); + executeBatch(pstmt, 10, "bar".hashCode() + 2); + conn.commit(); + } catch (Exception e) { + conn.rollback(); + throw e; + } finally { + TestUtils.dropTableIfExists(batchTable, s); + } + } + } + + private void executeBatch(PreparedStatement pstmt, int count, int run) throws SQLException { + long base = System.currentTimeMillis(); + + for (int idx = 1; idx <= count; idx++) { + pstmt.setLong(1, base + idx); + pstmt.setLong(2, run); + pstmt.addBatch(); + } + + int[] rowCounts = pstmt.executeBatch(); + for (int idx = 0; idx < rowCounts.length; idx++) { + assertTrue(rowCounts[idx] == 1, "Row " + idx + " was not successfully inserted."); + } + } @BeforeEach @Tag(Constants.xSQLv12)