From 178b844fe3699c5bc8fe9de9532e2e14862dd269 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 3 Jun 2021 12:13:57 +0200 Subject: [PATCH] [jOOQ/jOOQ#11958] BOOL_AND() and BOOL_OR() emulation does not correctly implement FILTER clause --- .../java/org/jooq/impl/AbstractAggregateFunction.java | 4 ++++ jOOQ/src/main/java/org/jooq/impl/BitXorAgg.java | 3 +-- jOOQ/src/main/java/org/jooq/impl/BoolAnd.java | 8 ++------ jOOQ/src/main/java/org/jooq/impl/BoolOr.java | 8 ++------ 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java b/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java index 800ecfa27a..722481c792 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java @@ -360,6 +360,10 @@ implements return this; } + final Condition f(Condition c) { + return filter != null ? filter.and(c) : c; + } + @SuppressWarnings("unchecked") final Field fon(AggregateFunction function) { return DSL.nullif(fo(function), (Field) zero()); diff --git a/jOOQ/src/main/java/org/jooq/impl/BitXorAgg.java b/jOOQ/src/main/java/org/jooq/impl/BitXorAgg.java index f6d2ab4a10..abec5b33b0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BitXorAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/BitXorAgg.java @@ -254,8 +254,7 @@ extends private final Condition bitCheck(Field field, N mask) { // [#11956] TODO: Potentially refactor this to use GETBIT() - Condition c = DSL.bitAnd(field, inline(mask)).eq(inline(mask)); - return filter != null ? filter.and(c) : c; + return f(DSL.bitAnd(field, inline(mask)).eq(inline(mask))); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/BoolAnd.java b/jOOQ/src/main/java/org/jooq/impl/BoolAnd.java index 6d5a7039e5..4c4c51ca9e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BoolAnd.java +++ b/jOOQ/src/main/java/org/jooq/impl/BoolAnd.java @@ -87,12 +87,8 @@ final class BoolAnd extends DefaultAggregateFunction { @Override public final void accept(Context ctx) { - if (EMULATE.contains(ctx.dialect())) { - ctx.visit(DSL.field(DSL.field("{0}", Integer.class, CustomQueryPart.of(c -> { - c.visit(DSL.min(DSL.when(condition, one()).otherwise(zero()))); - acceptOverClause(c); - })).eq(one()))); - } + if (EMULATE.contains(ctx.dialect())) + ctx.visit(fo(DSL.min(DSL.when(condition, one()).otherwise(zero()))).eq(one())); else super.accept(ctx); } diff --git a/jOOQ/src/main/java/org/jooq/impl/BoolOr.java b/jOOQ/src/main/java/org/jooq/impl/BoolOr.java index fb0beb49c1..b6197c804a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/BoolOr.java +++ b/jOOQ/src/main/java/org/jooq/impl/BoolOr.java @@ -112,12 +112,8 @@ final class BoolOr extends DefaultAggregateFunction { @Override public final void accept(Context ctx) { - if (EMULATE.contains(ctx.dialect())) { - ctx.visit(DSL.field(DSL.field("{0}", Integer.class, CustomQueryPart.of(c -> { - c.visit(DSL.max(DSL.when(condition, one()).otherwise(zero()))); - acceptOverClause(c); - })).eq(one()))); - } + if (EMULATE.contains(ctx.dialect())) + ctx.visit(fo(DSL.max(DSL.when(condition, one()).otherwise(zero()))).eq(one())); else super.accept(ctx); }