From 81d18ecf06cd5a5d71f88ce3d24f0630ba8ebb70 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 9 Nov 2012 13:39:54 +0100 Subject: [PATCH] [#1954] Bad SQL rendered when combining ORDER BY [ some-function ] with LIMIT .. OFFSET in DB2, SQL Server - Workaround for DB2: Avoid ORDER BY clause in ROW_NUMBER() ranking function --- .../jooq/test/_/testcases/OrderByTests.java | 5 +++- .../java/org/jooq/impl/AbstractSubSelect.java | 30 +++++++++++-------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/OrderByTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/OrderByTests.java index d591340e2e..310b3535ca 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/OrderByTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/OrderByTests.java @@ -45,6 +45,7 @@ import static org.jooq.SQLDialect.HSQLDB; import static org.jooq.SQLDialect.INGRES; import static org.jooq.SQLDialect.SYBASE; import static org.jooq.impl.Factory.count; +import static org.jooq.impl.Factory.inline; import static org.jooq.impl.Factory.lower; import static org.jooq.impl.Factory.param; import static org.jooq.impl.Factory.table; @@ -260,7 +261,9 @@ extends BaseTest extends AbstractSelect imp .keyword("select ") .sql(subqueryName) .sql(".*, row_number() ") - .keyword("over (order by "); + .keyword("over ("); - if (getOrderBy().isEmpty()) { - context.literal(getSelect().get(0).getName()); - } - else { - String separator = ""; + // [#1954] DB2 can do without ORDER BY clause in ranking functions + if (asList(SQLSERVER, SYBASE).contains(context.getDialect())) { + context.keyword("order by "); - for (SortField field : getOrderBy()) { - context.sql(separator) - .literal(field.getName()) - .sql(" ") - .keyword(field.getOrder().toSQL()); + if (getOrderBy().isEmpty()) { + context.literal(getSelect().get(0).getName()); + } + else { + String separator = ""; - separator = ", "; + for (SortField field : getOrderBy()) { + context.sql(separator) + .literal(field.getName()) + .sql(" ") + .keyword(field.getOrder().toSQL()); + + separator = ", "; + } } }