From 6f13d24232d8504ddb249dbf5f885d55fba2c0ac Mon Sep 17 00:00:00 2001 From: Knut Wannheden Date: Wed, 22 May 2019 11:01:20 +0200 Subject: [PATCH] [#8646] Call Statement#setFetchSize(int) where applicable Calling Statement#setFetchSize(int) can also make sense in other places than AbstractResultQuery. Specifically it is now also called in AbstractDMLQuery and AbstractRoutine. In each case the fetch size will be determined using Settings#getFetchSize(), except for AbstractResultQuery where the value supplied via ResultQuery#fetchSize(int) takes precedence. --- .../java/org/jooq/impl/AbstractDMLQuery.java | 8 ++++--- .../org/jooq/impl/AbstractResultQuery.java | 10 +-------- .../java/org/jooq/impl/AbstractRoutine.java | 1 + jOOQ/src/main/java/org/jooq/impl/Tools.java | 21 +++++++++++++++++++ 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java index a9f443d4e0..d1640a53c7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java @@ -699,7 +699,7 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery case CUBRID: super.prepare(ctx); - return; + break; // Some dialects can only return AUTO_INCREMENT values // Other values have to be fetched in a second step @@ -719,7 +719,7 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery case MARIADB: case MYSQL: ctx.statement(connection.prepareStatement(ctx.sql(), Statement.RETURN_GENERATED_KEYS)); - return; + break; // The default is to return all requested fields directly @@ -755,10 +755,12 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery names[i] = returningResolvedAsterisks.get(i).getName(); ctx.statement(connection.prepareStatement(ctx.sql(), names)); - return; + break; } } } + + Tools.setFetchSize(ctx, 0); } @SuppressWarnings({ "rawtypes", "unchecked" }) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java index 16ea4cc6ff..2e4fabf27f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractResultQuery.java @@ -272,15 +272,7 @@ abstract class AbstractResultQuery extends AbstractQuery imple ctx.statement(ctx.connection().prepareStatement(ctx.sql())); } - // [#1263] [#4753] Allow for negative fetch sizes to support some non-standard - // MySQL feature, where Integer.MIN_VALUE is used - int f = SettingsTools.getFetchSize(fetchSize, ctx.settings()); - if (f != 0) { - if (log.isDebugEnabled()) - log.debug("Setting fetch size", f); - - ctx.statement().setFetchSize(f); - } + Tools.setFetchSize(ctx, fetchSize); // [#1854] [#4753] Set the max number of rows for this result query int m = SettingsTools.getMaxRows(maxRows, ctx.settings()); diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java index 6ef488c39a..5f60a84f9f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractRoutine.java @@ -487,6 +487,7 @@ public abstract class AbstractRoutine extends AbstractNamed implements Routin listener.prepareStart(ctx); ctx.statement(connection.prepareCall(ctx.sql())); + Tools.setFetchSize(ctx, 0); // [#1856] TODO: Add Statement flags like timeout here listener.prepareEnd(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 65c75ebd66..da0ae72635 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -245,6 +245,7 @@ import org.jooq.UDTRecord; import org.jooq.UpdatableRecord; import org.jooq.conf.BackslashEscaping; import org.jooq.conf.Settings; +import org.jooq.conf.SettingsTools; import org.jooq.conf.ThrowExceptions; import org.jooq.exception.DataAccessException; import org.jooq.exception.DataTypeException; @@ -1908,6 +1909,26 @@ final class Tools { } } + /** + * Sets the statement's fetch size to the given value or + * {@link org.jooq.conf.Settings#getFetchSize()} if {@code 0}. + *

+ * This method should not be called before {@link ExecuteContext#statement(PreparedStatement)}. + */ + static final void setFetchSize(ExecuteContext ctx, int fetchSize) throws SQLException { + // [#1263] [#4753] Allow for negative fetch sizes to support some non-standard + // MySQL feature, where Integer.MIN_VALUE is used + int f = SettingsTools.getFetchSize(fetchSize, ctx.settings()); + if (f != 0) { + if (log.isDebugEnabled()) + log.debug("Setting fetch size", f); + + PreparedStatement statement = ctx.statement(); + if (statement != null) + statement.setFetchSize(f); + } + } + /** * Get the only element from a list or null, or throw an * exception