From c6eb9a736c0365248b6fb67c4d3fac3e5cbdf0b9 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Fri, 22 Jan 2016 11:34:18 +0100 Subject: [PATCH] [#4969] Add support for CREATE SEQUENCE IF NOT EXISTS --- jOOQ/src/main/java/org/jooq/DSLContext.java | 24 +++++++++++++ .../org/jooq/impl/CreateSequenceImpl.java | 34 +++++++++++++++++-- jOOQ/src/main/java/org/jooq/impl/DSL.java | 30 ++++++++++++++++ .../java/org/jooq/impl/DefaultDSLContext.java | 17 +++++++++- .../org/jooq/impl/DefaultRenderContext.java | 8 +++-- 5 files changed, 107 insertions(+), 6 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/DSLContext.java b/jOOQ/src/main/java/org/jooq/DSLContext.java index f4cf3b71a8..db3806d53c 100644 --- a/jOOQ/src/main/java/org/jooq/DSLContext.java +++ b/jOOQ/src/main/java/org/jooq/DSLContext.java @@ -7201,6 +7201,30 @@ public interface DSLContext extends Scope , AutoCloseable { @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, POSTGRES }) CreateSequenceFinalStep createSequence(Sequence sequence); + /** + * Create a new DSL CREATE SEQUENCE statement. + * + * @see DSL#createSequenceIfNotExists(String) + */ + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES }) + CreateSequenceFinalStep createSequenceIfNotExists(String sequence); + + /** + * Create a new DSL CREATE SEQUENCE statement. + * + * @see DSL#createSequenceIfNotExists(Name) + */ + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES }) + CreateSequenceFinalStep createSequenceIfNotExists(Name sequence); + + /** + * Create a new DSL CREATE SEQUENCE statement. + * + * @see DSL#createSequenceIfNotExists(String) + */ + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES }) + CreateSequenceFinalStep createSequenceIfNotExists(Sequence sequence); + /** * Create a new DSL ALTER SEQUENCE statement. * diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateSequenceImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateSequenceImpl.java index 4c51253157..df5d1dc354 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateSequenceImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateSequenceImpl.java @@ -43,8 +43,14 @@ package org.jooq.impl; import static java.util.Arrays.asList; import static org.jooq.Clause.CREATE_SEQUENCE; import static org.jooq.Clause.CREATE_SEQUENCE_SEQUENCE; +// ... +// ... import static org.jooq.SQLDialect.CUBRID; +// ... import static org.jooq.SQLDialect.DERBY; +import static org.jooq.SQLDialect.FIREBIRD; +// ... +// ... // ... import org.jooq.Clause; @@ -68,25 +74,47 @@ class CreateSequenceImpl extends AbstractQuery implements private static final Clause[] CLAUSES = { CREATE_SEQUENCE }; private final Sequence sequence; + private final boolean ifNotExists; - CreateSequenceImpl(Configuration configuration, Sequence sequence) { + CreateSequenceImpl(Configuration configuration, Sequence sequence, boolean ifNotExists) { super(configuration); this.sequence = sequence; + this.ifNotExists = ifNotExists; } // ------------------------------------------------------------------------ // XXX: QueryPart API // ------------------------------------------------------------------------ + private final boolean supportsIfNotExists(Context ctx) { + return !asList(DERBY, FIREBIRD).contains(ctx.family()); + } + @Override public final void accept(Context ctx) { + if (ifNotExists && !supportsIfNotExists(ctx)) { + Utils.executeImmediateBegin(ctx, DDLStatementType.CREATE_SEQUENCE); + accept0(ctx); + Utils.executeImmediateEnd(ctx, DDLStatementType.CREATE_SEQUENCE); + } + else { + accept0(ctx); + } + } + + private final void accept0(Context ctx) { ctx.start(CREATE_SEQUENCE_SEQUENCE) .keyword("create") .sql(' ') .keyword(ctx.family() == CUBRID ? "serial" : "sequence") - .sql(' ') - .visit(sequence); + .sql(' '); + + if (ifNotExists && supportsIfNotExists(ctx)) + ctx.keyword("if not exists") + .sql(' '); + + ctx.visit(sequence); // Some databases default to sequences starting with MIN_VALUE if (asList(DERBY).contains(ctx.family())) diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index c9e7d51658..22ac055149 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -5715,6 +5715,36 @@ public class DSL { return using(new DefaultConfiguration()).createSequence(sequence); } + /** + * Create a new DSL CREATE SEQUENCE IF NOT EXISTS statement. + * + * @see DSLContext#createSequenceIfNotExists(String) + */ + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES }) + public static CreateSequenceFinalStep createSequenceIfNotExists(String sequence) { + return using(new DefaultConfiguration()).createSequenceIfNotExists(sequence); + } + + /** + * Create a new DSL CREATE SEQUENCE IF NOT EXISTS statement. + * + * @see DSLContext#createSequenceIfNotExists(Name) + */ + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES }) + public static CreateSequenceFinalStep createSequenceIfNotExists(Name sequence) { + return using(new DefaultConfiguration()).createSequenceIfNotExists(sequence); + } + + /** + * Create a new DSL CREATE SEQUENCE IF NOT EXISTS statement. + * + * @see DSLContext#createSequenceIfNotExists(Sequence) + */ + @Support({ FIREBIRD, H2, HSQLDB, POSTGRES }) + public static CreateSequenceFinalStep createSequenceIfNotExists(Sequence sequence) { + return using(new DefaultConfiguration()).createSequenceIfNotExists(sequence); + } + /** * Create a new DSL ALTER SEQUENCE statement. * diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java index f79391d280..74ad054843 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultDSLContext.java @@ -2297,7 +2297,22 @@ public class DefaultDSLContext extends AbstractScope implements DSLContext, Seri @Override public CreateSequenceFinalStep createSequence(Sequence sequence) { - return new CreateSequenceImpl(configuration(), sequence); + return new CreateSequenceImpl(configuration(), sequence, false); + } + + @Override + public CreateSequenceFinalStep createSequenceIfNotExists(String sequence) { + return createSequenceIfNotExists(name(sequence)); + } + + @Override + public CreateSequenceFinalStep createSequenceIfNotExists(Name sequence) { + return createSequenceIfNotExists(sequence(sequence)); + } + + @Override + public CreateSequenceFinalStep createSequenceIfNotExists(Sequence sequence) { + return new CreateSequenceImpl(configuration(), sequence, true); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java index dd67ac216b..5c5d838265 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java @@ -118,9 +118,13 @@ class DefaultRenderContext extends AbstractContext implements Ren qualifyCatalog(context.qualifyCatalog()); qualifySchema(context.qualifySchema()); castMode(context.castMode()); - declareFields(context.declareFields()); - declareTables(context.declareTables()); data().putAll(context.data()); + + declareCTE = context.declareCTE(); + declareWindows = context.declareWindows(); + declareFields = context.declareFields(); + declareTables = context.declareTables(); + declareAliases = context.declareAliases(); } // ------------------------------------------------------------------------