From da10707bc56bb95d4cb764d316821cb2c7334733 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Fri, 1 May 2015 14:45:17 +0200 Subject: [PATCH] [#4258] Bad SQL generated for quantified row value expression predicates in Oracle --- .../org/jooq/impl/QuantifiedSelectImpl.java | 13 +++-- .../org/jooq/impl/RowSubqueryCondition.java | 48 +++++++++++-------- 2 files changed, 37 insertions(+), 24 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java b/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java index aa2853d413..521dd11d7a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java @@ -40,9 +40,12 @@ */ package org.jooq.impl; +import static java.util.Arrays.asList; +// ... import static org.jooq.impl.DSL.select; import static org.jooq.impl.DSL.table; import static org.jooq.impl.DSL.val; +import static org.jooq.impl.Utils.DATA_ROW_VALUE_EXPRESSION_PREDICATE_SUBQUERY; import org.jooq.Clause; import org.jooq.Configuration; @@ -83,21 +86,23 @@ class QuantifiedSelectImpl extends AbstractQueryPart implement @Override public final void accept(Context ctx) { + Object data = ctx.data(DATA_ROW_VALUE_EXPRESSION_PREDICATE_SUBQUERY); + boolean extraParentheses = data != null && asList().contains(ctx.family()); // If this is already a subquery, proceed if (ctx.subquery()) { ctx.keyword(quantifier.toSQL()) - .sql(" (") + .sql(extraParentheses ? " ((" : " (") .formatIndentStart() .formatNewLine() .visit(delegate(ctx.configuration())) .formatIndentEnd() .formatNewLine() - .sql(')'); + .sql(extraParentheses ? "))" : ")"); } else { ctx.keyword(quantifier.toSQL()) - .sql(" (") + .sql(extraParentheses ? " ((" : " (") .subquery(true) .formatIndentStart() .formatNewLine() @@ -105,7 +110,7 @@ class QuantifiedSelectImpl extends AbstractQueryPart implement .formatIndentEnd() .formatNewLine() .subquery(false) - .sql(')'); + .sql(extraParentheses ? "))" : ")"); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java b/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java index d5567ea2a8..4fb996aac7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java @@ -218,31 +218,39 @@ class RowSubqueryCondition extends AbstractCondition { @Override public final void accept(Context ctx) { - - // [#2054] Quantified row value expression comparison predicates shouldn't have parentheses before ANY or ALL - boolean parentheses = rightQuantified == null; - - // Some databases need extra parentheses around the RHS - boolean extraParentheses = asList().contains(ctx.configuration().dialect().family()); boolean subquery = ctx.subquery(); ctx.visit(left) .sql(' ') .keyword(comparator.toSQL()) - .sql(' ') - .sql( parentheses ? "(" : "") - .sql(extraParentheses ? "(" : ""); - ctx.data(DATA_ROW_VALUE_EXPRESSION_PREDICATE_SUBQUERY, true); - ctx.subquery(true) - .formatIndentStart() - .formatNewLine() - .visit(right != null ? right : rightQuantified) - .formatIndentEnd() - .formatNewLine() - .subquery(subquery); - ctx.data(DATA_ROW_VALUE_EXPRESSION_PREDICATE_SUBQUERY, null); - ctx.sql(extraParentheses ? ")" : "") - .sql( parentheses ? ")" : ""); + .sql(' '); + + if (rightQuantified == null) { + + // Some databases need extra parentheses around the RHS + boolean extraParentheses = asList().contains(ctx.family()); + + ctx.sql(extraParentheses ? "((" : "("); + ctx.data(DATA_ROW_VALUE_EXPRESSION_PREDICATE_SUBQUERY, true); + ctx.subquery(true) + .formatIndentStart() + .formatNewLine() + .visit(right) + .formatIndentEnd() + .formatNewLine() + .subquery(subquery); + ctx.data(DATA_ROW_VALUE_EXPRESSION_PREDICATE_SUBQUERY, null); + ctx.sql(extraParentheses ? "))" : ")"); + } + + // [#2054] Quantified row value expression comparison predicates shouldn't have parentheses before ANY or ALL + else { + ctx.data(DATA_ROW_VALUE_EXPRESSION_PREDICATE_SUBQUERY, true); + ctx.subquery(true) + .visit(rightQuantified) + .subquery(subquery); + ctx.data(DATA_ROW_VALUE_EXPRESSION_PREDICATE_SUBQUERY, null); + } } @Override