From 18acc1dbcda63cc1a44949a030e3c1ed36893f95 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Wed, 15 Nov 2017 11:52:22 +0100 Subject: [PATCH] [#5315] Add support for ALTER TABLE .. DROP IF EXISTS --- .../main/java/org/jooq/AlterTableStep.java | 48 ++++++++++++++ .../java/org/jooq/impl/AlterTableImpl.java | 66 ++++++++++++++++++- jOOQ/src/main/java/org/jooq/impl/Tools.java | 66 +++++++++++++++++++ 3 files changed, 177 insertions(+), 3 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/AlterTableStep.java b/jOOQ/src/main/java/org/jooq/AlterTableStep.java index ba431d8578..d8751c2611 100644 --- a/jOOQ/src/main/java/org/jooq/AlterTableStep.java +++ b/jOOQ/src/main/java/org/jooq/AlterTableStep.java @@ -279,6 +279,33 @@ public interface AlterTableStep { @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) AlterTableDropStep drop(String field); + /** + * Add an DROP COLUMN IF EXISTS clause to the + * ALTER TABLE statement. + *

+ * This is an alias for {@link #dropColumnIfExists(Field)}. + */ + @Support({ H2, POSTGRES }) + AlterTableDropStep dropIfExists(Field field); + + /** + * Add an DROP COLUMN IF EXISTS clause to the + * ALTER TABLE statement. + *

+ * This is an alias for {@link #dropColumnIfExists(Name)}. + */ + @Support({ H2, POSTGRES }) + AlterTableDropStep dropIfExists(Name field); + + /** + * Add an DROP COLUMN IF EXISTS clause to the + * ALTER TABLE statement. + *

+ * This is an alias for {@link #dropColumnIfExists(String)}. + */ + @Support({ H2, POSTGRES }) + AlterTableDropStep dropIfExists(String field); + /** * Add an DROP COLUMN clause to the ALTER TABLE * statement. @@ -300,6 +327,27 @@ public interface AlterTableStep { @Support({ CUBRID, DERBY, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES }) AlterTableDropStep dropColumn(String field); + /** + * Add an DROP COLUMN IF EXISTS clause to the ALTER TABLE + * statement. + */ + @Support({ H2, POSTGRES }) + AlterTableDropStep dropColumnIfExists(Field field); + + /** + * Add an DROP COLUMN IF EXISTS clause to the ALTER TABLE + * statement. + */ + @Support({ H2, POSTGRES }) + AlterTableDropStep dropColumnIfExists(Name field); + + /** + * Add an DROP COLUMN IF EXISTS clause to the ALTER TABLE + * statement. + */ + @Support({ H2, POSTGRES }) + AlterTableDropStep dropColumnIfExists(String field); + /** * Add a DROP CONSTRAINT clause to the ALTER TABLE * statement. diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java index 5185a96660..f1bf119c6c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java @@ -161,6 +161,7 @@ final class AlterTableImpl extends AbstractQuery implements private final Table table; private final boolean ifExists; + private boolean ifExistsColumn; private Table renameTo; private Field renameColumn; private Field renameColumnTo; @@ -440,6 +441,21 @@ final class AlterTableImpl extends AbstractQuery implements return dropColumn(field); } + @Override + public final AlterTableImpl dropIfExists(Field field) { + return dropColumnIfExists(field); + } + + @Override + public final AlterTableImpl dropIfExists(Name field) { + return dropColumnIfExists(field); + } + + @Override + public final AlterTableImpl dropIfExists(String field) { + return dropColumnIfExists(field); + } + @Override public final AlterTableImpl dropColumn(Name field) { return dropColumn(field(field)); @@ -456,6 +472,22 @@ final class AlterTableImpl extends AbstractQuery implements return this; } + @Override + public final AlterTableImpl dropColumnIfExists(Name field) { + return dropColumnIfExists(field(field)); + } + + @Override + public final AlterTableImpl dropColumnIfExists(String field) { + return dropColumnIfExists(name(field)); + } + + @Override + public final AlterTableImpl dropColumnIfExists(Field field) { + ifExistsColumn = true; + return dropColumn(field); + } + @Override public final AlterTableImpl drop(Constraint constraint) { dropConstraint = constraint; @@ -505,6 +537,19 @@ final class AlterTableImpl extends AbstractQuery implements } private final void accept0(Context ctx) { + if (ifExistsColumn && !supportsIfExists(ctx)) { + Field field = field(table.getQualifiedName().append(dropColumn.getUnqualifiedName())); + + Tools.beginTryCatchIfExistsColumn(ctx, DDLStatementType.ALTER_TABLE, field); + accept1(ctx); + Tools.endTryCatchIfExistsColumn(ctx, DDLStatementType.ALTER_TABLE, field); + } + else { + accept1(ctx); + } + } + + private final void accept1(Context ctx) { SQLDialect family = ctx.family(); @@ -558,10 +603,10 @@ final class AlterTableImpl extends AbstractQuery implements } } - accept1(ctx); + accept2(ctx); } - private final void accept1(Context ctx) { + private final void accept2(Context ctx) { SQLDialect family = ctx.family(); boolean omitAlterTable = @@ -835,6 +880,21 @@ final class AlterTableImpl extends AbstractQuery implements break; } + if (ifExistsColumn) { + switch (family) { + + + + + + case H2: + case POSTGRES: + default: + ctx.sql(' ').visit(K_IF_EXISTS); + break; + } + } + ctx.sql(' ') .qualify(false) .visit(dropColumn) @@ -949,7 +1009,7 @@ final class AlterTableImpl extends AbstractQuery implements - accept1(ctx); + accept2(ctx); diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 4b83aa1acd..76227b023f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -3778,6 +3778,54 @@ final class Tools { + + + + + + + + + + + + + + + + + + + + + + default: + beginTryCatch(ctx, type); + break; + } + } + + static final void beginTryCatchIfExistsColumn(Context ctx, DDLStatementType type, QueryPart object) { + switch (ctx.family()) { + + + + + + + + + + + + + + + + + + + @@ -3817,6 +3865,24 @@ final class Tools { + default: + endTryCatch(ctx, type); + break; + } + } + + static final void endTryCatchIfExistsColumn(Context ctx, DDLStatementType type, QueryPart object) { + switch (ctx.family()) { + + + + + + + + + + default: endTryCatch(ctx, type); break;