From d841e4fd1bad2dd126363c55818d876a9807f97e Mon Sep 17 00:00:00 2001 From: Rene Ye Date: Fri, 29 Jan 2021 15:05:38 -0800 Subject: [PATCH 1/2] Clear batchparams --- .../com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java index 6848ea6dc1..3f456dfbbd 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java @@ -364,6 +364,7 @@ public final void clearParameters() throws SQLServerException { loggerExternal.entering(getClassNameLogging(), "clearParameters"); checkClosed(); encryptionMetadataIsRetrieved = false; + cryptoMetaBatch.clear(); int i; if (inOutParam == null) return; From cf65b09bdf11234f864241a0eeca47bc2adb0727 Mon Sep 17 00:00:00 2001 From: Rene Ye Date: Fri, 29 Jan 2021 15:16:50 -0800 Subject: [PATCH 2/2] add user's test --- .../BatchExecutionWithNullTest.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) 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..4c0b55b5cb 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,45 @@ public void testAddbatch2AEOnConnection() throws SQLException { public void testAddbatch2() throws SQLException { testAddBatch2(getConnection()); } + + @Test + public void testClearBatch() throws SQLException { + String batchTable = 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 (Connection conn = getConnection(); 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++) { + System.out.printf("Row %2d %s successfully inserted.\n", idx + 1, rowCounts[idx] == 1 ? "was" : "was not"); + } + } @BeforeEach @Tag(Constants.xSQLv12)