diff --git a/jOOQ/src/main/java/org/jooq/AlterTableAddStep.java b/jOOQ/src/main/java/org/jooq/AlterTableAddStep.java
index 8dbedd555a..4c04aa6498 100644
--- a/jOOQ/src/main/java/org/jooq/AlterTableAddStep.java
+++ b/jOOQ/src/main/java/org/jooq/AlterTableAddStep.java
@@ -38,6 +38,7 @@
package org.jooq;
// ...
+import static org.jooq.SQLDialect.FIREBIRD;
import static org.jooq.SQLDialect.H2;
import static org.jooq.SQLDialect.HSQLDB;
// ...
@@ -72,7 +73,7 @@ public interface AlterTableAddStep extends AlterTableFinalStep {
/**
* Add a FIRST clause to ALTER TABLE .. ADD ...
*/
- @Support({ H2, MYSQL })
+ @Support({ FIREBIRD, H2, MYSQL })
AlterTableFinalStep first();
/**
diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java
index 51042ea7e9..c9574aac7f 100644
--- a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java
+++ b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java
@@ -120,6 +120,7 @@ import static org.jooq.impl.Keywords.K_LIKE;
import static org.jooq.impl.Keywords.K_MODIFY;
import static org.jooq.impl.Keywords.K_NOT_NULL;
import static org.jooq.impl.Keywords.K_NULL;
+import static org.jooq.impl.Keywords.K_POSITION;
import static org.jooq.impl.Keywords.K_PRIMARY_KEY;
import static org.jooq.impl.Keywords.K_RAISE;
import static org.jooq.impl.Keywords.K_RENAME;
@@ -896,6 +897,23 @@ final class AlterTableImpl extends AbstractRowCountQuery implements
}
}
+ if (family == FIREBIRD) {
+ if (addFirst) {
+ begin(ctx);
+ beginExecuteImmediate(ctx);
+ accept1(ctx);
+ endExecuteImmediate(ctx);
+
+ ctx.formatSeparator();
+
+ beginExecuteImmediate(ctx);
+ ctx.visit(K_ALTER_TABLE).sql(' ').visit(table).sql(' ').visit(K_ALTER).sql(' ').visit(addColumn).sql(' ').visit(K_POSITION).sql(" 1");
+ endExecuteImmediate(ctx);
+ end(ctx);
+ return;
+ }
+ }
+
@@ -1528,7 +1546,7 @@ final class AlterTableImpl extends AbstractRowCountQuery implements
private final void acceptFirstBeforeAfter(Context> ctx) {
boolean previous = ctx.qualify();
- if (addFirst)
+ if (addFirst && ctx.family() != FIREBIRD)
ctx.sql(' ').visit(K_FIRST);
else if (addBefore != null)
ctx.sql(' ').visit(K_BEFORE).sql(' ').qualify(false).visit(addBefore).qualify(previous);
diff --git a/jOOQ/src/main/java/org/jooq/impl/Keywords.java b/jOOQ/src/main/java/org/jooq/impl/Keywords.java
index d036ee3820..197d4289b0 100644
--- a/jOOQ/src/main/java/org/jooq/impl/Keywords.java
+++ b/jOOQ/src/main/java/org/jooq/impl/Keywords.java
@@ -266,6 +266,7 @@ final class Keywords {
static final Keyword K_PASSING = keyword("passing");
static final Keyword K_PERCENT = keyword("percent");
static final Keyword K_PIVOT = keyword("pivot");
+ static final Keyword K_POSITION = keyword("position");
static final Keyword K_PRECEDING = keyword("preceding");
static final Keyword K_PREVIOUS_VALUE_FOR = keyword("previous value for");
static final Keyword K_PRIMARY_KEY = keyword("primary key");