diff --git a/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java b/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java index 8d368ee895..3b9cb41870 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java +++ b/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java @@ -66,23 +66,30 @@ final class ConditionAsField extends AbstractField { // Some databases don't accept predicates where column expressions // are expected. - - - - - - - - - - case CUBRID: case FIREBIRD: - // [#3206] Correct implementation of three-valued logic is important here - ctx.visit(DSL.when(condition, inline(true)) - .when(not(condition), inline(false)) - .otherwise(inline((Boolean) null))); + + + + + + + + + + + + // [#10179] Avoid 3VL when not necessary + if (condition instanceof NotNullCondition) + ctx.visit(DSL.when(condition, inline(true)) + .else_(inline(false))); + + // [#3206] Implement 3VL if necessary or unknown + else + ctx.visit(DSL.when(condition, inline(true)) + .when(not(condition), inline(false)) + .else_(inline((Boolean) null))); break; // These databases can inline predicates in column expression contexts diff --git a/jOOQ/src/main/java/org/jooq/impl/ExistsCondition.java b/jOOQ/src/main/java/org/jooq/impl/ExistsCondition.java index 60e6d26ff2..b6e1a3505d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ExistsCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/ExistsCondition.java @@ -51,7 +51,7 @@ import org.jooq.Select; /** * @author Lukas Eder */ -final class ExistsCondition extends AbstractCondition { +final class ExistsCondition extends AbstractCondition implements NotNullCondition { private static final long serialVersionUID = 5678338161136603292L; private static final Clause[] CLAUSES_EXISTS = { CONDITION, CONDITION_EXISTS }; diff --git a/jOOQ/src/main/java/org/jooq/impl/IsDistinctFrom.java b/jOOQ/src/main/java/org/jooq/impl/IsDistinctFrom.java index ed551c4dcc..33bb2789d3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/IsDistinctFrom.java +++ b/jOOQ/src/main/java/org/jooq/impl/IsDistinctFrom.java @@ -81,7 +81,7 @@ import org.jooq.SQLDialect; /** * @author Lukas Eder */ -final class IsDistinctFrom extends AbstractCondition { +final class IsDistinctFrom extends AbstractCondition implements NotNullCondition { /** diff --git a/jOOQ/src/main/java/org/jooq/impl/IsDocument.java b/jOOQ/src/main/java/org/jooq/impl/IsDocument.java index 2354219913..4ea58f6d15 100644 --- a/jOOQ/src/main/java/org/jooq/impl/IsDocument.java +++ b/jOOQ/src/main/java/org/jooq/impl/IsDocument.java @@ -47,7 +47,7 @@ import org.jooq.Field; /** * @author Lukas Eder */ -final class IsDocument extends AbstractCondition { +final class IsDocument extends AbstractCondition implements NotNullCondition { /** * Generated UID diff --git a/jOOQ/src/main/java/org/jooq/impl/IsJSON.java b/jOOQ/src/main/java/org/jooq/impl/IsJSON.java index cb607070ee..bd12b8370f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/IsJSON.java +++ b/jOOQ/src/main/java/org/jooq/impl/IsJSON.java @@ -51,7 +51,7 @@ import org.jooq.Field; /** * @author Lukas Eder */ -final class IsJSON extends AbstractCondition { +final class IsJSON extends AbstractCondition implements NotNullCondition { /** * Generated UID diff --git a/jOOQ/src/main/java/org/jooq/impl/IsNull.java b/jOOQ/src/main/java/org/jooq/impl/IsNull.java index b863cbef1e..a6c6205545 100644 --- a/jOOQ/src/main/java/org/jooq/impl/IsNull.java +++ b/jOOQ/src/main/java/org/jooq/impl/IsNull.java @@ -54,7 +54,7 @@ import org.jooq.Field; /** * @author Lukas Eder */ -final class IsNull extends AbstractCondition { +final class IsNull extends AbstractCondition implements NotNullCondition { private static final long serialVersionUID = -747240442279619486L; private static final Clause[] CLAUSES_NULL = { CONDITION, CONDITION_IS_NULL }; diff --git a/jOOQ/src/main/java/org/jooq/impl/NotNullCondition.java b/jOOQ/src/main/java/org/jooq/impl/NotNullCondition.java new file mode 100644 index 0000000000..c614500c6f --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/impl/NotNullCondition.java @@ -0,0 +1,46 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Other licenses: + * ----------------------------------------------------------------------------- + * Commercial licenses for this work are available. These replace the above + * ASL 2.0 and offer limited warranties, support, maintenance, and commercial + * database integrations. + * + * For more information, please visit: http://www.jooq.org/licenses + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ +package org.jooq.impl; + +/** + * A marker interface for conditions that can only be TRUE or + * FALSE, never NULL. + * + * @author Lukas Eder + */ +interface NotNullCondition {} diff --git a/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java b/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java index ceaaa74983..7105cecb90 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java @@ -75,7 +75,7 @@ import org.jooq.SQLDialect; /** * @author Lukas Eder */ -final class RowIsDistinctFrom extends AbstractCondition { +final class RowIsDistinctFrom extends AbstractCondition implements NotNullCondition { /** * Generated UID diff --git a/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java b/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java index 10c4e8a324..8ec8d9bc54 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java @@ -37,9 +37,6 @@ */ package org.jooq.impl; -import static org.jooq.Clause.CONDITION; -import static org.jooq.Clause.CONDITION_IS_NOT_NULL; -import static org.jooq.Clause.CONDITION_IS_NULL; // ... // ... // ... @@ -85,14 +82,12 @@ import org.jooq.Table; /** * @author Lukas Eder */ -final class RowIsNull extends AbstractCondition { +final class RowIsNull extends AbstractCondition implements NotNullCondition { /** * Generated UID */ private static final long serialVersionUID = -1806139685201770706L; - private static final Clause[] CLAUSES_NULL = { CONDITION, CONDITION_IS_NULL }; - private static final Clause[] CLAUSES_NOT_NULL = { CONDITION, CONDITION_IS_NOT_NULL }; // Currently not yet supported in SQLite: // https://www.sqlite.org/rowvalue.html diff --git a/jOOQ/src/main/java/org/jooq/impl/UniqueCondition.java b/jOOQ/src/main/java/org/jooq/impl/UniqueCondition.java index e37a79674e..a3f5d76ab2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UniqueCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/UniqueCondition.java @@ -54,7 +54,7 @@ import org.jooq.Table; /** * @author Knut Wannheden */ -final class UniqueCondition extends AbstractCondition { +final class UniqueCondition extends AbstractCondition implements NotNullCondition { private static final long serialVersionUID = -5560973283201522844L;