[#3463] Field.in(...) methods shouldn't return trueCondition() or falseCondition()

This commit is contained in:
Lukas Eder 2014-07-28 11:51:49 +02:00
parent dbf42c7dac
commit d06084e0be
3 changed files with 14 additions and 15 deletions

View File

@ -55,10 +55,8 @@ import static org.jooq.Comparator.NOT_EQUALS;
import static org.jooq.Comparator.NOT_IN;
import static org.jooq.Comparator.NOT_LIKE;
import static org.jooq.Comparator.NOT_LIKE_IGNORE_CASE;
import static org.jooq.impl.DSL.falseCondition;
import static org.jooq.impl.DSL.inline;
import static org.jooq.impl.DSL.nullSafe;
import static org.jooq.impl.DSL.trueCondition;
import static org.jooq.impl.DSL.val;
import static org.jooq.impl.ExpressionOperator.ADD;
import static org.jooq.impl.ExpressionOperator.DIVIDE;
@ -792,12 +790,7 @@ abstract class AbstractField<T> extends AbstractQueryPart implements Field<T> {
@Override
public final Condition in(Field<?>... values) {
if (values == null || values.length == 0) {
return falseCondition();
}
else {
return new InCondition<T>(this, nullSafe(values), IN);
}
return new InCondition<T>(this, nullSafe(values), IN);
}
@Override
@ -828,12 +821,7 @@ abstract class AbstractField<T> extends AbstractQueryPart implements Field<T> {
if (isAccidentalCollection(values))
return notIn((Collection<?>) values[0]);
if (values == null || values.length == 0) {
return trueCondition();
}
else {
return notIn(Utils.fields(values, this).toArray(new Field<?>[0]));
}
return notIn(Utils.fields(values, this).toArray(new Field<?>[0]));
}
@Override

View File

@ -11909,6 +11909,9 @@ public class DSL {
* Null-safety of a field.
*/
protected static Field<?>[] nullSafe(Field<?>... fields) {
if (fields == null)
return new Field[0];
Field<?>[] result = new Field<?>[fields.length];
for (int i = 0; i < fields.length; i++) {

View File

@ -45,6 +45,8 @@ import static org.jooq.Clause.CONDITION;
import static org.jooq.Clause.CONDITION_IN;
import static org.jooq.Clause.CONDITION_NOT_IN;
import static org.jooq.Comparator.IN;
import static org.jooq.impl.DSL.falseCondition;
import static org.jooq.impl.DSL.trueCondition;
import java.util.Arrays;
import java.util.List;
@ -83,7 +85,13 @@ class InCondition<T> extends AbstractCondition {
public final void accept(Context<?> ctx) {
List<Field<?>> list = Arrays.asList(values);
if (list.size() > IN_LIMIT) {
if (list.size() == 0) {
if (comparator == IN)
ctx.visit(falseCondition());
else
ctx.visit(trueCondition());
}
else if (list.size() > IN_LIMIT) {
// [#798] Oracle and some other dialects can only hold 1000 values
// in an IN (...) clause
switch (ctx.configuration().dialect().family()) {