diff --git a/jOOQ-website/src/main/resources/manual-2.5.xml b/jOOQ-website/src/main/resources/manual-2.5.xml
index bcdd663513..0c7f20efa9 100644
--- a/jOOQ-website/src/main/resources/manual-2.5.xml
+++ b/jOOQ-website/src/main/resources/manual-2.5.xml
@@ -1851,6 +1851,9 @@ SELECT * FROM BOOK OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY
-- Ingres
SELECT * FROM BOOK OFFSET 2 FETCH FIRST 1 ROWS ONLY
+-- Firebird
+SELECT FIRST 1 SKIP 3 * FROM BOOK
+
-- Sybase SQL Anywhere
SELECT TOP 1 ROWS START AT 3 * FROM BOOK
diff --git a/jOOQ/src/main/java/org/jooq/OrderProvider.java b/jOOQ/src/main/java/org/jooq/OrderProvider.java
index f1c3736b2d..0fa24e00f1 100644
--- a/jOOQ/src/main/java/org/jooq/OrderProvider.java
+++ b/jOOQ/src/main/java/org/jooq/OrderProvider.java
@@ -38,6 +38,7 @@ package org.jooq;
import static org.jooq.SQLDialect.CUBRID;
import static org.jooq.SQLDialect.DB2;
import static org.jooq.SQLDialect.DERBY;
+import static org.jooq.SQLDialect.FIREBIRD;
import static org.jooq.SQLDialect.H2;
import static org.jooq.SQLDialect.HSQLDB;
import static org.jooq.SQLDialect.INGRES;
@@ -103,7 +104,7 @@ public interface OrderProvider {
* This clause can be used only along with Oracle's CONNECT BY
* clause, to indicate that the hierarchical ordering should be preserved
* and elements of each hierarchy should be ordered among themselves.
- *
+ *
* @param orderBySiblings
*/
@Support({ CUBRID, ORACLE })
@@ -152,7 +153,7 @@ public interface OrderProvider {
* @param offset The lowest offset starting at 0
* @param numberOfRows The number of rows to return
*/
- @Support({ CUBRID, DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
+ @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
void addLimit(int offset, int numberOfRows);
/**
diff --git a/jOOQ/src/main/java/org/jooq/SelectLimitStep.java b/jOOQ/src/main/java/org/jooq/SelectLimitStep.java
index 0dcd269b25..a25301ed68 100644
--- a/jOOQ/src/main/java/org/jooq/SelectLimitStep.java
+++ b/jOOQ/src/main/java/org/jooq/SelectLimitStep.java
@@ -38,6 +38,7 @@ package org.jooq;
import static org.jooq.SQLDialect.CUBRID;
import static org.jooq.SQLDialect.DB2;
import static org.jooq.SQLDialect.DERBY;
+import static org.jooq.SQLDialect.FIREBIRD;
import static org.jooq.SQLDialect.H2;
import static org.jooq.SQLDialect.HSQLDB;
import static org.jooq.SQLDialect.INGRES;
@@ -134,7 +135,7 @@ public interface SelectLimitStep extends SelectForUpdateStep {
* simulated with a ROW_NUMBER() window function and nested
* SELECT statements.
*/
- @Support({ CUBRID, DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
+ @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
SelectForUpdateStep limit(int offset, int numberOfRows);
/**
diff --git a/jOOQ/src/main/java/org/jooq/SelectOffsetStep.java b/jOOQ/src/main/java/org/jooq/SelectOffsetStep.java
index 7a0e9de25c..3e0ae3710f 100644
--- a/jOOQ/src/main/java/org/jooq/SelectOffsetStep.java
+++ b/jOOQ/src/main/java/org/jooq/SelectOffsetStep.java
@@ -38,6 +38,7 @@ package org.jooq;
import static org.jooq.SQLDialect.CUBRID;
import static org.jooq.SQLDialect.DB2;
import static org.jooq.SQLDialect.DERBY;
+import static org.jooq.SQLDialect.FIREBIRD;
import static org.jooq.SQLDialect.H2;
import static org.jooq.SQLDialect.HSQLDB;
import static org.jooq.SQLDialect.INGRES;
@@ -100,7 +101,7 @@ public interface SelectOffsetStep extends SelectForUpdateStep {
* simulated with a ROW_NUMBER() window function and nested
* SELECT statements.
*/
- @Support({ CUBRID, DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
+ @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
SelectForUpdateStep offset(int offset);
/**
diff --git a/jOOQ/src/main/java/org/jooq/SimpleSelectLimitStep.java b/jOOQ/src/main/java/org/jooq/SimpleSelectLimitStep.java
index fc3e41463c..09fa1a500a 100644
--- a/jOOQ/src/main/java/org/jooq/SimpleSelectLimitStep.java
+++ b/jOOQ/src/main/java/org/jooq/SimpleSelectLimitStep.java
@@ -38,6 +38,7 @@ package org.jooq;
import static org.jooq.SQLDialect.CUBRID;
import static org.jooq.SQLDialect.DB2;
import static org.jooq.SQLDialect.DERBY;
+import static org.jooq.SQLDialect.FIREBIRD;
import static org.jooq.SQLDialect.H2;
import static org.jooq.SQLDialect.HSQLDB;
import static org.jooq.SQLDialect.INGRES;
@@ -110,7 +111,7 @@ public interface SimpleSelectLimitStep extends SimpleSelectFor
* simulated with a ROW_NUMBER() window function and nested
* SELECT statements.
*/
- @Support({ CUBRID, DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
+ @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
SimpleSelectForUpdateStep limit(int offset, int numberOfRows);
/**
diff --git a/jOOQ/src/main/java/org/jooq/SimpleSelectOffsetStep.java b/jOOQ/src/main/java/org/jooq/SimpleSelectOffsetStep.java
index d5fb4fc3aa..e5a4164b65 100644
--- a/jOOQ/src/main/java/org/jooq/SimpleSelectOffsetStep.java
+++ b/jOOQ/src/main/java/org/jooq/SimpleSelectOffsetStep.java
@@ -38,6 +38,7 @@ package org.jooq;
import static org.jooq.SQLDialect.CUBRID;
import static org.jooq.SQLDialect.DB2;
import static org.jooq.SQLDialect.DERBY;
+import static org.jooq.SQLDialect.FIREBIRD;
import static org.jooq.SQLDialect.H2;
import static org.jooq.SQLDialect.HSQLDB;
import static org.jooq.SQLDialect.INGRES;
@@ -77,7 +78,7 @@ public interface SimpleSelectOffsetStep extends SimpleSelectFo
* simulated with a ROW_NUMBER() window function and nested
* SELECT statements.
*/
- @Support({ CUBRID, DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
+ @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE })
SimpleSelectForUpdateStep offset(int offset);
/**
diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractSubSelect.java b/jOOQ/src/main/java/org/jooq/impl/AbstractSubSelect.java
index 438c5e0175..de8af106b7 100644
--- a/jOOQ/src/main/java/org/jooq/impl/AbstractSubSelect.java
+++ b/jOOQ/src/main/java/org/jooq/impl/AbstractSubSelect.java
@@ -216,8 +216,9 @@ implements
break;
}
- // Sybase has TOP .. START AT support, but only without bind
- // variables
+ // Sybase has TOP .. START AT support (no bind values)
+ // Firebird has FIRST .. SKIP support (no bind values)
+ case FIREBIRD:
case SYBASE: {
// Native TOP support, without OFFSET and without bind values
@@ -462,6 +463,7 @@ implements
break;
}
+ case FIREBIRD:
case SYBASE: {
if (getLimit().isApplicable() && !getLimit().rendersParams()) {
context.sql(getLimit()).sql(" ");
diff --git a/jOOQ/src/main/java/org/jooq/impl/Limit.java b/jOOQ/src/main/java/org/jooq/impl/Limit.java
index ea950a234b..31858643fb 100644
--- a/jOOQ/src/main/java/org/jooq/impl/Limit.java
+++ b/jOOQ/src/main/java/org/jooq/impl/Limit.java
@@ -54,11 +54,12 @@ class Limit extends AbstractQueryPart {
* Generated UID
*/
private static final long serialVersionUID = 2053741242981425602L;
+
private Field numberOfRows;
private Field offset;
private Field offsetOrZero = val(0);
private Field offsetPlusOne = val(1);
- private boolean rendersParams;;
+ private boolean rendersParams;
@Override
public final void toSQL(RenderContext context) {
@@ -143,6 +144,19 @@ class Limit extends AbstractQueryPart {
break;
}
+ // Nice FIRST .. SKIP support
+ // --------------------------
+ case FIREBIRD: {
+ context.inline(true)
+ .keyword("first ")
+ .sql(numberOfRows)
+ .keyword(" skip ")
+ .sql(offsetOrZero)
+ .inline(inline);
+
+ break;
+ }
+
// Only "TOP" support provided by the following dialects.
// "OFFSET" support is simulated with nested selects
// -----------------------------------------------------------------
@@ -247,6 +261,12 @@ class Limit extends AbstractQueryPart {
break;
}
+ // No bind variables in the FIRST .. SKIP clause
+ // ---------------------------------------------
+ case FIREBIRD: {
+ break;
+ }
+
// These dialects don't allow bind variables in their TOP clauses
// --------------------------------------------------------------
case DB2: