From c21dfd2f31a775f69f2c4af8f2572f5fda456a29 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Sun, 18 Jan 2015 12:02:50 +0100 Subject: [PATCH] [#3962] The H2 emulation of SHR might produce rounding errors --- jOOQ/src/main/java/org/jooq/impl/Expression.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/Expression.java b/jOOQ/src/main/java/org/jooq/impl/Expression.java index 8dcaaf4b64..7c4b2e9304 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Expression.java +++ b/jOOQ/src/main/java/org/jooq/impl/Expression.java @@ -171,10 +171,13 @@ class Expression extends AbstractFunction { // Many dialects don't support shifts. Use multiplication/division instead else if (SHL == operator && asList(H2, HSQLDB).contains(family)) { - return lhs.mul(DSL.power(two(), rhsAsNumber())); + return lhs.mul((Field) DSL.power(two(), rhsAsNumber()).cast(lhs)); } + + // [#3962] This emulation is expensive. If this is emulated, BitCount should + // use division instead of SHR directly else if (SHR == operator && asList(H2, HSQLDB).contains(family)) { - return lhs.div(DSL.power(two(), rhsAsNumber())); + return lhs.div((Field) DSL.power(two(), rhsAsNumber()).cast(lhs)); } // Some dialects support shifts as functions