From 0d408bdeba661f4f3a2ef83963e7601afef67543 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 7 Jun 2024 14:10:57 +0200 Subject: [PATCH] [jOOQ/jOOQ#16796] Incorrect emulation of inverse distribution functions with FILTER clause --- .../org/jooq/impl/AbstractAggregateFunction.java | 14 ++++++++++---- jOOQ/src/main/java/org/jooq/impl/ListAgg.java | 2 +- .../main/java/org/jooq/impl/PercentileCont.java | 10 ++++++++++ .../main/java/org/jooq/impl/PercentileDisc.java | 10 ++++++++++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java b/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java index 0ee6044719..9b0e44b4b5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java @@ -165,7 +165,7 @@ implements /** * Render KEEP (DENSE_RANK [FIRST | LAST] ORDER BY {…}) clause */ - private final void acceptKeepDenseRankOrderByClause(Context ctx) { + final void acceptKeepDenseRankOrderByClause(Context ctx) { if (!Tools.isEmpty(keepDenseRankOrderBy)) { switch (ctx.family()) { @@ -210,6 +210,8 @@ implements if (withinGroupOrderBy.isEmpty()) ctx.visit(K_NULL); + else if (filter.hasWhere() && !supportsFilter(ctx) && applyFilterToWithinGroup(ctx)) + ctx.visit(wrap(withinGroupOrderBy).map((arg, i) -> DSL.when(filter, arg.$field()).sort(arg.$sortOrder()))); else ctx.visit(withinGroupOrderBy); @@ -298,17 +300,21 @@ implements else - ctx.visit(wrap(args).map((arg, i) -> applyFilter(ctx, arg, i) ? DSL.when(filter, arg == ASTERISK.get() ? one() : arg) : arg).map(fun)); + ctx.visit(wrap(args).map((arg, i) -> applyFilterToArgument(ctx, arg, i) ? DSL.when(filter, arg == ASTERISK.get() ? one() : arg) : arg).map(fun)); } - Field applyMap(Context ctx, Field arg) { + /* non-final */ Field applyMap(Context ctx, Field arg) { return arg; } - boolean applyFilter(Context ctx, Field arg, int i) { + /* non-final */ boolean applyFilterToArgument(Context ctx, Field arg, int i) { return true; } + /* non-final */ boolean applyFilterToWithinGroup(Context ctx) { + return false; + } + diff --git a/jOOQ/src/main/java/org/jooq/impl/ListAgg.java b/jOOQ/src/main/java/org/jooq/impl/ListAgg.java index 2004f77c23..af2094eec4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ListAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/ListAgg.java @@ -185,7 +185,7 @@ implements } @Override - final boolean applyFilter(Context ctx, Field arg, int i) { + final boolean applyFilterToArgument(Context ctx, Field arg, int i) { return i == 0; } diff --git a/jOOQ/src/main/java/org/jooq/impl/PercentileCont.java b/jOOQ/src/main/java/org/jooq/impl/PercentileCont.java index 816d65ebd7..63836d21cc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/PercentileCont.java +++ b/jOOQ/src/main/java/org/jooq/impl/PercentileCont.java @@ -119,6 +119,16 @@ implements } } + @Override + final boolean applyFilterToArgument(Context ctx, Field arg, int i) { + return false; + } + + @Override + final boolean applyFilterToWithinGroup(Context ctx) { + return true; + } + // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/PercentileDisc.java b/jOOQ/src/main/java/org/jooq/impl/PercentileDisc.java index fed4b6c68a..b1c1c96af3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/PercentileDisc.java +++ b/jOOQ/src/main/java/org/jooq/impl/PercentileDisc.java @@ -119,6 +119,16 @@ implements } } + @Override + final boolean applyFilterToArgument(Context ctx, Field arg, int i) { + return false; + } + + @Override + final boolean applyFilterToWithinGroup(Context ctx) { + return true; + } + // -------------------------------------------------------------------------