From 1abb2a19fd60eb828003eb382137a7930f53e92b Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 6 Jun 2024 11:25:55 +0200 Subject: [PATCH] [jOOQ/jOOQ#16777] Support BigQuery's QUALIFY .. WINDOW keyword order --- .../java/org/jooq/impl/SelectQueryImpl.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 03b29884a1..b6322b4db4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -375,6 +375,8 @@ final class SelectQueryImpl extends AbstractResultQuery imp + + static final Set SUPPORT_FULL_WITH_TIES = SQLDialect.supportedBy(CLICKHOUSE, H2, MARIADB, POSTGRES, TRINO); static final Set EMULATE_DISTINCT_ON = SQLDialect.supportedBy(DERBY, FIREBIRD, HSQLDB, MARIADB, MYSQL, SQLITE, TRINO); @@ -2733,15 +2735,10 @@ final class SelectQueryImpl extends AbstractResultQuery imp // WINDOW clause // ------------- - context.start(SELECT_WINDOW); - if (Tools.isNotEmpty(window) && !NO_SUPPORT_WINDOW_CLAUSE.contains(context.dialect())) - context.formatSeparator() - .visit(K_WINDOW) - .separatorRequired(true) - .declareWindows(true, c -> c.visit(window)); - context.end(SELECT_WINDOW); + + acceptWindow(context); // QUALIFY clause // ------------- @@ -2754,6 +2751,11 @@ final class SelectQueryImpl extends AbstractResultQuery imp // [#15188] Callers ensure that the two QUALIFY conditions are mutually exclusive .visit(additionalQualify != null ? additionalQualify : getQualify().getWhere()); + + + + + // ORDER BY clause for local subselect // ----------------------------------- toSQLOrderBy( @@ -2829,6 +2831,18 @@ final class SelectQueryImpl extends AbstractResultQuery imp )); } + private void acceptWindow(Context context) { + context.start(SELECT_WINDOW); + + if (Tools.isNotEmpty(window) && !NO_SUPPORT_WINDOW_CLAUSE.contains(context.dialect())) + context.formatSeparator() + .visit(K_WINDOW) + .separatorRequired(true) + .declareWindows(true, c -> c.visit(window)); + + context.end(SELECT_WINDOW); + } +