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;