From c7d1366438de8264950df141bd2feca5cb78308a Mon Sep 17 00:00:00 2001 From: lukaseder Date: Mon, 7 Jan 2019 12:20:31 +0100 Subject: [PATCH] [#8168] Add support for procedural blocks that do not generate BEGIN .. END --- jOOQ/src/main/java/org/jooq/DSLContext.java | 22 ++++++++ .../main/java/org/jooq/impl/BlockImpl.java | 54 ++++++++++++------- jOOQ/src/main/java/org/jooq/impl/DSL.java | 22 ++++++++ .../java/org/jooq/impl/DefaultDSLContext.java | 16 +++++- jOOQ/src/main/java/org/jooq/impl/If.java | 3 -- jOOQ/src/main/java/org/jooq/impl/Tools.java | 15 ++++++ 6 files changed, 110 insertions(+), 22 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/DSLContext.java b/jOOQ/src/main/java/org/jooq/DSLContext.java index 6dc69f4c14..15daf25db2 100644 --- a/jOOQ/src/main/java/org/jooq/DSLContext.java +++ b/jOOQ/src/main/java/org/jooq/DSLContext.java @@ -753,6 +753,28 @@ public interface DSLContext extends Scope , AutoCloseable { @Support({ FIREBIRD, MARIADB, POSTGRES }) Block begin(Collection statements); + + + + + + + + + + + + + + + + + + + + + + // ------------------------------------------------------------------------- // XXX Plain SQL API // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/BlockImpl.java b/jOOQ/src/main/java/org/jooq/impl/BlockImpl.java index 19285a0ecc..13d396b206 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BlockImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/BlockImpl.java @@ -90,12 +90,15 @@ final class BlockImpl extends AbstractQuery implements Block { - private final Collection statements; - BlockImpl(Configuration configuration, Collection statements) { + private final Collection statements; + private final boolean alwaysWrapInBeginEnd; + + BlockImpl(Configuration configuration, Collection statements, boolean alwaysWrapInBeginEnd) { super(configuration); this.statements = statements; + this.alwaysWrapInBeginEnd = alwaysWrapInBeginEnd; } @Override @@ -167,18 +170,27 @@ final class BlockImpl extends AbstractQuery implements Block { default: { + increment(ctx.data(), DATA_BLOCK_NESTING); accept0(ctx); + decrement(ctx.data(), DATA_BLOCK_NESTING); break; } } } private final void accept0(Context ctx) { - accept1(ctx, new ArrayList(statements)); + boolean wrapInBeginEnd = + alwaysWrapInBeginEnd + + + + ; + + accept1(ctx, new ArrayList(statements), wrapInBeginEnd); } @SuppressWarnings({ "rawtypes", "unchecked" }) - private static final void accept1(Context ctx, List statements) { + private static final void accept1(Context ctx, List statements, boolean wrapInBeginEnd) { @@ -221,7 +233,9 @@ final class BlockImpl extends AbstractQuery implements Block { - accept2(ctx, statements); + + + accept2(ctx, statements, wrapInBeginEnd); } private static final void semicolonAfterStatement(Context ctx, Statement s) { @@ -241,13 +255,15 @@ final class BlockImpl extends AbstractQuery implements Block { - private static final void accept2(Context ctx, List statements) { - ctx.visit(K_BEGIN); + private static final void accept2(Context ctx, List statements, boolean wrapInBeginEnd) { + if (wrapInBeginEnd) { + ctx.visit(K_BEGIN); - if (ctx.family() == MARIADB) - ctx.sql(' ').visit(K_NOT).sql(' ').visit(K_ATOMIC); + if (ctx.family() == MARIADB) + ctx.sql(' ').visit(K_NOT).sql(' ').visit(K_ATOMIC); - ctx.formatIndentStart(); + ctx.formatIndentStart(); + } if (statements.isEmpty()) { switch (ctx.family()) { @@ -305,13 +321,14 @@ final class BlockImpl extends AbstractQuery implements Block { } } - ctx.formatIndentEnd() - .formatSeparator() - .visit(K_END); + if (wrapInBeginEnd) { + ctx.formatIndentEnd() + .formatSeparator() + .visit(K_END); - switch (ctx.family()) { - case FIREBIRD: - break; + switch (ctx.family()) { + case FIREBIRD: + break; @@ -319,8 +336,9 @@ final class BlockImpl extends AbstractQuery implements Block { - default: - ctx.sql(';'); + default: + ctx.sql(';'); + } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index e2fc3816c0..7f5dfb00d8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -9761,6 +9761,28 @@ public class DSL { + + + + + + + + + + + + + + + + + + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java index 400f1e53bd..49977817bd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java @@ -788,9 +788,23 @@ public class DefaultDSLContext extends AbstractScope implements DSLContext, Seri @Override public Block begin(Collection statements) { - return new BlockImpl(configuration(), statements); + return new BlockImpl(configuration(), statements, true); } + + + + + + + + + + + + + + // ------------------------------------------------------------------------- // XXX Plain SQL API // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/If.java b/jOOQ/src/main/java/org/jooq/impl/If.java index 907c8835bd..a314b7a5cd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/If.java +++ b/jOOQ/src/main/java/org/jooq/impl/If.java @@ -145,9 +145,6 @@ package org.jooq.impl; - - - diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 58558711f8..d4c08e7e50 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -4600,6 +4600,21 @@ final class Tools { return null; } + /** + * Whether a counter is currently at the top level or not. + * + * @see #increment(Map, DataKey) + * @see #decrement(Map, DataKey) + */ + static final boolean toplevel(Map data, DataKey key) { + Integer updateCounts = (Integer) data.get(key); + + if (updateCounts == null) + throw new IllegalStateException(); + else + return updateCounts == 1; + } + /** * Increment a counter and return true if the counter was zero prior to * incrementing.