diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/GeneralTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/GeneralTests.java index d4069e0664..bc8d1a0e68 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/GeneralTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/GeneralTests.java @@ -489,7 +489,7 @@ extends BaseTest result2 = create().selectFrom(TAuthor()) - .forUpdate() - .fetch(); + .forUpdate() + .fetch(); assertEquals(2, result2.size()); + // Check again with limit / offset clauses + switch (getDialect()) { + case INGRES: + case ORACLE: + log.info("SKIPPING", "LIMIT .. OFFSET .. FOR UPDATE"); + break; + + default: { + Result result3 = create().select(TAuthor_ID()) + .from(TAuthor()) + .limit(5) + .offset(0) + .forUpdate() + .fetch(); + assertEquals(2, result3.size()); + Result result4 = create().selectFrom(TAuthor()) + .limit(5) + .offset(0) + .forUpdate() + .fetch(); + assertEquals(2, result4.size()); + } + } + switch (getDialect()) { case ASE: case DB2: diff --git a/jOOQ/src/main/java/org/jooq/SelectForUpdateStep.java b/jOOQ/src/main/java/org/jooq/SelectForUpdateStep.java index 0ad0d698cf..f4331c8480 100644 --- a/jOOQ/src/main/java/org/jooq/SelectForUpdateStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectForUpdateStep.java @@ -92,10 +92,16 @@ public interface SelectForUpdateStep extends SelectFinalStep { /** * Add a FOR UPDATE clause to the end of the query. + *

