diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractCondition.java b/jOOQ/src/main/java/org/jooq/impl/AbstractCondition.java index 514eedcabd..98c9c59867 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractCondition.java @@ -72,6 +72,18 @@ abstract class AbstractCondition extends AbstractQueryPart implements Condition return true; } + /** + * [#7362] Subclasses may override this method to indicate that the + * condition is already parenthesised, or produces syntax that render + * parentheses around this condition unnecessary. + *

+ * This can help produce excess parentheses, e.g. when this condition is + * wrapped in {@link QOM.Not} + */ + boolean parenthesised(Context ctx) { + return false; + } + @Override public Clause[] clauses(Context ctx) { return CLAUSES; diff --git a/jOOQ/src/main/java/org/jooq/impl/And.java b/jOOQ/src/main/java/org/jooq/impl/And.java index a5f3747b85..66529e5b1d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/And.java +++ b/jOOQ/src/main/java/org/jooq/impl/And.java @@ -92,6 +92,11 @@ implements private static final Clause[] CLAUSES = { Clause.CONDITION, Clause.CONDITION_AND }; + @Override + final boolean parenthesised(Context ctx) { + return true; + } + @Override public final void accept(Context ctx) { diff --git a/jOOQ/src/main/java/org/jooq/impl/Deleting.java b/jOOQ/src/main/java/org/jooq/impl/Deleting.java index 37f3e645b7..60dc5a3af4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Deleting.java +++ b/jOOQ/src/main/java/org/jooq/impl/Deleting.java @@ -113,6 +113,11 @@ package org.jooq.impl; + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/Exists.java b/jOOQ/src/main/java/org/jooq/impl/Exists.java index 2ce95fe80a..708403c0ce 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Exists.java +++ b/jOOQ/src/main/java/org/jooq/impl/Exists.java @@ -94,6 +94,11 @@ implements return false; } + @Override + final boolean parenthesised(Context ctx) { + return true; + } + @Override public final void accept(Context ctx) { switch (ctx.family()) { diff --git a/jOOQ/src/main/java/org/jooq/impl/Inserting.java b/jOOQ/src/main/java/org/jooq/impl/Inserting.java index 37f3e645b7..60dc5a3af4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Inserting.java +++ b/jOOQ/src/main/java/org/jooq/impl/Inserting.java @@ -113,6 +113,11 @@ package org.jooq.impl; + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/Not.java b/jOOQ/src/main/java/org/jooq/impl/Not.java index ac8b2a575e..5d0f4fa818 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Not.java +++ b/jOOQ/src/main/java/org/jooq/impl/Not.java @@ -94,6 +94,11 @@ implements return !(condition instanceof AbstractCondition) || ((AbstractCondition) condition).isNullable(); } + @Override + final boolean parenthesised(Context ctx) { + return true; + } + @Override public final void accept(Context ctx) { switch (ctx.family()) { @@ -104,7 +109,11 @@ implements default: - ctx.visit(K_NOT).sql(" (").visit(condition).sql(')'); + if (condition instanceof AbstractCondition && ((AbstractCondition) condition).parenthesised(ctx)) + ctx.visit(K_NOT).sql(' ').visit(condition); + else + ctx.visit(K_NOT).sql(" (").visit(condition).sql(')'); + break; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Or.java b/jOOQ/src/main/java/org/jooq/impl/Or.java index e0e3720a07..4b8e60238c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Or.java +++ b/jOOQ/src/main/java/org/jooq/impl/Or.java @@ -92,6 +92,11 @@ implements private static final Clause[] CLAUSES = { Clause.CONDITION, Clause.CONDITION_OR }; + @Override + final boolean parenthesised(Context ctx) { + return true; + } + @Override public final void accept(Context ctx) { diff --git a/jOOQ/src/main/java/org/jooq/impl/SQLCondition.java b/jOOQ/src/main/java/org/jooq/impl/SQLCondition.java index 5e6cc0ef57..f11092edca 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SQLCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/SQLCondition.java @@ -56,6 +56,11 @@ final class SQLCondition extends AbstractCondition implements UEmptyCondition { // QueryPart API // ------------------------------------------------------------------------ + @Override + final boolean parenthesised(Context ctx) { + return true; + } + @Override public final void accept(Context ctx) { switch (ctx.family()) { diff --git a/jOOQ/src/main/java/org/jooq/impl/Unique.java b/jOOQ/src/main/java/org/jooq/impl/Unique.java index 44e73b0e49..84fae94394 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Unique.java +++ b/jOOQ/src/main/java/org/jooq/impl/Unique.java @@ -92,6 +92,11 @@ implements return false; } + @Override + final boolean parenthesised(Context ctx) { + return true; + } + @Override public final void accept(Context ctx) { switch (ctx.family()) { diff --git a/jOOQ/src/main/java/org/jooq/impl/Updating.java b/jOOQ/src/main/java/org/jooq/impl/Updating.java index 37f3e645b7..60dc5a3af4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Updating.java +++ b/jOOQ/src/main/java/org/jooq/impl/Updating.java @@ -113,6 +113,11 @@ package org.jooq.impl; + + + + + diff --git a/jOOQ/src/main/java/org/jooq/impl/XMLExists.java b/jOOQ/src/main/java/org/jooq/impl/XMLExists.java index 083c9a6460..264400f95d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/XMLExists.java +++ b/jOOQ/src/main/java/org/jooq/impl/XMLExists.java @@ -84,6 +84,7 @@ final class XMLExists extends AbstractCondition implements XMLExistsPassingStep, // ------------------------------------------------------------------------- // XXX: DSL API // ------------------------------------------------------------------------- + @Override public final Condition passing(XML xml) { return passing(Tools.field(xml)); @@ -118,6 +119,11 @@ final class XMLExists extends AbstractCondition implements XMLExistsPassingStep, // XXX: QueryPart API // ------------------------------------------------------------------------- + @Override + final boolean parenthesised(Context ctx) { + return true; + } + @Override public final void accept(Context ctx) { switch (ctx.family()) {