diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/AggregateWindowFunctionTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/AggregateWindowFunctionTests.java index 74f6703d1e..8430f454d5 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/AggregateWindowFunctionTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/AggregateWindowFunctionTests.java @@ -256,7 +256,6 @@ extends BaseTest rows = create().select(rowNumber().over()).from(TBook()).fetch(0, Integer.class); assertEquals(asList(1, 2, 3, 4), rows); @@ -273,6 +272,7 @@ extends BaseTest { /** * Add an OVER clause */ - @Support({ DB2, DERBY, H2, POSTGRES, ORACLE, SQLSERVER, SYBASE }) + @Support({ DB2, DERBY, H2, HSQLDB, POSTGRES, ORACLE, SQLSERVER, SYBASE }) WindowPartitionByStep over(); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Factory.java b/jOOQ/src/main/java/org/jooq/impl/Factory.java index f671788200..62835fa4a5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Factory.java +++ b/jOOQ/src/main/java/org/jooq/impl/Factory.java @@ -50,6 +50,7 @@ import static org.jooq.SQLDialect.SQLITE; import static org.jooq.SQLDialect.SQLSERVER; import static org.jooq.SQLDialect.SYBASE; import static org.jooq.conf.SettingsTools.getRenderMapping; +import static org.jooq.impl.Term.ROW_NUMBER; import static org.jooq.impl.Util.combine; import java.io.IOException; @@ -5101,11 +5102,13 @@ public class Factory implements FactoryOperations { *

* Newer versions of {@link SQLDialect#DERBY} and {@link SQLDialect#H2} also * support the ROW_NUMBER() OVER() window function without any - * window clause. See the respective docs for details + * window clause. See the respective docs for details. + * {@link SQLDialect#HSQLDB} can simulate this function using + * ROWNUM() */ - @Support({ DB2, DERBY, H2, POSTGRES, ORACLE, SQLSERVER, SYBASE }) + @Support({ DB2, DERBY, H2, HSQLDB, POSTGRES, ORACLE, SQLSERVER, SYBASE }) public static WindowOverStep rowNumber() { - return new Function("row_number", SQLDataType.INTEGER); + return new Function(ROW_NUMBER, SQLDataType.INTEGER); } /** diff --git a/jOOQ/src/main/java/org/jooq/impl/Function.java b/jOOQ/src/main/java/org/jooq/impl/Function.java index fb93403a1f..7dcb28fe07 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Function.java +++ b/jOOQ/src/main/java/org/jooq/impl/Function.java @@ -46,6 +46,7 @@ import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.SQLDialect.SYBASE; import static org.jooq.impl.Factory.one; import static org.jooq.impl.Term.LIST_AGG; +import static org.jooq.impl.Term.ROW_NUMBER; import java.util.Arrays; import java.util.Collection; @@ -299,7 +300,16 @@ class Function extends AbstractField implements } private final void toSQLOverClause(RenderContext context) { - if (!over) return; + + // Render this clause only if needed + if (!over) { + return; + } + + // [#1524] Don't render this clause where it is not supported + if (over && term == ROW_NUMBER && context.getDialect() == HSQLDB) { + return; + } String glue = ""; context.keyword(" over ("); diff --git a/jOOQ/src/main/java/org/jooq/impl/Term.java b/jOOQ/src/main/java/org/jooq/impl/Term.java index 556c0933e6..9c86414187 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Term.java +++ b/jOOQ/src/main/java/org/jooq/impl/Term.java @@ -149,6 +149,17 @@ enum Term { return "octet_length"; } }, + ROW_NUMBER { + @Override + public String translate(SQLDialect dialect) { + switch (dialect) { + case HSQLDB: + return "rownum"; + } + + return "row_number"; + } + }, STDDEV_POP { @Override public String translate(SQLDialect dialect) {