diff --git a/jOOQ/src/main/java/org/jooq/ExecuteContext.java b/jOOQ/src/main/java/org/jooq/ExecuteContext.java
index 33e075b8bc..d0e214e767 100644
--- a/jOOQ/src/main/java/org/jooq/ExecuteContext.java
+++ b/jOOQ/src/main/java/org/jooq/ExecuteContext.java
@@ -150,6 +150,13 @@ public interface ExecuteContext extends Scope {
+
+
+ /**
+ * The batch execution mode.
+ */
+ @NotNull
+ BatchMode batchMode();
/**
* The jOOQ {@link Query} objects that are being executed in batch mode, or
@@ -158,6 +165,8 @@ public interface ExecuteContext extends Scope {
* If a single Query is executed in non-batch mode, this will
* return an array of length 1, containing that
* Query
+ *
+ * Refer to {@link #batchMode()} to decide how to interpret this content.
*
* @see #query()
* @see #routine()
@@ -423,4 +432,29 @@ public interface ExecuteContext extends Scope {
* {@link Settings#getFetchServerOutputSize()} > 0.
*/
void serverOutput(String[] output);
+
+ /**
+ * The batch mode, which helps interpret the contents of
+ * {@link ExecuteContext#batchQueries()}.
+ */
+ enum BatchMode {
+
+ /**
+ * No {@link Batch} is being executed, but a single
+ * {@link ExecuteContext#query()} or a {@link ExecuteContext#routine()}.
+ */
+ NONE,
+
+ /**
+ * A {@link Batch} with a single {@link PreparedStatement} and multiple
+ * bind variable sets is being executed.
+ */
+ SINGLE,
+
+ /**
+ * A {@link Batch} with multiple static {@link Statement} and no bind
+ * variables is being executed.
+ */
+ MULTIPLE
+ }
}
diff --git a/jOOQ/src/main/java/org/jooq/impl/BatchMultiple.java b/jOOQ/src/main/java/org/jooq/impl/BatchMultiple.java
index 719f2aa9f9..5218f74ab7 100644
--- a/jOOQ/src/main/java/org/jooq/impl/BatchMultiple.java
+++ b/jOOQ/src/main/java/org/jooq/impl/BatchMultiple.java
@@ -42,6 +42,7 @@ import java.sql.SQLException;
import org.jooq.Configuration;
import org.jooq.ExecuteContext;
+import org.jooq.ExecuteContext.BatchMode;
import org.jooq.ExecuteListener;
import org.jooq.Query;
import org.jooq.conf.SettingsTools;
@@ -89,7 +90,7 @@ final class BatchMultiple extends AbstractBatch {
}
static int[] execute(final Configuration configuration, final Query[] queries) {
- ExecuteContext ctx = new DefaultExecuteContext(configuration, queries);
+ ExecuteContext ctx = new DefaultExecuteContext(configuration, BatchMode.MULTIPLE, queries);
ExecuteListener listener = ExecuteListeners.get(ctx);
Connection connection = ctx.connection();
diff --git a/jOOQ/src/main/java/org/jooq/impl/BatchSingle.java b/jOOQ/src/main/java/org/jooq/impl/BatchSingle.java
index b87d94e076..d0445797e0 100644
--- a/jOOQ/src/main/java/org/jooq/impl/BatchSingle.java
+++ b/jOOQ/src/main/java/org/jooq/impl/BatchSingle.java
@@ -57,6 +57,7 @@ import org.jooq.ExecuteContext;
import org.jooq.ExecuteListener;
import org.jooq.Param;
import org.jooq.Query;
+import org.jooq.ExecuteContext.BatchMode;
import org.jooq.conf.SettingsTools;
import org.jooq.exception.ControlFlowSignal;
import org.jooq.impl.R2DBC.BatchSingleSubscriber;
@@ -186,7 +187,7 @@ final class BatchSingle extends AbstractBatch implements BatchBindStep {
}
private final int[] executePrepared() {
- DefaultExecuteContext ctx = new DefaultExecuteContext(configuration, new Query[] { query });
+ DefaultExecuteContext ctx = new DefaultExecuteContext(configuration, BatchMode.SINGLE, new Query[] { query });
ExecuteListener listener = ExecuteListeners.get(ctx);
Connection connection = ctx.connection();
diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteContext.java
index 202df9f0f8..3b1226be03 100644
--- a/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteContext.java
+++ b/jOOQ/src/main/java/org/jooq/impl/DefaultExecuteContext.java
@@ -85,7 +85,6 @@ import org.jooq.tools.JooqLogger;
import org.jooq.tools.jdbc.JDBCUtils;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
// ...
@@ -112,7 +111,7 @@ class DefaultExecuteContext implements ExecuteContext {
private final Routine> routine;
private String sql;
- private final boolean batch;
+ private final BatchMode batchMode;
private final Query[] batchQueries;
private final String[] batchSQL;
private final int[] batchRows;
@@ -318,22 +317,22 @@ class DefaultExecuteContext implements ExecuteContext {
// ------------------------------------------------------------------------
DefaultExecuteContext(Configuration configuration) {
- this(configuration, null, null, null);
+ this(configuration, BatchMode.NONE, null, null, null);
}
- DefaultExecuteContext(Configuration configuration, Query[] batchQueries) {
- this(configuration, null, batchQueries, null);
+ DefaultExecuteContext(Configuration configuration, BatchMode batchMode, Query[] batchQueries) {
+ this(configuration, batchMode, null, batchQueries, null);
}
DefaultExecuteContext(Configuration configuration, Query query) {
- this(configuration, query, null, null);
+ this(configuration, BatchMode.NONE, query, null, null);
}
DefaultExecuteContext(Configuration configuration, Routine> routine) {
- this(configuration, null, null, routine);
+ this(configuration, BatchMode.NONE, null, null, routine);
}
- private DefaultExecuteContext(Configuration configuration, Query query, Query[] batchQueries, Routine> routine) {
+ private DefaultExecuteContext(Configuration configuration, BatchMode batchMode, Query query, Query[] batchQueries, Routine> routine) {
// [#4277] The ExecuteContext's Configuration will always return the same Connection,
// e.g. when running statements from sub-ExecuteContexts
@@ -343,6 +342,7 @@ class DefaultExecuteContext implements ExecuteContext {
this.originalConfiguration = configuration;
this.derivedConfiguration = configuration.derive(new ExecuteContextConnectionProvider());
this.data = new DataMap();
+ this.batchMode = batchMode;
this.query = query;
@@ -351,13 +351,11 @@ class DefaultExecuteContext implements ExecuteContext {
this.converterContext = new DefaultConverterContext(derivedConfiguration, data);
if (routine != null) {
- this.batch = false;
this.batchQueries = null;
this.batchRows = null;
this.batchSQL = null;
}
else if (batchQueries != null) {
- this.batch = true;
this.batchQueries = batchQueries;
this.batchRows = new int[batchQueries.length];
this.batchSQL = new String[batchQueries.length];
@@ -365,13 +363,11 @@ class DefaultExecuteContext implements ExecuteContext {
Arrays.fill(this.batchRows, -1);
}
else if (query == null) {
- this.batch = false;
this.batchQueries = null;
this.batchRows = null;
this.batchSQL = null;
}
else {
- this.batch = false;
this.batchQueries = null;
this.batchRows = null;
this.batchSQL = null;
@@ -414,7 +410,7 @@ class DefaultExecuteContext implements ExecuteContext {
}
// This can only be a BatchSingle or BatchMultiple execution
- else if (batch) {
+ else if (batchMode != BatchMode.NONE) {
return ExecuteType.BATCH;
}
@@ -494,9 +490,14 @@ class DefaultExecuteContext implements ExecuteContext {
+ @Override
+ public final BatchMode batchMode() {
+ return batchMode;
+ }
+
@Override
public final Query[] batchQueries() {
- return batch
+ return batchMode != BatchMode.NONE
? batchQueries
: query() != null
? new Query[] { query() }
@@ -524,7 +525,7 @@ class DefaultExecuteContext implements ExecuteContext {
@Override
public final String[] batchSQL() {
- return batch
+ return batchMode != BatchMode.NONE
? batchSQL
: routine != null || query() != null
? new String[] { sql }
@@ -663,7 +664,7 @@ class DefaultExecuteContext implements ExecuteContext {
@Override
public final int[] batchRows() {
- return batch
+ return batchMode != BatchMode.NONE
? batchRows
: routine != null || query() != null
? new int[] { rows }
diff --git a/jOOQ/src/main/java/org/jooq/impl/SimpleExecuteContext.java b/jOOQ/src/main/java/org/jooq/impl/SimpleExecuteContext.java
index 4013d6c208..636c4db5a8 100644
--- a/jOOQ/src/main/java/org/jooq/impl/SimpleExecuteContext.java
+++ b/jOOQ/src/main/java/org/jooq/impl/SimpleExecuteContext.java
@@ -106,6 +106,11 @@ final class SimpleExecuteContext extends AbstractScope implements ExecuteContext
+ @Override
+ public final BatchMode batchMode() {
+ throw new UnsupportedOperationException("Not implemented");
+ }
+
@Override
public final Query[] batchQueries() {
throw new UnsupportedOperationException("Not implemented");