diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java b/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java index 8d81209df7..14d290ea6f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractAggregateFunction.java @@ -47,6 +47,7 @@ import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.SQLDialect.SQLITE; import static org.jooq.impl.DSL.condition; import static org.jooq.impl.DSL.one; +import static org.jooq.impl.DSL.zero; import static org.jooq.impl.Keywords.K_DISTINCT; import static org.jooq.impl.Keywords.K_FILTER; import static org.jooq.impl.Keywords.K_ORDER_BY; @@ -285,6 +286,11 @@ implements return this; } + @SuppressWarnings("unchecked") + final Field fon(AggregateFunction function) { + return DSL.nullif(fo(function), (Field) zero()); + } + /** * Apply this aggregate function's FILTER and OVER * clauses to an argument aggregate function. diff --git a/jOOQ/src/main/java/org/jooq/impl/Corr.java b/jOOQ/src/main/java/org/jooq/impl/Corr.java index 61477f4782..33024d37bd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Corr.java +++ b/jOOQ/src/main/java/org/jooq/impl/Corr.java @@ -87,20 +87,31 @@ extends - private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + private static final Set NO_SUPPORT_NATIVE = SQLDialect.supportedUntil(CUBRID, DERBY, H2, HSQLDB, IGNITE, MARIADB, MYSQL, SQLITE); + + + + - @SuppressWarnings("unchecked") @Override public final void accept(Context ctx) { - if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) { - Field x = (Field) getArguments().get(0); - Field y = (Field) getArguments().get(1); + if (NO_SUPPORT_NATIVE.contains(ctx.dialect())) + acceptEmulation(ctx); + + + - ctx.visit(fo(covarPop(x, y)).div(fo(DSL.stddevPop(x(x, y))).times(fo(DSL.stddevPop(y(x, y)))))); - } else super.accept(ctx); } + @SuppressWarnings("unchecked") + private final void acceptEmulation(Context ctx) { + Field x = (Field) getArguments().get(0); + Field y = (Field) getArguments().get(1); + + ctx.visit(fo(covarPop(x, y)).div(fon(DSL.stddevPop(x(x, y))).times(fo(DSL.stddevPop(y(x, y)))))); + } + } diff --git a/jOOQ/src/main/java/org/jooq/impl/CovarPop.java b/jOOQ/src/main/java/org/jooq/impl/CovarPop.java index 4ace0da79b..6441aeff28 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CovarPop.java +++ b/jOOQ/src/main/java/org/jooq/impl/CovarPop.java @@ -110,7 +110,7 @@ extends Field x = (Field) getArguments().get(0); Field y = (Field) getArguments().get(1); - ctx.visit(fo(DSL.sum(x.times(y))).minus(fo(DSL.sum(x(x, y))).times(fo(DSL.sum(y(x, y)))).div(fo(DSL.count(x.plus(y))).cast(d(ctx)))).div(fo(DSL.count(x.plus(y))).cast(d(ctx)))); + ctx.visit(fo(DSL.sum(x.times(y))).minus(fo(DSL.sum(x(x, y))).times(fo(DSL.sum(y(x, y)))).div(fon(DSL.count(x.plus(y))).cast(d(ctx)))).div(fon(DSL.count(x.plus(y))).cast(d(ctx)))); } diff --git a/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java b/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java index f5a51c2954..dd8cec84cc 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java +++ b/jOOQ/src/main/java/org/jooq/impl/CovarSamp.java @@ -110,7 +110,7 @@ extends Field x = (Field) getArguments().get(0); Field y = (Field) getArguments().get(1); - ctx.visit(fo(DSL.sum(x.times(y))).minus(fo(DSL.sum(x(x, y))).times(fo(DSL.sum(y(x, y)))).div(fo(DSL.count(x.plus(y))).cast(d(ctx)))).div(fo(DSL.count(x.plus(y))).cast(d(ctx)).minus(DSL.inline(1)))); + ctx.visit(fo(DSL.sum(x.times(y))).minus(fo(DSL.sum(x(x, y))).times(fo(DSL.sum(y(x, y)))).div(fon(DSL.count(x.plus(y))).cast(d(ctx)))).div(fon(DSL.count(x.plus(y))).cast(d(ctx)).minus(DSL.inline(1)))); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java b/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java index 7299419811..ab332d2900 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java +++ b/jOOQ/src/main/java/org/jooq/impl/RegrSlope.java @@ -110,7 +110,7 @@ extends Field x = (Field) getArguments().get(0); Field y = (Field) getArguments().get(1); - ctx.visit(fo(DSL.covarPop(x, y)).div(fo(DSL.varPop(y(x, y))))); + ctx.visit(fo(DSL.covarPop(x, y)).div(fon(DSL.varPop(y(x, y))))); }