From 04ab71c8219373e2fcd95508d4aff915c7b88b78 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Sun, 19 Aug 2012 14:47:03 +0200 Subject: [PATCH] [#430] Add support for the Firebird database - Implement LIMIT using ROWS .. TO, instead of FIRST .. SKIP --- .../src/main/resources/manual-2.5.xml | 2 +- .../src/main/java/org/jooq/OrderProvider.java | 8 ++-- .../main/java/org/jooq/SelectLimitStep.java | 8 ++-- .../main/java/org/jooq/SelectOffsetStep.java | 2 +- .../java/org/jooq/SimpleSelectLimitStep.java | 8 ++-- .../java/org/jooq/SimpleSelectOffsetStep.java | 2 +- .../java/org/jooq/impl/AbstractSubSelect.java | 2 - jOOQ/src/main/java/org/jooq/impl/Limit.java | 42 ++++++++++--------- 8 files changed, 38 insertions(+), 36 deletions(-) diff --git a/jOOQ-website/src/main/resources/manual-2.5.xml b/jOOQ-website/src/main/resources/manual-2.5.xml index 0c7f20efa9..dba42b8432 100644 --- a/jOOQ-website/src/main/resources/manual-2.5.xml +++ b/jOOQ-website/src/main/resources/manual-2.5.xml @@ -1852,7 +1852,7 @@ SELECT * FROM BOOK OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY SELECT * FROM BOOK OFFSET 2 FETCH FIRST 1 ROWS ONLY -- Firebird -SELECT FIRST 1 SKIP 3 * FROM BOOK +SELECT * FROM BOOK ROWS 2 TO 3 -- 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 0fa24e00f1..63a23b0b72 100644 --- a/jOOQ/src/main/java/org/jooq/OrderProvider.java +++ b/jOOQ/src/main/java/org/jooq/OrderProvider.java @@ -136,7 +136,7 @@ public interface OrderProvider { * * @param numberOfRows The number of rows to return */ - @Support({ CUBRID, DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) + @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) void addLimit(Param numberOfRows); /** @@ -171,7 +171,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, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) + @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) void addLimit(Param offset, int numberOfRows); /** @@ -189,7 +189,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, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) + @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) void addLimit(int offset, Param numberOfRows); /** @@ -207,7 +207,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, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) + @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) void addLimit(Param offset, Param numberOfRows); } diff --git a/jOOQ/src/main/java/org/jooq/SelectLimitStep.java b/jOOQ/src/main/java/org/jooq/SelectLimitStep.java index a25301ed68..ee0fdd90d5 100644 --- a/jOOQ/src/main/java/org/jooq/SelectLimitStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectLimitStep.java @@ -121,7 +121,7 @@ public interface SelectLimitStep extends SelectForUpdateStep { * This is the same as calling {@link #limit(int, int)} with offset = 0, or * calling .limit(numberOfRows).offset(0) */ - @Support({ CUBRID, DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) + @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) SelectOffsetStep limit(Param numberOfRows); /** @@ -150,7 +150,7 @@ public interface SelectLimitStep extends SelectForUpdateStep { * this may be simulated with a ROW_NUMBER() window function * and nested SELECT statements. */ - @Support({ CUBRID, DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) + @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) SelectForUpdateStep limit(int offset, Param numberOfRows); /** @@ -165,7 +165,7 @@ public interface SelectLimitStep extends SelectForUpdateStep { * this may be simulated with a ROW_NUMBER() window function * and nested SELECT statements. */ - @Support({ CUBRID, DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) + @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) SelectForUpdateStep limit(Param offset, int numberOfRows); /** @@ -180,6 +180,6 @@ public interface SelectLimitStep extends SelectForUpdateStep { * this may be simulated with a ROW_NUMBER() window function * and nested SELECT statements. */ - @Support({ CUBRID, DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) + @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) SelectForUpdateStep limit(Param offset, Param numberOfRows); } diff --git a/jOOQ/src/main/java/org/jooq/SelectOffsetStep.java b/jOOQ/src/main/java/org/jooq/SelectOffsetStep.java index 3e0ae3710f..af1cb6fd0e 100644 --- a/jOOQ/src/main/java/org/jooq/SelectOffsetStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectOffsetStep.java @@ -112,6 +112,6 @@ 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(Param offset); } diff --git a/jOOQ/src/main/java/org/jooq/SimpleSelectLimitStep.java b/jOOQ/src/main/java/org/jooq/SimpleSelectLimitStep.java index 09fa1a500a..9c95076e64 100644 --- a/jOOQ/src/main/java/org/jooq/SimpleSelectLimitStep.java +++ b/jOOQ/src/main/java/org/jooq/SimpleSelectLimitStep.java @@ -97,7 +97,7 @@ public interface SimpleSelectLimitStep extends SimpleSelectFor * This is the same as calling {@link #limit(int, int)} with offset = 0, or * calling .limit(numberOfRows).offset(0) */ - @Support({ CUBRID, DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) + @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) SimpleSelectOffsetStep limit(Param numberOfRows); /** @@ -126,7 +126,7 @@ public interface SimpleSelectLimitStep extends SimpleSelectFor * this may be simulated with a ROW_NUMBER() window function and * nested SELECT statements. */ - @Support({ CUBRID, DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) + @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) SimpleSelectForUpdateStep limit(int offset, Param numberOfRows); /** @@ -141,7 +141,7 @@ public interface SimpleSelectLimitStep extends SimpleSelectFor * this may be simulated with a ROW_NUMBER() window function and * nested SELECT statements. */ - @Support({ CUBRID, DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) + @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) SimpleSelectForUpdateStep limit(Param offset, int numberOfRows); /** @@ -156,6 +156,6 @@ public interface SimpleSelectLimitStep extends SimpleSelectFor * this may be simulated with a ROW_NUMBER() window function * and nested SELECT statements. */ - @Support({ CUBRID, DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) + @Support({ CUBRID, DB2, DERBY, FIREBIRD, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) SimpleSelectForUpdateStep limit(Param offset, Param numberOfRows); } diff --git a/jOOQ/src/main/java/org/jooq/SimpleSelectOffsetStep.java b/jOOQ/src/main/java/org/jooq/SimpleSelectOffsetStep.java index e5a4164b65..2fcc4d0b65 100644 --- a/jOOQ/src/main/java/org/jooq/SimpleSelectOffsetStep.java +++ b/jOOQ/src/main/java/org/jooq/SimpleSelectOffsetStep.java @@ -89,6 +89,6 @@ 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(Param offset); } diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractSubSelect.java b/jOOQ/src/main/java/org/jooq/impl/AbstractSubSelect.java index 58c04ac077..ddb243afd8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractSubSelect.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractSubSelect.java @@ -219,7 +219,6 @@ implements // 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 @@ -464,7 +463,6 @@ 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 31858643fb..6412e2772c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Limit.java +++ b/jOOQ/src/main/java/org/jooq/impl/Limit.java @@ -36,6 +36,7 @@ package org.jooq.impl; import static org.jooq.RenderContext.CastMode.NEVER; +import static org.jooq.impl.Factory.inline; import static org.jooq.impl.Factory.val; import org.jooq.BindContext; @@ -100,6 +101,20 @@ class Limit extends AbstractQueryPart { break; } + // ROWS .. TO .. + // ------------- + case FIREBIRD: { + context.castMode(NEVER) + .formatSeparator() + .keyword("rows ") + .sql(getLowerRownum().add(inline(1))) + .keyword(" to ") + .sql(getUpperRownum()) + .castMode(castMode); + + break; + } + case DERBY: { // Casts are not supported here... @@ -144,19 +159,6 @@ 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 // ----------------------------------------------------------------- @@ -238,6 +240,14 @@ class Limit extends AbstractQueryPart { break; } + // No bind variables in the FIRST .. SKIP clause + // --------------------------------------------- + case FIREBIRD: { + context.bind(getLowerRownum()); + context.bind(getUpperRownum()); + break; + } + // These dialects don't support bind variables at all case ASE: case INGRES: { @@ -261,12 +271,6 @@ 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: