[#4969] Add support for CREATE SEQUENCE IF NOT EXISTS

This commit is contained in:
lukaseder 2016-01-22 11:34:18 +01:00
parent 045ab81ef0
commit c6eb9a736c
5 changed files with 107 additions and 6 deletions

View File

@ -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 <code>CREATE SEQUENCE</code> statement.
*
* @see DSL#createSequenceIfNotExists(String)
*/
@Support({ FIREBIRD, H2, HSQLDB, POSTGRES })
CreateSequenceFinalStep createSequenceIfNotExists(String sequence);
/**
* Create a new DSL <code>CREATE SEQUENCE</code> statement.
*
* @see DSL#createSequenceIfNotExists(Name)
*/
@Support({ FIREBIRD, H2, HSQLDB, POSTGRES })
CreateSequenceFinalStep createSequenceIfNotExists(Name sequence);
/**
* Create a new DSL <code>CREATE SEQUENCE</code> statement.
*
* @see DSL#createSequenceIfNotExists(String)
*/
@Support({ FIREBIRD, H2, HSQLDB, POSTGRES })
CreateSequenceFinalStep createSequenceIfNotExists(Sequence<?> sequence);
/**
* Create a new DSL <code>ALTER SEQUENCE</code> statement.
*

View File

@ -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()))

View File

@ -5715,6 +5715,36 @@ public class DSL {
return using(new DefaultConfiguration()).createSequence(sequence);
}
/**
* Create a new DSL <code>CREATE SEQUENCE IF NOT EXISTS</code> 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 <code>CREATE SEQUENCE IF NOT EXISTS</code> 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 <code>CREATE SEQUENCE IF NOT EXISTS</code> 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 <code>ALTER SEQUENCE</code> statement.
*

View File

@ -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

View File

@ -118,9 +118,13 @@ class DefaultRenderContext extends AbstractContext<RenderContext> 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();
}
// ------------------------------------------------------------------------