diff --git a/jOOQ/src/main/java/org/jooq/GroupConcatOrderByStep.java b/jOOQ/src/main/java/org/jooq/GroupConcatOrderByStep.java index 5e45d745f8..3f0ecb9168 100644 --- a/jOOQ/src/main/java/org/jooq/GroupConcatOrderByStep.java +++ b/jOOQ/src/main/java/org/jooq/GroupConcatOrderByStep.java @@ -54,6 +54,7 @@ import static org.jooq.SQLDialect.MYSQL; // ... import static org.jooq.SQLDialect.POSTGRES; // ... +// ... import java.util.Collection; diff --git a/jOOQ/src/main/java/org/jooq/GroupConcatSeparatorStep.java b/jOOQ/src/main/java/org/jooq/GroupConcatSeparatorStep.java index ee75c29611..29af7336b7 100644 --- a/jOOQ/src/main/java/org/jooq/GroupConcatSeparatorStep.java +++ b/jOOQ/src/main/java/org/jooq/GroupConcatSeparatorStep.java @@ -57,6 +57,7 @@ import static org.jooq.SQLDialect.POSTGRES; import static org.jooq.SQLDialect.SQLITE; // ... // ... +// ... import org.jooq.impl.DSL; diff --git a/jOOQ/src/main/java/org/jooq/SelectForStep.java b/jOOQ/src/main/java/org/jooq/SelectForStep.java index f5fe8175c8..3b6e229fe2 100644 --- a/jOOQ/src/main/java/org/jooq/SelectForStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectForStep.java @@ -51,6 +51,7 @@ import static org.jooq.SQLDialect.MYSQL; // ... import static org.jooq.SQLDialect.POSTGRES; // ... +// ... /** * This type is used for the {@link Select}'s DSL API when selecting generic diff --git a/jOOQ/src/main/java/org/jooq/SelectForXMLCommonDirectivesStep.java b/jOOQ/src/main/java/org/jooq/SelectForXMLCommonDirectivesStep.java index 22a44a8047..149ea20014 100644 --- a/jOOQ/src/main/java/org/jooq/SelectForXMLCommonDirectivesStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectForXMLCommonDirectivesStep.java @@ -127,5 +127,6 @@ import static org.jooq.SQLDialect.POSTGRES; + diff --git a/jOOQ/src/main/java/org/jooq/SelectForXMLRawDirectivesStep.java b/jOOQ/src/main/java/org/jooq/SelectForXMLRawDirectivesStep.java index 314272cd9f..c1ab312cef 100644 --- a/jOOQ/src/main/java/org/jooq/SelectForXMLRawDirectivesStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectForXMLRawDirectivesStep.java @@ -120,5 +120,6 @@ import static org.jooq.SQLDialect.POSTGRES; + diff --git a/jOOQ/src/main/java/org/jooq/SelectForXMLStep.java b/jOOQ/src/main/java/org/jooq/SelectForXMLStep.java index 9f77428da5..d83450f7ae 100644 --- a/jOOQ/src/main/java/org/jooq/SelectForXMLStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectForXMLStep.java @@ -152,5 +152,6 @@ import static org.jooq.SQLDialect.POSTGRES; + diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractCondition.java b/jOOQ/src/main/java/org/jooq/impl/AbstractCondition.java index 60c8a1d41e..00eaea2dc8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractCondition.java @@ -42,6 +42,8 @@ import static org.jooq.impl.DSL.condition; import static org.jooq.impl.DSL.exists; import static org.jooq.impl.DSL.notExists; +import java.util.function.BiFunction; + import org.jooq.Clause; import org.jooq.Condition; import org.jooq.Context; @@ -180,4 +182,15 @@ abstract class AbstractCondition extends AbstractQueryPart implements Condition public /* non-final */ Condition not() { return new NotCondition(this); } + + static final Condition unwrapNot(Condition c, BiFunction function) { + boolean not = false; + + while (c instanceof NotCondition) { + c = ((NotCondition) c).condition; + not = !not; + } + + return function.apply(c, not); + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/CaseConditionStepImpl.java b/jOOQ/src/main/java/org/jooq/impl/CaseConditionStepImpl.java index bfa38e64b7..ce37180498 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CaseConditionStepImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CaseConditionStepImpl.java @@ -37,6 +37,10 @@ */ package org.jooq.impl; +// ... +import static org.jooq.impl.AbstractCondition.unwrapNot; +import static org.jooq.impl.DSL.one; +import static org.jooq.impl.DSL.select; import static org.jooq.impl.Keywords.K_CASE; import static org.jooq.impl.Keywords.K_ELSE; import static org.jooq.impl.Keywords.K_END; @@ -201,8 +205,20 @@ final class CaseConditionStepImpl extends AbstractField implements CaseCon if (i > 0) ctx.formatSeparator(); - ctx.visit(K_WHEN).sql(' ').visit(conditions.get(i)).sql(' ') - .visit(K_THEN).sql(' ').visit(results.get(i)); + Condition c = conditions.get(i); + Field r = results.get(i); + + + + + + + + + + + ctx.visit(K_WHEN).sql(' ').visit(c).sql(' ') + .visit(K_THEN).sql(' ').visit(r); } if (else_ != null) diff --git a/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java b/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java index 840d8a0992..9c2cc6fc65 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java +++ b/jOOQ/src/main/java/org/jooq/impl/ConditionAsField.java @@ -39,6 +39,7 @@ package org.jooq.impl; import static org.jooq.impl.DSL.inline; import static org.jooq.impl.DSL.not; +import static org.jooq.impl.DSL.select; import org.jooq.Condition; import org.jooq.Context; @@ -69,16 +70,7 @@ final class ConditionAsField extends AbstractField { case CUBRID: case FIREBIRD: - - // [#10179] Avoid 3VL when not necessary - if (condition instanceof AbstractCondition && !((AbstractCondition) condition).isNullable()) - 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))); + acceptCase(ctx); break; // Other dialects can inline predicates in column expression contexts @@ -87,4 +79,17 @@ final class ConditionAsField extends AbstractField { break; } } + + private final void acceptCase(Context ctx) { + + // [#10179] Avoid 3VL when not necessary + if (condition instanceof AbstractCondition && !((AbstractCondition) condition).isNullable()) + 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))); + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/ListAgg.java b/jOOQ/src/main/java/org/jooq/impl/ListAgg.java index ed7f399064..fcbe0db36c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ListAgg.java +++ b/jOOQ/src/main/java/org/jooq/impl/ListAgg.java @@ -43,6 +43,7 @@ package org.jooq.impl; // ... import static org.jooq.SQLDialect.CUBRID; // ... +// ... import static org.jooq.SQLDialect.H2; import static org.jooq.SQLDialect.HSQLDB; import static org.jooq.SQLDialect.MARIADB; @@ -53,7 +54,10 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +// ... +import static org.jooq.impl.DSL.sql; import static org.jooq.impl.Keywords.K_AS; +import static org.jooq.impl.Keywords.K_CONTENT; import static org.jooq.impl.Keywords.K_DISTINCT; import static org.jooq.impl.Keywords.K_SEPARATOR; import static org.jooq.impl.Names.N_CONCAT; @@ -65,6 +69,8 @@ import static org.jooq.impl.Names.N_SUBSTR; import static org.jooq.impl.Names.N_XMLAGG; import static org.jooq.impl.Names.N_XMLSERIALIZE; import static org.jooq.impl.Names.N_XMLTEXT; +import static org.jooq.impl.SQLDataType.VARCHAR; +import static org.jooq.impl.SQLDataType.XML; import static org.jooq.impl.Tools.castIfNeeded; import java.util.Set; @@ -73,6 +79,7 @@ import org.jooq.Context; import org.jooq.Field; // ... import org.jooq.SQLDialect; +import org.jooq.XML; // ... /** @@ -116,10 +123,8 @@ final class ListAgg extends DefaultAggregateFunction { - - else { + else super.accept(ctx); - } } /** @@ -200,16 +205,6 @@ final class ListAgg extends DefaultAggregateFunction { - - - - - - - - - - diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 35a9d5a711..5271d3ae23 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -73,6 +73,7 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +// ... import static org.jooq.conf.BackslashEscaping.DEFAULT; import static org.jooq.conf.BackslashEscaping.ON; import static org.jooq.conf.ParamType.INLINED; @@ -4082,9 +4083,16 @@ final class Tools { log.warn("Maximum consumed results reached: " + maxConsumedResults + ". This is probably a bug. Please report to https://github.com/jOOQ/jOOQ/issues/new"); // Call this only when there was at least one ResultSet. - // Otherwise, this call is not supported by ojdbc or CUBRID [#4440] - if (anyResults && ctx.family() != CUBRID) + if (anyResults) { + + + + + + + ctx.statement().getMoreResults(Statement.CLOSE_ALL_RESULTS); + } // [#6413] For consistency reasons, any exceptions that have been placed in ResultOrRow elements must // be linked, just as if they were collected using ThrowExceptions == THROW_ALL diff --git a/jOOQ/src/main/java/org/jooq/impl/WindowSpecificationImpl.java b/jOOQ/src/main/java/org/jooq/impl/WindowSpecificationImpl.java index 18355266b3..e1e83524ca 100644 --- a/jOOQ/src/main/java/org/jooq/impl/WindowSpecificationImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/WindowSpecificationImpl.java @@ -56,6 +56,7 @@ import static org.jooq.SQLDialect.SQLITE; // ... // ... // ... +// ... import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.one; import static org.jooq.impl.DSL.select;