Avoid calling executeBatch() with an empty batch

See gh-27154
This commit is contained in:
Li0n13 2021-07-11 17:08:32 +03:00 committed by Stephane Nicoll
parent a6b0c75cae
commit 2d7bf83d8d
2 changed files with 29 additions and 1 deletions

View File

@ -1050,7 +1050,7 @@ public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
}
ps.addBatch();
}
return ps.executeBatch();
return batchSize > 0 ? ps.executeBatch() : new int[] {};
}
else {
List<Integer> rowsAffected = new ArrayList<>();

View File

@ -505,6 +505,34 @@ public class JdbcTemplateTests {
verify(this.connection, atLeastOnce()).close();
}
@Test
public void testBatchUpdateWithPreparedStatementWithEmptyData() throws Exception {
final String sql = "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = ?";
final int[] ids = new int[] {};
final int[] rowsAffected = new int[] {};
given(this.preparedStatement.executeBatch()).willReturn(rowsAffected);
mockDatabaseMetaData(true);
BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setInt(1, ids[i]);
}
@Override
public int getBatchSize() {
return ids.length;
}
};
JdbcTemplate template = new JdbcTemplate(this.dataSource, false);
int[] actualRowsAffected = template.batchUpdate(sql, setter);
assertThat(actualRowsAffected.length == 0).as("executed 0 updates").isTrue();
verify(this.preparedStatement, never()).executeBatch();
}
@Test
public void testInterruptibleBatchUpdate() throws Exception {
final String sql = "UPDATE NOSUCHTABLE SET DATE_DISPATCHED = SYSDATE WHERE ID = ?";