From 8346ee4fa3b258d464b901f23a35a9a245a92c73 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 23 Feb 2022 11:42:50 +0100 Subject: [PATCH] [jOOQ/jOOQ#13129] Add Context::predicandSubquery --- jOOQ/src/main/java/org/jooq/Context.java | 14 +++++++++++++- .../main/java/org/jooq/impl/AbstractContext.java | 16 +++++++++++++++- .../main/java/org/jooq/impl/AbstractField.java | 2 +- jOOQ/src/main/java/org/jooq/impl/Alias.java | 4 ++-- .../main/java/org/jooq/impl/AliasedSelect.java | 4 ++-- jOOQ/src/main/java/org/jooq/impl/ArrayQuery.java | 6 +----- .../org/jooq/impl/CommonTableExpressionImpl.java | 2 +- .../main/java/org/jooq/impl/DerivedTable.java | 2 +- jOOQ/src/main/java/org/jooq/impl/Exists.java | 2 +- .../main/java/org/jooq/impl/GenerateSeries.java | 5 ++++- jOOQ/src/main/java/org/jooq/impl/In.java | 2 +- jOOQ/src/main/java/org/jooq/impl/JSONTable.java | 3 ++- jOOQ/src/main/java/org/jooq/impl/Multiset.java | 10 ++++------ jOOQ/src/main/java/org/jooq/impl/NotIn.java | 2 +- .../java/org/jooq/impl/QuantifiedSelectImpl.java | 2 +- .../java/org/jooq/impl/RowIsDistinctFrom.java | 4 ++-- .../java/org/jooq/impl/RowSubqueryCondition.java | 4 ++-- .../main/java/org/jooq/impl/ScalarSubquery.java | 10 ++++++---- .../main/java/org/jooq/impl/SelectIsNotNull.java | 2 +- .../main/java/org/jooq/impl/SelectIsNull.java | 2 +- .../main/java/org/jooq/impl/SelectQueryImpl.java | 2 +- jOOQ/src/main/java/org/jooq/impl/SplitPart.java | 3 ++- jOOQ/src/main/java/org/jooq/impl/Tools.java | 10 +++++++--- jOOQ/src/main/java/org/jooq/impl/Unique.java | 2 +- .../main/java/org/jooq/impl/UpdateQueryImpl.java | 2 +- jOOQ/src/main/java/org/jooq/impl/Values.java | 2 +- jOOQ/src/main/java/org/jooq/impl/XMLTable.java | 1 + 27 files changed, 76 insertions(+), 44 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/Context.java b/jOOQ/src/main/java/org/jooq/Context.java index f2bdc31ada..2938bc130d 100644 --- a/jOOQ/src/main/java/org/jooq/Context.java +++ b/jOOQ/src/main/java/org/jooq/Context.java @@ -237,7 +237,7 @@ public interface Context> extends Scope { C declareCTE(boolean declareCTE, Consumer consumer); /** - * Whether the current context is rendering a sub-query (nested query). + * Whether the current context is rendering a subquery (nested query). */ boolean subquery(); @@ -247,6 +247,18 @@ public interface Context> extends Scope { @NotNull C subquery(boolean subquery); + /** + * Whether the current context is rendering a predicand subquery, i.e. a + * subquery that is an operand of a predicate. + */ + boolean predicandSubquery(); + + /** + * Set the new context value for {@link #predicandSubquery()}. + */ + @NotNull + C predicandSubquery(boolean predicandSubquery); + /** * Which level of subqueries we're currently in, starting with 0 for the top * level query. diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java index d62bc96be7..0b0bb29217 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java @@ -95,6 +95,8 @@ import org.jooq.conf.SettingsTools; import org.jooq.conf.StatementType; import org.jooq.tools.StringUtils; +import org.jetbrains.annotations.NotNull; + /** * @author Lukas Eder @@ -120,6 +122,7 @@ abstract class AbstractContext> extends AbstractScope imple int subquery; BitSet subqueryScopedNestedSetOperations; + boolean predicandSubquery; int stringLiteral; String stringLiteralEscapedApos = "'"; int index; @@ -310,7 +313,7 @@ abstract class AbstractContext> extends AbstractScope imple @Override public final C visitSubquery(QueryPart part) { - Tools.visitSubquery(this, part); + Tools.visitSubquery(this, part, false); return (C) this; } @@ -644,6 +647,17 @@ abstract class AbstractContext> extends AbstractScope imple return subquery; } + @Override + public final boolean predicandSubquery() { + return predicandSubquery; + } + + @Override + public final C predicandSubquery(boolean s) { + predicandSubquery = s; + return (C) this; + } + @Override public final boolean subquery() { return subquery > 0; diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java index 01a46c5b1c..0c1d26621a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java @@ -1488,7 +1488,7 @@ abstract class AbstractField extends AbstractTypedNamed implements Field> query) { - return compare(comparator, new ScalarSubquery<>(query, getDataType())); + return compare(comparator, new ScalarSubquery<>(query, getDataType(), true)); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/Alias.java b/jOOQ/src/main/java/org/jooq/impl/Alias.java index d1a57a46d8..1f004db3c1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Alias.java +++ b/jOOQ/src/main/java/org/jooq/impl/Alias.java @@ -214,7 +214,7 @@ final class Alias extends AbstractQueryPart implements UEmp && (SUPPORT_DERIVED_COLUMN_NAMES_SPECIAL1.contains(dialect)) && (wrapped instanceof TableImpl || wrapped instanceof CommonTableExpressionImpl)) { - visitSubquery(context, select(asterisk()).from(((Table) wrapped).as(alias))); + visitSubquery(context, select(asterisk()).from(((Table) wrapped).as(alias)), false); } // [#1801] Some databases do not support "derived column names". @@ -287,7 +287,7 @@ final class Alias extends AbstractQueryPart implements UEmp } } - visitSubquery(context, select(fields).where(falseCondition()).unionAll(wrappedAsSelect)); + visitSubquery(context, select(fields).where(falseCondition()).unionAll(wrappedAsSelect), false); } } } diff --git a/jOOQ/src/main/java/org/jooq/impl/AliasedSelect.java b/jOOQ/src/main/java/org/jooq/impl/AliasedSelect.java index 322aaca370..2b52a61c1b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AliasedSelect.java +++ b/jOOQ/src/main/java/org/jooq/impl/AliasedSelect.java @@ -120,9 +120,9 @@ final class AliasedSelect extends AbstractTable implements // they cannot be referenced. In that case, revert to // actual derived table usage. if (ctx.family() == DERBY && q != null && q.hasUnions()) - visitSubquery(ctx, selectFrom(query.asTable(DSL.name("t"), aliases)), false); + visitSubquery(ctx, selectFrom(query.asTable(DSL.name("t"), aliases)), false, false); else - ctx.data(DATA_SELECT_ALIASES, aliases, subquery ? c -> visitSubquery(c, query, false) : c -> c.visit(query)); + ctx.data(DATA_SELECT_ALIASES, aliases, subquery ? c -> visitSubquery(c, query, false, false) : c -> c.visit(query)); } @Override // Avoid AbstractTable implementation diff --git a/jOOQ/src/main/java/org/jooq/impl/ArrayQuery.java b/jOOQ/src/main/java/org/jooq/impl/ArrayQuery.java index bf5ce04ecd..c04c2377ff 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ArrayQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/ArrayQuery.java @@ -42,13 +42,9 @@ import static org.jooq.impl.Keywords.K_ARRAY; import static org.jooq.impl.Names.N_ARRAY; import static org.jooq.impl.Tools.visitSubquery; -import java.util.function.BiFunction; -import java.util.function.Predicate; - import org.jooq.Context; import org.jooq.DataType; import org.jooq.Field; -import org.jooq.Function1; import org.jooq.QueryPart; import org.jooq.Record1; // ... @@ -86,7 +82,7 @@ final class ArrayQuery extends AbstractField implements QOM.ArrayQuery extends AbstractTable } - visitSubquery(ctx, s); + visitSubquery(ctx, s, false); diff --git a/jOOQ/src/main/java/org/jooq/impl/DerivedTable.java b/jOOQ/src/main/java/org/jooq/impl/DerivedTable.java index 0f816d910a..caa11fdbaf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DerivedTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/DerivedTable.java @@ -94,7 +94,7 @@ class DerivedTable extends AbstractTable implements QOM.Der - visitSubquery(ctx, query, false); + visitSubquery(ctx, query, false, false); } @Override // Avoid AbstractTable implementation diff --git a/jOOQ/src/main/java/org/jooq/impl/Exists.java b/jOOQ/src/main/java/org/jooq/impl/Exists.java index d960c03f05..997e970c34 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Exists.java +++ b/jOOQ/src/main/java/org/jooq/impl/Exists.java @@ -105,7 +105,7 @@ implements default: ctx.visit(K_EXISTS).sql(' '); - visitSubquery(ctx, query); + visitSubquery(ctx, query, true); break; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/GenerateSeries.java b/jOOQ/src/main/java/org/jooq/impl/GenerateSeries.java index f03b78702e..40b6cf88e5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/GenerateSeries.java +++ b/jOOQ/src/main/java/org/jooq/impl/GenerateSeries.java @@ -156,7 +156,8 @@ implements ctx, withRecursive(name, name) .as(select(from).unionAll(select(iadd(f, step == null ? inline(1) : step)).from(name).where(f.lt(to)))) - .select(f).from(name) + .select(f).from(name), + false ); } else if (EMULATE_SYSTEM_RANGE.contains(ctx.dialect())) { @@ -205,6 +206,8 @@ implements + + diff --git a/jOOQ/src/main/java/org/jooq/impl/In.java b/jOOQ/src/main/java/org/jooq/impl/In.java index ccfba7ebb2..e2cd5ddd09 100644 --- a/jOOQ/src/main/java/org/jooq/impl/In.java +++ b/jOOQ/src/main/java/org/jooq/impl/In.java @@ -99,7 +99,7 @@ implements - ScalarSubquery f = new ScalarSubquery<>(arg2, arg1.getDataType()); + ScalarSubquery f = new ScalarSubquery<>(arg2, arg1.getDataType(), true); Eq.acceptCompareCondition(ctx, this, arg1, org.jooq.Comparator.IN, f, RowN::in, RowN::in, c -> c.visit(arg1).sql(' ').visit(K_IN).sql(' ').visit(f)); } diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONTable.java b/jOOQ/src/main/java/org/jooq/impl/JSONTable.java index 0e14d9489d..8151d119dd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONTable.java @@ -228,7 +228,8 @@ implements : "jsonb_path_query({0}, {1}::jsonpath) {as} t(j)", json.getType() == JSONB.class ? json : json.cast(JSONB), path - ) + ), + false ); } diff --git a/jOOQ/src/main/java/org/jooq/impl/Multiset.java b/jOOQ/src/main/java/org/jooq/impl/Multiset.java index 6b0e51b420..e3e3f619c8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Multiset.java +++ b/jOOQ/src/main/java/org/jooq/impl/Multiset.java @@ -78,13 +78,11 @@ import static org.jooq.impl.Tools.BooleanDataKey.DATA_MULTISET_CONTENT; import java.util.List; import java.util.Set; -import java.util.function.Predicate; import org.jooq.AggregateFilterStep; import org.jooq.Context; import org.jooq.Field; import org.jooq.Fields; -import org.jooq.Function1; import org.jooq.JSON; import org.jooq.JSONArrayAggOrderByStep; import org.jooq.JSONArrayAggReturningStep; @@ -190,7 +188,7 @@ final class Multiset extends AbstractField> implemen if (multisetCondition && NO_SUPPORT_JSON_COMPARE.contains(ctx.dialect())) ctx.visit(DSL.field(s).cast(VARCHAR)); else - visitSubquery(ctx, s, true); + visitSubquery(ctx, s, false); break; } @@ -242,7 +240,7 @@ final class Multiset extends AbstractField> implemen if (multisetCondition && NO_SUPPORT_JSONB_COMPARE.contains(ctx.dialect())) ctx.visit(DSL.field(s).cast(VARCHAR)); else - visitSubquery(ctx, s, true); + visitSubquery(ctx, s, false); break; } @@ -289,7 +287,7 @@ final class Multiset extends AbstractField> implemen if (multisetCondition && NO_SUPPORT_XML_COMPARE.contains(ctx.dialect())) ctx.visit(xmlserializeContent(DSL.field(s), VARCHAR)); else - visitSubquery(ctx, s, true); + visitSubquery(ctx, s, false); break; } @@ -299,7 +297,7 @@ final class Multiset extends AbstractField> implemen } case NATIVE: - visitSubquery(ctx.visit(K_MULTISET), select, true); + visitSubquery(ctx.visit(K_MULTISET), select, false); break; } } diff --git a/jOOQ/src/main/java/org/jooq/impl/NotIn.java b/jOOQ/src/main/java/org/jooq/impl/NotIn.java index fe7ec979ff..cd894ef320 100644 --- a/jOOQ/src/main/java/org/jooq/impl/NotIn.java +++ b/jOOQ/src/main/java/org/jooq/impl/NotIn.java @@ -99,7 +99,7 @@ implements - ScalarSubquery f = new ScalarSubquery<>(arg2, arg1.getDataType()); + ScalarSubquery f = new ScalarSubquery<>(arg2, arg1.getDataType(), true); Eq.acceptCompareCondition(ctx, this, arg1, org.jooq.Comparator.NOT_IN, f, RowN::notIn, RowN::notIn, c -> c.visit(arg1).sql(' ').visit(K_NOT_IN).sql(' ').visit(f)); } diff --git a/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java b/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java index 99146aaf00..a41219b18c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/QuantifiedSelectImpl.java @@ -111,7 +111,7 @@ final class QuantifiedSelectImpl extends AbstractQueryPart imp default: ctx.visit(quantifier.toKeyword()); ctx.sql(extraParentheses ? " ((" : " ("); - visitSubquery(ctx, delegate(ctx.configuration()), false); + visitSubquery(ctx, delegate(ctx.configuration()), true, false); ctx.sql(extraParentheses ? "))" : ")"); break; } diff --git a/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java b/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java index dd8faedd0e..4d5bdbf5c6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowIsDistinctFrom.java @@ -138,7 +138,7 @@ final class RowIsDistinctFrom extends AbstractCondition implements UNotYetImplem if (rhsRow != null) ctx.visit(rhsRow); else - visitSubquery(ctx, rhsSelect); + visitSubquery(ctx, rhsSelect, true); if (!not) ctx.sql(')'); @@ -154,7 +154,7 @@ final class RowIsDistinctFrom extends AbstractCondition implements UNotYetImplem if (rhsRow != null) ctx.visit(rhsRow); else - visitSubquery(ctx, rhsSelect); + visitSubquery(ctx, rhsSelect, true); } diff --git a/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java b/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java index 651865c665..bc6067cf97 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowSubqueryCondition.java @@ -251,13 +251,13 @@ final class RowSubqueryCondition extends AbstractCondition implements UNotYetImp boolean extraParentheses = false ; ctx.sql(extraParentheses ? "((" : "(") - .data(BooleanDataKey.DATA_ROW_VALUE_EXPRESSION_PREDICATE_SUBQUERY, true, c -> visitSubquery(c, right, false)) + .data(BooleanDataKey.DATA_ROW_VALUE_EXPRESSION_PREDICATE_SUBQUERY, true, c -> visitSubquery(c, right, true, false)) .sql(extraParentheses ? "))" : ")"); } // [#2054] Quantified row value expression comparison predicates shouldn't have parentheses before ANY or ALL else - ctx.data(BooleanDataKey.DATA_ROW_VALUE_EXPRESSION_PREDICATE_SUBQUERY, true, c -> c.subquery(true).visit(rightQuantified).subquery(false)); + ctx.data(BooleanDataKey.DATA_ROW_VALUE_EXPRESSION_PREDICATE_SUBQUERY, true, c -> c.visit(rightQuantified)); break; } diff --git a/jOOQ/src/main/java/org/jooq/impl/ScalarSubquery.java b/jOOQ/src/main/java/org/jooq/impl/ScalarSubquery.java index 9b2cca3376..4c57ce5e04 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ScalarSubquery.java +++ b/jOOQ/src/main/java/org/jooq/impl/ScalarSubquery.java @@ -64,11 +64,13 @@ final class ScalarSubquery extends AbstractField implements QOM.ScalarSubq static final Set NO_SUPPORT_WITH_IN_SCALAR_SUBQUERY = SQLDialect.supportedBy(HSQLDB); final Select query; + final boolean predicandSubquery; - ScalarSubquery(Select query, DataType type) { + ScalarSubquery(Select query, DataType type, boolean predicandSubquery) { super(N_SELECT, type); this.query = query; + this.predicandSubquery = predicandSubquery; } @Override @@ -84,9 +86,9 @@ final class ScalarSubquery extends AbstractField implements QOM.ScalarSubq // HSQLDB allows for using WITH inside of IN, see: https://sourceforge.net/p/hsqldb/bugs/1617/ // We'll still emulate CTE in scalar subqueries with a derived tables in all cases. if (q != null && q.with != null && NO_SUPPORT_WITH_IN_SCALAR_SUBQUERY.contains(ctx.dialect())) - visitSubquery(ctx, select(asterisk()).from(query.asTable("t"))); + visitSubquery(ctx, select(asterisk()).from(query.asTable("t")), predicandSubquery); else - visitSubquery(ctx, query); + visitSubquery(ctx, query, predicandSubquery); } // ------------------------------------------------------------------------- @@ -95,7 +97,7 @@ final class ScalarSubquery extends AbstractField implements QOM.ScalarSubq @Override public final Function1>, ? extends Field> $constructor() { - return s -> new ScalarSubquery<>((Select) s, (DataType) Tools.scalarType(s)); + return s -> new ScalarSubquery<>((Select) s, (DataType) Tools.scalarType(s), predicandSubquery); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectIsNotNull.java b/jOOQ/src/main/java/org/jooq/impl/SelectIsNotNull.java index bbd3e1b647..03378fd065 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectIsNotNull.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectIsNotNull.java @@ -90,7 +90,7 @@ final class SelectIsNotNull extends AbstractCondition implements QOM.SelectIsNot } private final void acceptStandard(Context ctx) { - visitSubquery(ctx, select); + visitSubquery(ctx, select, true); switch (ctx.family()) { diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectIsNull.java b/jOOQ/src/main/java/org/jooq/impl/SelectIsNull.java index 826c41fdb6..dbc1cf3843 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectIsNull.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectIsNull.java @@ -124,7 +124,7 @@ final class SelectIsNull extends AbstractCondition implements QOM.SelectIsNull { } private final void acceptStandard(Context ctx) { - visitSubquery(ctx, select); + visitSubquery(ctx, select, true); switch (ctx.family()) { diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index e0a070e5d4..85516f28ec 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -630,7 +630,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp @SuppressWarnings("unchecked") @Override public final Field asField() { - return new ScalarSubquery<>(this, (DataType) Tools.scalarType(this)); + return new ScalarSubquery<>(this, (DataType) Tools.scalarType(this), false); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/SplitPart.java b/jOOQ/src/main/java/org/jooq/impl/SplitPart.java index 88561d1810..fa9dbf6638 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SplitPart.java +++ b/jOOQ/src/main/java/org/jooq/impl/SplitPart.java @@ -175,7 +175,8 @@ implements visitSubquery( ctx, - withRecursive(s1, s2).select(DSL.coalesce(DSL.max(DSL.field(name("x"))), inline(""))).from(s2).where(s2.field("n").eq((Field) n)) + withRecursive(s1, s2).select(DSL.coalesce(DSL.max(DSL.field(name("x"))), inline(""))).from(s2).where(s2.field("n").eq((Field) n)), + false ); break; } diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index e42c32588e..5d9581606e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -2498,11 +2498,11 @@ final class Tools { return e; } - static final void visitSubquery(Context ctx, QueryPart query) { - visitSubquery(ctx, query, true); + static final void visitSubquery(Context ctx, QueryPart query, boolean predicandSubquery) { + visitSubquery(ctx, query, predicandSubquery, true); } - static final void visitSubquery(Context ctx, QueryPart query, boolean parentheses) { + static final void visitSubquery(Context ctx, QueryPart query, boolean predicandSubquery, boolean parentheses) { @@ -2511,12 +2511,16 @@ final class Tools { if (parentheses) ctx.sql('('); + boolean previousPredicandSubquery = ctx.predicandSubquery(); + ctx.subquery(true) + .predicandSubquery(predicandSubquery) .formatIndentStart() .formatNewLine() .visit(query) .formatIndentEnd() .formatNewLine() + .predicandSubquery(previousPredicandSubquery) .subquery(false); if (parentheses) diff --git a/jOOQ/src/main/java/org/jooq/impl/Unique.java b/jOOQ/src/main/java/org/jooq/impl/Unique.java index 8154da5996..1d9b442155 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Unique.java +++ b/jOOQ/src/main/java/org/jooq/impl/Unique.java @@ -103,7 +103,7 @@ implements case H2: ctx.visit(K_UNIQUE).sql(' '); - visitSubquery(ctx, query); + visitSubquery(ctx, query, true); break; default: diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java index aaa7cb0d30..27b9bf00b0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java @@ -650,7 +650,7 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl else select = multiSelect; - visitSubquery(ctx, select); + visitSubquery(ctx, select, false); } ctx.formatIndentEnd().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 463fa0788f..d7b9d0a80d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Values.java +++ b/jOOQ/src/main/java/org/jooq/impl/Values.java @@ -183,7 +183,7 @@ final class Values extends AbstractTable implements QOM.Val selects = selects.unionAll(select); } - visitSubquery(ctx, selects, false); + visitSubquery(ctx, selects, false, false); } diff --git a/jOOQ/src/main/java/org/jooq/impl/XMLTable.java b/jOOQ/src/main/java/org/jooq/impl/XMLTable.java index a4c77f7f3b..f06a0d35a0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/XMLTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/XMLTable.java @@ -261,6 +261,7 @@ implements + private final void acceptStandard(Context ctx) {