You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2017/09/15 16:41:14 UTC

groovy git commit: GROOVY-8288 executeBatch() should not be called with batchCount == 0 (closes #586)

Repository: groovy
Updated Branches:
  refs/heads/master 70ce561c1 -> 0a612c254


GROOVY-8288 executeBatch() should not be called with batchCount == 0
(closes #586)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/0a612c25
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/0a612c25
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/0a612c25

Branch: refs/heads/master
Commit: 0a612c2545485c02d7d61dcbadfaa4a063c54b16
Parents: 70ce561
Author: Antoine Kapps <an...@orange.fr>
Authored: Tue Aug 15 09:42:26 2017 +0200
Committer: sunlan <su...@apache.org>
Committed: Sat Sep 16 00:40:37 2017 +0800

----------------------------------------------------------------------
 .../groovy/sql/BatchingStatementWrapper.java    | 17 ++++++++-
 .../test/groovy/groovy/sql/SqlBatchTest.groovy  | 40 ++++++++++++++++++++
 2 files changed, 55 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/0a612c25/subprojects/groovy-sql/src/main/java/groovy/sql/BatchingStatementWrapper.java
----------------------------------------------------------------------
diff --git a/subprojects/groovy-sql/src/main/java/groovy/sql/BatchingStatementWrapper.java b/subprojects/groovy-sql/src/main/java/groovy/sql/BatchingStatementWrapper.java
index edb5212..8e6c4e1 100644
--- a/subprojects/groovy-sql/src/main/java/groovy/sql/BatchingStatementWrapper.java
+++ b/subprojects/groovy-sql/src/main/java/groovy/sql/BatchingStatementWrapper.java
@@ -83,8 +83,10 @@ public class BatchingStatementWrapper extends GroovyObjectSupport {
     }
 
     public int[] executeBatch() throws SQLException {
-        int[] lastResult = delegate.executeBatch();
-        processResult(lastResult);
+        if (shouldCallDelegate()) {
+            int[] lastResult = delegate.executeBatch();
+            processResult(lastResult);
+        }
         int[] result = new int[results.size()];
         for (int i = 0; i < results.size(); i++) {
             result[i] = results.get(i);
@@ -93,6 +95,17 @@ public class BatchingStatementWrapper extends GroovyObjectSupport {
         return result;
     }
 
+    private boolean shouldCallDelegate() {
+        if (batchCount > 0) {
+            return true;
+        } else if (results.isEmpty()) {
+            log.warning("Nothing has been added to batch. This might cause the JDBC driver to throw an exception.");
+            return true;
+        }
+        // Nothing added since last delegate execution. No need to call the delegate this time.
+        return false;
+    }
+
     protected void processResult(int[] lastResult) {
         boolean foundError = false;
         for (int i : lastResult) {

http://git-wip-us.apache.org/repos/asf/groovy/blob/0a612c25/subprojects/groovy-sql/src/test/groovy/groovy/sql/SqlBatchTest.groovy
----------------------------------------------------------------------
diff --git a/subprojects/groovy-sql/src/test/groovy/groovy/sql/SqlBatchTest.groovy b/subprojects/groovy-sql/src/test/groovy/groovy/sql/SqlBatchTest.groovy
index 02a6d65..6916113 100644
--- a/subprojects/groovy-sql/src/test/groovy/groovy/sql/SqlBatchTest.groovy
+++ b/subprojects/groovy-sql/src/test/groovy/groovy/sql/SqlBatchTest.groovy
@@ -18,6 +18,8 @@
  */
 package groovy.sql
 
+import groovy.test.GroovyAssert
+
 import javax.sql.DataSource
 
 import static groovy.sql.SqlTestConstants.*
@@ -119,6 +121,44 @@ class SqlBatchTest extends GroovyTestCase {
         // FINE: Successfully executed batch with 1 command(s)
     }
 
+    void testWithBatchHavingSizeSameSizeAsStatements() {
+        def numRows = sql.rows("SELECT * FROM PERSON").size()
+        assert numRows == 3
+        def myOthers = ['f4':'l4','f5':'l5','f6':'l6','f7':'l7']
+        def result = sql.withBatch(myOthers.size(), "insert into PERSON (id, firstname, lastname) values (?, ?, ?)") { ps ->
+            myOthers.eachWithIndex { k, v, index ->
+                def id = index + numRows + 1
+                ps.addBatch(id, k, v)
+            }
+        }
+        assert result == [1] * myOthers.size()
+        assert sql.rows("SELECT * FROM PERSON").size() == numRows + myOthers.size()
+        // end result the same as if no batching was in place but logging should show:
+        // FINE: Successfully executed batch with 4 command(s)
+    }
+
+    void testWithBatchNothingAddedToBatch() {
+        def numRows = sql.rows("SELECT * FROM PERSON").size()
+        assert numRows == 3
+
+        def result = sql.withBatch { ps ->
+            // Add nothing
+        }
+        assert result == [] as int[]
+    }
+
+    void testWithBatchWithPreparedStatementNothingAddedToBatch() {
+        def numRows = sql.rows("SELECT * FROM PERSON").size()
+        assert numRows == 3
+
+        // If you create a PreparedStatement you have to use it - or else HSQL throws an exception
+        GroovyAssert.shouldFail {
+            sql.withBatch(3, "insert into PERSON (id, firstname, lastname) values (?, ?, ?)") { ps ->
+                // Add nothing - not a good practice at all...
+            }
+        }
+    }
+
     void testWithBatchInsideWithTransaction() {
         def numRows = sql.rows("SELECT * FROM PERSON").size()
         assert numRows == 3