From 4ff3c98bccf46fbac1e1406c04e7843ae9211fbc Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Sun, 19 Aug 2012 12:59:24 +0200 Subject: [PATCH] [#430] Add support for the Firebird database - Fixed LIMIT --- .../src/main/resources/manual-2.5.xml | 3 +++ .../src/main/java/org/jooq/OrderProvider.java | 5 +++-- .../main/java/org/jooq/SelectLimitStep.java | 3 ++- .../main/java/org/jooq/SelectOffsetStep.java | 3 ++- .../java/org/jooq/SimpleSelectLimitStep.java | 3 ++- .../java/org/jooq/SimpleSelectOffsetStep.java | 3 ++- .../java/org/jooq/impl/AbstractSubSelect.java | 6 +++-- jOOQ/src/main/java/org/jooq/impl/Limit.java | 22 ++++++++++++++++++- 8 files changed, 39 insertions(+), 9 deletions(-) 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: