diff --git a/jOOQ/src/main/java/org/jooq/impl/Alias.java b/jOOQ/src/main/java/org/jooq/impl/Alias.java index da538fc4bd..209b0aa6ca 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Alias.java +++ b/jOOQ/src/main/java/org/jooq/impl/Alias.java @@ -76,6 +76,7 @@ import static org.jooq.impl.DSL.select; import static org.jooq.impl.Keywords.K_AS; import static org.jooq.impl.QueryPartListView.wrap; import static org.jooq.impl.Tools.fieldNames; +import static org.jooq.impl.Tools.visitSubquery; import static org.jooq.impl.Tools.BooleanDataKey.DATA_AS_REQUIRED; import static org.jooq.impl.Tools.BooleanDataKey.DATA_UNALIAS_ALIASED_EXPRESSIONS; @@ -168,16 +169,7 @@ final class Alias extends AbstractQueryPart { && SUPPORT_DERIVED_COLUMN_NAMES_SPECIAL1.contains(dialect) && (wrapped instanceof TableImpl || wrapped instanceof CommonTableExpressionImpl)) { - Select select = - select(asterisk()).from(((Table) wrapped).as(alias)); - - context.sql('(') - .formatIndentStart().formatNewLine() - .subquery(true) - .visit(select) - .subquery(false) - .formatIndentEnd().formatNewLine() - .sql(')'); + visitSubquery(context, select(asterisk()).from(((Table) wrapped).as(alias)), true); } // [#1801] Some databases do not support "derived column names". @@ -239,13 +231,7 @@ final class Alias extends AbstractQueryPart { } } - context.sql('(') - .formatIndentStart().formatNewLine() - .subquery(true) - .visit(select(fields).where(falseCondition()).unionAll(wrappedAsSelect)) - .subquery(false) - .formatIndentEnd().formatNewLine() - .sql(')'); + visitSubquery(context, select(fields).where(falseCondition()).unionAll(wrappedAsSelect), true); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/CommonTableExpressionImpl.java b/jOOQ/src/main/java/org/jooq/impl/CommonTableExpressionImpl.java index 402c3709e8..4c92e9af03 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CommonTableExpressionImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CommonTableExpressionImpl.java @@ -38,6 +38,7 @@ package org.jooq.impl; import static org.jooq.impl.Keywords.K_AS; +import static org.jooq.impl.Tools.visitSubquery; import java.util.List; @@ -82,19 +83,10 @@ final class CommonTableExpressionImpl extends AbstractTable @Override public final void accept(Context ctx) { - if (ctx.declareCTE()) - ctx.visit(name) - .sql(' ') - .visit(K_AS) - .sql(" (") - .subquery(true) - .formatIndentStart() - .formatNewLine() - .visit(select) - .formatIndentEnd() - .formatNewLine() - .subquery(false) - .sql(')'); + if (ctx.declareCTE()) { + ctx.visit(name).sql(' ').visit(K_AS).sql(' '); + visitSubquery(ctx, select, true); + } else ctx.visit(DSL.name(name.name)); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DerivedTable.java b/jOOQ/src/main/java/org/jooq/impl/DerivedTable.java index 87148dcce4..cb8c6b6b67 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DerivedTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/DerivedTable.java @@ -39,6 +39,7 @@ package org.jooq.impl; import static org.jooq.impl.Names.N_SELECT; +import static org.jooq.impl.Tools.visitSubquery; import org.jooq.Clause; import org.jooq.Context; @@ -89,13 +90,7 @@ final class DerivedTable extends AbstractTable { @Override public final void accept(Context ctx) { - ctx.subquery(true) - .formatIndentStart() - .formatNewLine() - .visit(query) - .formatIndentEnd() - .formatNewLine() - .subquery(false); + visitSubquery(ctx, query); } @Override // Avoid AbstractTable implementation diff --git a/jOOQ/src/main/java/org/jooq/impl/ExistsCondition.java b/jOOQ/src/main/java/org/jooq/impl/ExistsCondition.java index 57aa5e6689..e5752c0a34 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ExistsCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/ExistsCondition.java @@ -43,6 +43,7 @@ import static org.jooq.Clause.CONDITION_EXISTS; import static org.jooq.Clause.CONDITION_NOT_EXISTS; import static org.jooq.impl.Keywords.K_EXISTS; import static org.jooq.impl.Keywords.K_NOT_EXISTS; +import static org.jooq.impl.Tools.visitSubquery; import org.jooq.Clause; import org.jooq.Context; @@ -72,16 +73,8 @@ final class ExistsCondition extends AbstractCondition { @Override public final void accept(Context ctx) { - ctx.visit(exists ? K_EXISTS : K_NOT_EXISTS) - .sql(" (") - .subquery(true) - .formatIndentStart() - .formatNewLine() - .visit(query) - .formatIndentEnd() - .formatNewLine() - .subquery(false) - .sql(')'); + ctx.visit(exists ? K_EXISTS : K_NOT_EXISTS).sql(' '); + visitSubquery(ctx, query, true); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONTable.java b/jOOQ/src/main/java/org/jooq/impl/JSONTable.java index 77f032d03b..7fbc1802be 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONTable.java @@ -59,6 +59,7 @@ import static org.jooq.impl.Keywords.K_WITH; import static org.jooq.impl.Names.N_JSON_TABLE; import static org.jooq.impl.Names.N_OPENJSON; import static org.jooq.impl.SQLDataType.JSONB; +import static org.jooq.impl.Tools.visitSubquery; import java.util.ArrayList; import java.util.List; @@ -233,22 +234,16 @@ implements ).as(col.field) ); - ctx.sql('(') - .formatIndentStart() - .formatNewLine() - .subquery(true) - .visit( - select(cols).from(hasOrdinality - ? "jsonb_path_query({0}, {1}::jsonpath) {with} {ordinality} {as} t(j, o)" - : "jsonb_path_query({0}, {1}::jsonpath) {as} t(j)", - json.getType() == JSONB.class ? json : json.cast(JSONB), - path - ) - ) - .subquery(false) - .formatIndentEnd() - .formatNewLine() - .sql(')'); + visitSubquery( + ctx, + select(cols).from(hasOrdinality + ? "jsonb_path_query({0}, {1}::jsonpath) {with} {ordinality} {as} t(j, o)" + : "jsonb_path_query({0}, {1}::jsonpath) {as} t(j)", + json.getType() == JSONB.class ? json : json.cast(JSONB), + path + ), + true + ); } @@ -275,14 +270,6 @@ implements - - - - - - - - diff --git a/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java b/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java index 08f38c14af..f812705a8c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java @@ -42,6 +42,7 @@ import static java.lang.Boolean.TRUE; 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.Tools.visitSubquery; import org.jooq.Configuration; import org.jooq.Context; @@ -92,21 +93,11 @@ final class QuantifiedSelectImpl extends AbstractQueryPart imp @Override public final void accept(Context ctx) { - - ctx.visit(quantifier.toKeyword()); - boolean extraParentheses = false ; + ctx.visit(quantifier.toKeyword()); ctx.sql(extraParentheses ? " ((" : " ("); - - ctx.subquery(true) - .formatIndentStart() - .formatNewLine() - .visit(delegate(ctx.configuration())) - .formatIndentEnd() - .formatNewLine() - .subquery(false); - + visitSubquery(ctx, delegate(ctx.configuration())); ctx.sql(extraParentheses ? "))" : ")"); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java b/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java index b42b68407d..b200f70785 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java @@ -63,6 +63,7 @@ import static org.jooq.impl.DSL.notExists; import static org.jooq.impl.DSL.select; import static org.jooq.impl.Keywords.K_IS; import static org.jooq.impl.Keywords.K_NOT; +import static org.jooq.impl.Tools.visitSubquery; import java.util.Set; @@ -130,15 +131,7 @@ final class RowIsDistinctFrom extends AbstractCondition { if (rhsRow != null) ctx.visit(rhsRow); else - ctx.sql('(') - .subquery(true) - .formatIndentStart() - .formatNewLine() - .visit(rhsSelect) - .formatIndentEnd() - .formatNewLine() - .subquery(false) - .sql(')'); + visitSubquery(ctx, rhsSelect, true); if (!not) ctx.sql(')'); @@ -154,15 +147,7 @@ final class RowIsDistinctFrom extends AbstractCondition { if (rhsRow != null) ctx.visit(rhsRow); else - ctx.sql('(') - .subquery(true) - .formatIndentStart() - .formatNewLine() - .visit(rhsSelect) - .formatIndentEnd() - .formatNewLine() - .subquery(false) - .sql(')'); + visitSubquery(ctx, rhsSelect, true); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java b/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java index 55c5273f87..e4c4e55e2d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowIsNull.java @@ -65,6 +65,7 @@ import static org.jooq.impl.DSL.selectCount; import static org.jooq.impl.Keywords.K_IS_NOT_NULL; import static org.jooq.impl.Keywords.K_IS_NULL; import static org.jooq.impl.Tools.fieldNameStrings; +import static org.jooq.impl.Tools.visitSubquery; import java.util.ArrayList; import java.util.List; @@ -146,13 +147,7 @@ final class RowIsNull extends AbstractCondition { if (row != null) ctx.visit(row); else - ctx.sql('(') - .formatIndentStart().formatNewLine() - .subquery(true) - .visit(select) - .subquery(false) - .formatIndentEnd().formatNewLine() - .sql(')'); + visitSubquery(ctx, select, true); ctx.sql(' ') .visit(isNull ? K_IS_NULL : K_IS_NOT_NULL); diff --git a/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java b/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java index b595703dd7..61cfb78ea6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java @@ -60,6 +60,7 @@ import static org.jooq.impl.DSL.name; import static org.jooq.impl.DSL.notExists; import static org.jooq.impl.DSL.row; import static org.jooq.impl.DSL.select; +import static org.jooq.impl.Tools.visitSubquery; import java.util.Set; @@ -219,13 +220,7 @@ final class RowSubqueryCondition extends AbstractCondition { - ctx.subquery(true) - .formatIndentStart() - .formatNewLine() - .visit(right) - .formatIndentEnd() - .formatNewLine() - .subquery(false); + visitSubquery(ctx, right); diff --git a/jOOQ/src/main/java/org/jooq/impl/ScalarSubquery.java b/jOOQ/src/main/java/org/jooq/impl/ScalarSubquery.java index 0c420b31fd..768071ed90 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ScalarSubquery.java +++ b/jOOQ/src/main/java/org/jooq/impl/ScalarSubquery.java @@ -39,6 +39,7 @@ package org.jooq.impl; import static org.jooq.impl.Names.N_SELECT; +import static org.jooq.impl.Tools.visitSubquery; import org.jooq.Context; import org.jooq.DataType; @@ -60,14 +61,6 @@ final class ScalarSubquery extends AbstractField { @Override public final void accept(Context ctx) { - ctx.sql('(') - .subquery(true) - .formatIndentStart() - .formatNewLine() - .visit(query) - .formatIndentEnd() - .formatNewLine() - .subquery(false) - .sql(')'); + visitSubquery(ctx, query, true); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 531842d347..7fe1fe0e72 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -2206,15 +2206,33 @@ final class Tools { return cursor.ctx.exception(); } + static final void visitSubquery(Context ctx, QueryPart query) { + visitSubquery(ctx, query, false); + } + + static final void visitSubquery(Context ctx, QueryPart query, boolean parentheses) { + if (parentheses) + ctx.sql('('); + + ctx.subquery(true) + .formatIndentStart() + .formatNewLine() + .visit(query) + .formatIndentEnd() + .formatNewLine() + .subquery(false); + + if (parentheses) + ctx.sql(')'); + } + /** * Visit each query part from a collection, given a context. */ static final > C visitAll(C ctx, Collection parts) { - if (parts != null) { - for (QueryPart part : parts) { + if (parts != null) + for (QueryPart part : parts) ctx.visit(part); - } - } return ctx; } @@ -2223,11 +2241,9 @@ final class Tools { * Visit each query part from an array, given a context. */ static final > C visitAll(C ctx, QueryPart[] parts) { - if (parts != null) { - for (QueryPart part : parts) { + if (parts != null) + for (QueryPart part : parts) ctx.visit(part); - } - } return ctx; } diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java index a2121cf420..dd68410fb5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java @@ -79,6 +79,7 @@ import static org.jooq.impl.Keywords.K_ROW; import static org.jooq.impl.Keywords.K_SET; import static org.jooq.impl.Keywords.K_UPDATE; import static org.jooq.impl.Keywords.K_WHERE; +import static org.jooq.impl.Tools.visitSubquery; import java.util.Arrays; import java.util.Collection; @@ -600,15 +601,7 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl if (multiValue != null) select = select(multiValue.fields()); - ctx.sql('(') - .formatIndentStart() - .formatNewLine() - .subquery(true) - .visit(select) - .subquery(false) - .formatIndentEnd() - .formatNewLine() - .sql(')'); + visitSubquery(ctx, select, true); } ctx.end(UPDATE_SET_ASSIGNMENT); diff --git a/jOOQ/src/main/java/org/jooq/impl/Values.java b/jOOQ/src/main/java/org/jooq/impl/Values.java index 365c669e09..f372e32b9f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Values.java +++ b/jOOQ/src/main/java/org/jooq/impl/Values.java @@ -60,6 +60,7 @@ import static org.jooq.impl.Keywords.K_ROW; import static org.jooq.impl.Keywords.K_TABLE; import static org.jooq.impl.Keywords.K_VALUES; import static org.jooq.impl.Names.N_VALUES; +import static org.jooq.impl.Tools.visitSubquery; import java.util.Set; @@ -133,13 +134,7 @@ final class Values extends AbstractTable { selects = selects.unionAll(select); } - ctx.formatIndentStart() - .formatNewLine() - .subquery(true) - .visit(selects) - .subquery(false) - .formatIndentEnd() - .formatNewLine(); + visitSubquery(ctx, selects); } // [#915] Native support of VALUES(..) diff --git a/jOOQ/src/main/java/org/jooq/impl/XMLTable.java b/jOOQ/src/main/java/org/jooq/impl/XMLTable.java index b2f9d8e8fd..bd20f34671 100644 --- a/jOOQ/src/main/java/org/jooq/impl/XMLTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/XMLTable.java @@ -56,6 +56,7 @@ import static org.jooq.impl.Keywords.K_VALUE; import static org.jooq.impl.Keywords.K_XMLTABLE; import static org.jooq.impl.Names.N_XMLTABLE; import static org.jooq.impl.SQLDataType.XML; +import static org.jooq.impl.Tools.visitSubquery; import static org.jooq.impl.XMLPassingMechanism.BY_REF; import static org.jooq.impl.XMLPassingMechanism.BY_VALUE; @@ -271,10 +272,6 @@ implements - - - -