From d40623c81fe9ff2069dfb18da7c56bead18a4e13 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 11 Aug 2014 16:00:14 +0200 Subject: [PATCH] [#3206] DSL.field(Condition) doesn't correctly handle NULLs when emulating boolean fields with a CASE expression --- .../java/org/jooq/impl/ConditionAsField.java | 7 ++++++- jOOQ/src/main/java/org/jooq/impl/NotField.java | 17 ++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java b/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java index 83fed1bca0..a09799eb1a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java +++ b/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java @@ -41,6 +41,7 @@ package org.jooq.impl; import static org.jooq.impl.DSL.inline; +import static org.jooq.impl.DSL.not; import org.jooq.Condition; import org.jooq.Configuration; @@ -78,7 +79,11 @@ class ConditionAsField extends AbstractFunction { xx [/pro] */ case CUBRID: case FIREBIRD: - return DSL.decode().when(condition, inline(true)).otherwise(inline(false)); + + // [#3206] Correct implementation of three-valued logic is important here + return DSL.decode().when(condition, inline(true)) + .when(not(condition), inline(false)) + .otherwise(inline((Boolean) null)); // These databases can inline predicates in column expression contexts case DERBY: diff --git a/jOOQ/src/main/java/org/jooq/impl/NotField.java b/jOOQ/src/main/java/org/jooq/impl/NotField.java index 37ff3813e7..4230b7e869 100644 --- a/jOOQ/src/main/java/org/jooq/impl/NotField.java +++ b/jOOQ/src/main/java/org/jooq/impl/NotField.java @@ -42,12 +42,13 @@ package org.jooq.impl; import static org.jooq.Clause.CONDITION; import static org.jooq.Clause.CONDITION_NOT; +import static org.jooq.impl.DSL.condition; +import static org.jooq.impl.DSL.field; +import static org.jooq.impl.DSL.not; import org.jooq.Clause; -import org.jooq.Configuration; import org.jooq.Context; import org.jooq.Field; -import org.jooq.QueryPartInternal; class NotField extends AbstractField { @@ -63,11 +64,7 @@ class NotField extends AbstractField { @Override public final void accept(Context ctx) { - delegate(ctx.configuration()).accept(ctx); - } - - private final QueryPartInternal delegate(Configuration configuration) { - switch (configuration.dialect().family()) { + switch (ctx.family()) { // [#2485] These don't work nicely, yet case CUBRID: @@ -81,7 +78,8 @@ class NotField extends AbstractField { xxxx xxxxxxxxxx xxxx xxxxxxx xx [/pro] */ - return (QueryPartInternal) DSL.field(DSL.not(DSL.condition(field))); + ctx.visit(field(not(condition(field)))); + break; /* [pro] xx xxxx xxxx @@ -96,7 +94,8 @@ class NotField extends AbstractField { case POSTGRES: case SQLITE: default: - return (QueryPartInternal) DSL.field("{not}({0})", getDataType(), field); + ctx.visit(field("{not}({0})", getDataType(), field)); + break; } }