+ * Note: not all SQL dialects allow for combining a FOR UPDATE + * clause with LIMIT .. OFFSET, or with GROUP BY. + * This essentially includes {@link SQLDialect#INGRES} and + * {@link SQLDialect#ORACLE}. These incompatibilities are not reflected by + * the jOOQ API. * * @see LockProvider#setForUpdate(boolean) see LockProvider for more details */ - @Support({ASE, DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SYBASE}) + @Support({ ASE, DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SYBASE }) SelectForUpdateOfStep forUpdate(); /** diff --git a/jOOQ/src/main/java/org/jooq/SelectLimitStep.java b/jOOQ/src/main/java/org/jooq/SelectLimitStep.java index fc6d904d3a..7409a0afd2 100644 --- a/jOOQ/src/main/java/org/jooq/SelectLimitStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectLimitStep.java @@ -57,7 +57,7 @@ import static org.jooq.SQLDialect.SYBASE; * -- more than five books in German in the last three years * -- (from 2011), and sort those authors by last names * -- limiting results to the second and third row - * + * * SELECT T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME, COUNT(*) * FROM T_AUTHOR * JOIN T_BOOK ON T_AUTHOR.ID = T_BOOK.AUTHOR_ID @@ -86,7 +86,7 @@ import static org.jooq.SQLDialect.SYBASE; * .of(TAuthor.FIRST_NAME, TAuthor.LAST_NAME) * .noWait(); * Refer to the manual for more details - * + * * @author Lukas Eder */ public interface SelectLimitStep extends SelectForUpdateStep { @@ -134,7 +134,7 @@ public interface SelectLimitStep extends SelectForUpdateStep { * SELECT statements. */ @Support({ DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) - SelectFinalStep limit(int offset, int numberOfRows); + SelectForUpdateStep limit(int offset, int numberOfRows); /** * Add a LIMIT clause to the query using named parameters @@ -149,7 +149,7 @@ public interface SelectLimitStep extends SelectForUpdateStep { * and nested SELECT statements. */ @Support({ DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) - SelectFinalStep limit(int offset, Param numberOfRows); + SelectForUpdateStep limit(int offset, Param numberOfRows); /** * Add a LIMIT clause to the query using named parameters @@ -164,7 +164,7 @@ public interface SelectLimitStep extends SelectForUpdateStep { * and nested SELECT statements. */ @Support({ DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) - SelectFinalStep limit(Param offset, int numberOfRows); + SelectForUpdateStep limit(Param offset, int numberOfRows); /** * Add a LIMIT clause to the query using named parameters @@ -179,5 +179,5 @@ public interface SelectLimitStep extends SelectForUpdateStep { * and nested SELECT statements. */ @Support({ DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) - SelectFinalStep limit(Param offset, Param numberOfRows); + 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 e40746cf25..aea82589ee 100644 --- a/jOOQ/src/main/java/org/jooq/SelectOffsetStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectOffsetStep.java @@ -57,7 +57,7 @@ import static org.jooq.SQLDialect.SYBASE; * -- more than five books in German in the last three years * -- (from 2011), and sort those authors by last names * -- limiting results to the second and third row - * + * * SELECT T_AUTHOR.FIRST_NAME, T_AUTHOR.LAST_NAME, COUNT(*) * FROM T_AUTHOR * JOIN T_BOOK ON T_AUTHOR.ID = T_BOOK.AUTHOR_ID @@ -86,10 +86,10 @@ import static org.jooq.SQLDialect.SYBASE; * .of(TAuthor.FIRST_NAME, TAuthor.LAST_NAME) * .noWait(); * Refer to the manual for more details - * + * * @author Lukas Eder */ -public interface SelectOffsetStep extends SelectFinalStep { +public interface SelectOffsetStep extends SelectForUpdateStep { /** * Add an OFFSET clause to the query @@ -99,8 +99,8 @@ public interface SelectOffsetStep extends SelectFinalStep { * simulated with a ROW_NUMBER() window function and nested * SELECT statements. */ - @Support({DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE}) - SelectFinalStep offset(int offset); + @Support({ DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) + SelectForUpdateStep offset(int offset); /** * Add an OFFSET clause to the query using a named parameter @@ -110,6 +110,6 @@ public interface SelectOffsetStep extends SelectFinalStep { * simulated with a ROW_NUMBER() window function and nested * SELECT statements. */ - @Support({DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE}) - SelectFinalStep offset(Param offset); + @Support({ DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) + SelectForUpdateStep offset(Param offset); } diff --git a/jOOQ/src/main/java/org/jooq/SimpleSelectForUpdateStep.java b/jOOQ/src/main/java/org/jooq/SimpleSelectForUpdateStep.java index 980ebc1a7e..8287057824 100644 --- a/jOOQ/src/main/java/org/jooq/SimpleSelectForUpdateStep.java +++ b/jOOQ/src/main/java/org/jooq/SimpleSelectForUpdateStep.java @@ -69,10 +69,16 @@ public interface SimpleSelectForUpdateStep extends SimpleSelec /** * Add a FOR UPDATE clause to the end of the query. + *

+ * Note: not all SQL dialects allow for combining a FOR UPDATE + * clause with LIMIT .. OFFSET, or with GROUP BY. + * This essentially includes {@link SQLDialect#INGRES} and + * {@link SQLDialect#ORACLE}. These incompatibilities are not reflected by + * the jOOQ API. * * @see LockProvider#setForUpdate(boolean) see LockProvider for more details */ - @Support({ASE, DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SYBASE}) + @Support({ ASE, DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SYBASE }) SimpleSelectForUpdateOfStep forUpdate(); /** diff --git a/jOOQ/src/main/java/org/jooq/SimpleSelectLimitStep.java b/jOOQ/src/main/java/org/jooq/SimpleSelectLimitStep.java index ceabfc5d7d..985c00c25d 100644 --- a/jOOQ/src/main/java/org/jooq/SimpleSelectLimitStep.java +++ b/jOOQ/src/main/java/org/jooq/SimpleSelectLimitStep.java @@ -110,7 +110,7 @@ public interface SimpleSelectLimitStep extends SimpleSelectFor * SELECT statements. */ @Support({ DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) - SimpleSelectFinalStep limit(int offset, int numberOfRows); + SimpleSelectForUpdateStep limit(int offset, int numberOfRows); /** * Add a LIMIT clause to the query using named parameters @@ -125,7 +125,7 @@ public interface SimpleSelectLimitStep extends SimpleSelectFor * nested SELECT statements. */ @Support({ DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) - SimpleSelectFinalStep limit(int offset, Param numberOfRows); + SimpleSelectForUpdateStep limit(int offset, Param numberOfRows); /** * Add a LIMIT clause to the query using named parameters @@ -140,7 +140,7 @@ public interface SimpleSelectLimitStep extends SimpleSelectFor * nested SELECT statements. */ @Support({ DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) - SimpleSelectFinalStep limit(Param offset, int numberOfRows); + SimpleSelectForUpdateStep limit(Param offset, int numberOfRows); /** * Add a LIMIT clause to the query using named parameters @@ -155,5 +155,5 @@ public interface SimpleSelectLimitStep extends SimpleSelectFor * and nested SELECT statements. */ @Support({ DB2, DERBY, H2, HSQLDB, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE }) - SimpleSelectFinalStep limit(Param offset, Param numberOfRows); + 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 ebb098b01f..97e8e64ee0 100644 --- a/jOOQ/src/main/java/org/jooq/SimpleSelectOffsetStep.java +++ b/jOOQ/src/main/java/org/jooq/SimpleSelectOffsetStep.java @@ -66,7 +66,7 @@ import static org.jooq.SQLDialect.SYBASE; * @param The record type being returned by this query * @author Lukas Eder */ -public interface SimpleSelectOffsetStep extends SimpleSelectFinalStep { +public interface SimpleSelectOffsetStep extends SimpleSelectForUpdateStep { /** * Add an OFFSET clause to the query @@ -77,7 +77,7 @@ public interface SimpleSelectOffsetStep extends SimpleSelectFi * SELECT statements. */ @Support({DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE}) - SimpleSelectFinalStep offset(int offset); + SimpleSelectForUpdateStep offset(int offset); /** * Add an OFFSET clause to the query using a named parameter @@ -88,5 +88,5 @@ public interface SimpleSelectOffsetStep extends SimpleSelectFi * SELECT statements. */ @Support({DB2, DERBY, H2, HSQLDB, INGRES, MYSQL, ORACLE, POSTGRES, SQLITE, SQLSERVER, SYBASE}) - SimpleSelectFinalStep offset(Param offset); + SimpleSelectForUpdateStep offset(Param offset); }