diff --git a/jOOQ/src/main/java/org/jooq/Context.java b/jOOQ/src/main/java/org/jooq/Context.java index 4b18633acd..3a5e802b30 100644 --- a/jOOQ/src/main/java/org/jooq/Context.java +++ b/jOOQ/src/main/java/org/jooq/Context.java @@ -38,6 +38,7 @@ package org.jooq; import java.sql.PreparedStatement; +import java.util.function.Consumer; import org.jooq.RenderContext.CastMode; import org.jooq.conf.ParamType; @@ -100,6 +101,13 @@ public interface Context> extends Scope { @NotNull C declareFields(boolean declareFields); + /** + * Set the new context value for {@link #declareFields()} for the scope of a + * {@link Consumer}. + */ + @NotNull + C declareFields(boolean declareFields, Consumer consumer); + /** * Whether the current context is rendering a SQL table declaration (e.g. a * {@link Table} in the FROM or JOIN clause of the @@ -113,6 +121,13 @@ public interface Context> extends Scope { @NotNull C declareTables(boolean declareTables); + /** + * Set the new context value for {@link #declareTables()} for the scope of a + * {@link Consumer}. + */ + @NotNull + C declareTables(boolean declareTables, Consumer consumer); + /** * Whether the current context is rendering a SQL alias declarations in * {@link #declareTables()} or {@link #declareFields()} sections. @@ -126,6 +141,14 @@ public interface Context> extends Scope { @NotNull C declareAliases(boolean declareTables); + /** + * Whether the current context is rendering a SQL alias declarations in + * {@link #declareTables()} or {@link #declareFields()} sections for the + * scope of a {@link Consumer}. + */ + @NotNull + C declareAliases(boolean declareTables, Consumer consumer); + /** * Whether the current context is rendering a SQL window declaration (e.g. a * {@link WindowDefinition} in the WINDOW clause of the query). @@ -138,6 +161,13 @@ public interface Context> extends Scope { @NotNull C declareWindows(boolean declareWindows); + /** + * Set the new context value for {@link #declareWindows()} for the scope of + * a {@link Consumer}. + */ + @NotNull + C declareWindows(boolean declareWindows, Consumer consumer); + /** * Whether the current context is rendering a common table expression (e.g. * a {@link CommonTableExpression} in the WITH clause of the @@ -151,6 +181,13 @@ public interface Context> extends Scope { @NotNull C declareCTE(boolean declareCTE); + /** + * Set the new context value for {@link #declareCTE()} for the scope of a + * {@link Consumer}. + */ + @NotNull + C declareCTE(boolean declareCTE, Consumer consumer); + /** * Whether the current context is rendering a sub-query (nested query). */ @@ -501,6 +538,13 @@ public interface Context> extends Scope { @NotNull C quote(boolean quote); + /** + * Set the new context value for {@link #quote()} for the scope of a + * {@link Consumer}. + */ + @NotNull + C quote(boolean quote, Consumer consumer); + /** * Whether query parts should render qualified names or not. */ @@ -514,6 +558,13 @@ public interface Context> extends Scope { @NotNull C qualify(boolean qualify); + /** + * Set the new context value for {@link #qualify()} for the scope of a + * {@link Consumer}. + */ + @NotNull + C qualify(boolean qualify, Consumer consumer); + /** * Whether query parts should render qualified names or not. *

@@ -527,6 +578,13 @@ public interface Context> extends Scope { @NotNull C qualifySchema(boolean qualifySchema); + /** + * Set the new context value for {@link #qualifySchema()} for the scope of a + * {@link Consumer}. + */ + @NotNull + C qualifySchema(boolean qualifySchema, Consumer consumer); + /** * Whether query parts should render qualified names or not. *

@@ -544,6 +602,16 @@ public interface Context> extends Scope { @NotNull C qualifyCatalog(boolean qualifyCatalog); + /** + * Set the new context value for {@link #qualifyCatalog()} for the scope of + * a {@link Consumer}. + *

+ * The catalog can only be qualified when {@link #qualifySchema()} is + * true as well. + */ + @NotNull + C qualifyCatalog(boolean qualifyCatalog, Consumer consumer); + /** * Specify, how bind values should be rendered. *

@@ -566,11 +634,33 @@ public interface Context> extends Scope { C paramType(ParamType paramType); /** - * Set the new context value for {@link #paramType()}, if a condition is true. + * Visit a query part with a given value for {@link #paramType()}. + */ + @NotNull + C visit(QueryPart part, ParamType paramType); + + /** + * Set the new context value for {@link #paramType()}, if a condition is + * true. */ @NotNull C paramTypeIf(ParamType paramType, boolean condition); + /** + * Set the new context value for {@link #paramType()} for the scope of a + * {@link Consumer}. + */ + @NotNull + C paramType(ParamType paramType, Consumer runnable); + + /** + * Set the new context value for {@link #paramType()} for the scope of a + * {@link Consumer}, if a condition is + * true. + */ + @NotNull + C paramTypeIf(ParamType paramType, boolean condition, Consumer runnable); + /** * The currently applied cast mode for bind values. */ diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java index d5da21b9ec..e6b7cfb40b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java @@ -61,6 +61,9 @@ import java.util.Deque; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; +import java.util.function.BooleanSupplier; +import java.util.function.Consumer; +import java.util.function.Supplier; import java.util.Set; import org.jooq.BindContext; @@ -88,6 +91,8 @@ import org.jooq.conf.SettingsTools; import org.jooq.conf.StatementType; import org.jooq.tools.StringUtils; +import org.jetbrains.annotations.NotNull; + /** * @author Lukas Eder */ @@ -281,6 +286,39 @@ abstract class AbstractContext> extends AbstractScope imple protected abstract void visit0(QueryPartInternal internal); + private final C toggle(boolean b, BooleanSupplier get, BooleanConsumer set, Consumer consumer) { + boolean previous = get.getAsBoolean(); + + try { + set.accept(b); + consumer.accept((C) this); + } + finally { + set.accept(previous); + } + + return (C) this; + } + + private final C toggle(T t, Supplier get, Consumer set, Consumer consumer) { + T previous = get.get(); + + try { + set.accept(t); + consumer.accept((C) this); + } + finally { + set.accept(previous); + } + + return (C) this; + } + + @FunctionalInterface + private interface BooleanConsumer { + void accept(boolean b); + } + /** * Emit a clause from a query part being visited. *

@@ -463,6 +501,11 @@ abstract class AbstractContext> extends AbstractScope imple return (C) this; } + @Override + public C declareFields(boolean f, Consumer consumer) { + return toggle(f, this::declareFields, this::declareFields, consumer); + } + @Override public final boolean declareTables() { return declareTables; @@ -475,6 +518,11 @@ abstract class AbstractContext> extends AbstractScope imple return (C) this; } + @Override + public C declareTables(boolean f, Consumer consumer) { + return toggle(f, this::declareTables, this::declareTables, consumer); + } + @Override public final boolean declareAliases() { return declareAliases; @@ -486,6 +534,11 @@ abstract class AbstractContext> extends AbstractScope imple return (C) this; } + @Override + public C declareAliases(boolean f, Consumer consumer) { + return toggle(f, this::declareAliases, this::declareAliases, consumer); + } + @Override public final boolean declareWindows() { return declareWindows; @@ -497,6 +550,11 @@ abstract class AbstractContext> extends AbstractScope imple return (C) this; } + @Override + public C declareWindows(boolean f, Consumer consumer) { + return toggle(f, this::declareWindows, this::declareWindows, consumer); + } + @Override public final boolean declareCTE() { return declareCTE; @@ -508,6 +566,11 @@ abstract class AbstractContext> extends AbstractScope imple return (C) this; } + @Override + public C declareCTE(boolean f, Consumer consumer) { + return toggle(f, this::declareCTE, this::declareCTE, consumer); + } + @Override public final int subqueryLevel() { return subquery; @@ -661,6 +724,11 @@ abstract class AbstractContext> extends AbstractScope imple return (C) this; } + @Override + public final C visit(QueryPart part, ParamType p) { + return paramType(p, c -> c.visit(part)); + } + @Override public final C paramTypeIf(ParamType p, boolean condition) { if (condition) @@ -669,6 +737,21 @@ abstract class AbstractContext> extends AbstractScope imple return (C) this; } + @Override + public final C paramType(ParamType p, Consumer runnable) { + return toggle(p, this::paramType, this::paramType, runnable); + } + + @Override + public final C paramTypeIf(ParamType p, boolean condition, Consumer runnable) { + if (condition) + paramType(p, runnable); + else + runnable.accept((C) this); + + return (C) this; + } + @Override public final boolean quote() { return quote; @@ -680,6 +763,11 @@ abstract class AbstractContext> extends AbstractScope imple return (C) this; } + @Override + public final C quote(boolean q, Consumer consumer) { + return toggle(q, this::quote, this::quote, consumer); + } + @Override public final boolean qualify() { return qualifySchema(); @@ -690,6 +778,11 @@ abstract class AbstractContext> extends AbstractScope imple return qualifySchema(q); } + @Override + public final C qualify(boolean q, Consumer consumer) { + return toggle(q, this::qualify, this::qualify, consumer); + } + @Override public final boolean qualifySchema() { return qualifySchema; @@ -701,6 +794,11 @@ abstract class AbstractContext> extends AbstractScope imple return (C) this; } + @Override + public final C qualifySchema(boolean q, Consumer consumer) { + return toggle(q, this::qualifySchema, this::qualifySchema, consumer); + } + @Override public final boolean qualifyCatalog() { return qualifyCatalog; @@ -712,6 +810,11 @@ abstract class AbstractContext> extends AbstractScope imple return (C) this; } + @Override + public final C qualifyCatalog(boolean q, Consumer consumer) { + return toggle(q, this::qualifyCatalog, this::qualifyCatalog, consumer); + } + @Override public final CastMode castMode() { return castMode; diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java index f538b9022f..066b21b285 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java @@ -771,9 +771,6 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery - - - @@ -794,17 +791,14 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery ctx.formatSeparator() .visit(K_RETURNING) .sql(' ') - .declareFields(true) - - .visit( + .declareFields(true, c -> c.visit( // Firebird doesn't support asterisks at all here // MariaDB doesn't support qualified asterisks: https://jira.mariadb.org/browse/MDEV-23178 - ctx.family() == FIREBIRD || ctx.family() == MARIADB + c.family() == FIREBIRD || c.family() == MARIADB ? new SelectFieldList<>(returningResolvedAsterisks) : returning - ) - .declareFields(declareFields); + )); if (unqualify) ctx.qualify(qualify); diff --git a/jOOQ/src/main/java/org/jooq/impl/Alias.java b/jOOQ/src/main/java/org/jooq/impl/Alias.java index 7b835b0012..1a1a156289 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Alias.java +++ b/jOOQ/src/main/java/org/jooq/impl/Alias.java @@ -255,9 +255,7 @@ final class Alias extends AbstractQueryPart { toSQLAs(context); context.sql(' ') - .qualify(false) - .visit(alias) - .qualify(qualify); + .qualify(false, c -> c.visit(alias)); // [#1801] Add field aliases to the table alias, if applicable if (fieldAliases != null && !emulatedDerivedColumnList) { @@ -297,11 +295,8 @@ final class Alias extends AbstractQueryPart { context.declareAliases(true); } - else { - context.qualify(false) - .visit(alias) - .qualify(qualify); - } + else + context.qualify(false, c -> c.visit(alias)); } final void toSQLAs(Context ctx) { diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterDatabaseImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterDatabaseImpl.java index 455c4c24d3..0c0f9affe2 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterDatabaseImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterDatabaseImpl.java @@ -161,14 +161,9 @@ implements ctx.sql(' ').visit(database); - if (renameTo != null) { - boolean qualify = ctx.qualify(); - - ctx.sql(' ') - .qualify(false) - .visit(supportRename ? K_TO : K_RENAME_TO).sql(' ').visit(renameTo) - .qualify(qualify); - } + if (renameTo != null) + ctx.sql(' ').visit(supportRename ? K_TO : K_RENAME_TO).sql(' ') + .qualify(false, c -> c.visit(renameTo)); } diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterIndexImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterIndexImpl.java index 9394b9873c..2d4393c611 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterIndexImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterIndexImpl.java @@ -168,7 +168,6 @@ implements private final void accept0(Context ctx) { boolean renameIndex = SUPPORT_RENAME_INDEX.contains(ctx.dialect()); - boolean qualify = ctx.qualify(); switch (ctx.family()) { @@ -180,11 +179,9 @@ implements ctx.visit(K_ALTER_TABLE).sql(' ') .visit(on).sql(' ') .visit(K_RENAME_INDEX).sql(' ') - .qualify(false) - .visit(index).sql(' ') + .qualify(false, c -> c.visit(index)).sql(' ') .visit(K_TO).sql(' ') - .visit(renameTo) - .qualify(qualify); + .qualify(false, c -> c.visit(renameTo)); break; } @@ -213,8 +210,6 @@ implements - - @@ -238,9 +233,8 @@ implements if (renameTo != null) ctx.start(Clause.ALTER_INDEX_RENAME) - .qualify(false) - .visit(renameIndex ? K_TO : K_RENAME_TO).sql(' ').visit(renameTo) - .qualify(qualify) + .visit(renameIndex ? K_TO : K_RENAME_TO).sql(' ') + .qualify(false, c -> c.visit(renameTo)) .end(Clause.ALTER_INDEX_RENAME); ctx.formatIndentEnd(); diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterSchemaImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterSchemaImpl.java index 4b5055b2c6..0059fe33d9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterSchemaImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterSchemaImpl.java @@ -174,15 +174,11 @@ implements .formatIndentStart() .formatSeparator(); - if (renameTo != null) { - boolean qualify = ctx.qualify(); - + if (renameTo != null) ctx.start(Clause.ALTER_SCHEMA_RENAME) - .qualify(false) - .visit(supportRename ? K_TO : K_RENAME_TO).sql(' ').visit(renameTo) - .qualify(qualify) + .visit(supportRename ? K_TO : K_RENAME_TO).sql(' ') + .qualify(false, c -> c.visit(renameTo)) .end(Clause.ALTER_SCHEMA_RENAME); - } ctx.formatIndentEnd(); } diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java index 4a8bb28deb..18f3ccc8dd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterSequenceImpl.java @@ -346,9 +346,7 @@ implements .sql(' ') .visit(K_RENAME_TO) .sql(' ') - .qualify(false) - .visit(renameTo) - .qualify(qualify) + .qualify(false, c -> c.visit(renameTo)) .end(Clause.ALTER_SEQUENCE_RENAME) .end(Clause.ALTER_SEQUENCE_SEQUENCE); } @@ -368,10 +366,6 @@ implements - - - - private final void accept1(Context ctx) { @@ -391,11 +385,6 @@ implements - - - - - default: { ctx.sql(' ').visit(sequence); break; @@ -405,14 +394,10 @@ implements ctx.end(Clause.ALTER_SEQUENCE_SEQUENCE); if (renameTo != null) { - boolean qualify = ctx.qualify(); - ctx.start(Clause.ALTER_SEQUENCE_RENAME) .sql(' ').visit(K_RENAME_TO) .sql(' ') - .qualify(false) - .visit(renameTo) - .qualify(qualify) + .qualify(false, c -> c.visit(renameTo)) .end(Clause.ALTER_SEQUENCE_RENAME); } else { diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java index 9371cb2d8c..392ae600b4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterTableImpl.java @@ -1169,7 +1169,6 @@ final class AlterTableImpl extends AbstractRowCountQuery implements ctx.end(ALTER_TABLE_RENAME); } else if (renameColumn != null) { - boolean qualify = ctx.qualify(); ctx.start(ALTER_TABLE_RENAME_COLUMN); switch (ctx.family()) { @@ -1182,30 +1181,27 @@ final class AlterTableImpl extends AbstractRowCountQuery implements .visit(renameColumn) .formatSeparator() .visit(K_TO).sql(' ') - .qualify(false) - .visit(renameColumnTo) - .qualify(qualify); + .qualify(false, c -> c.visit(renameColumnTo)); + break; case H2: case HSQLDB: - ctx.qualify(false) - .visit(K_ALTER_COLUMN).sql(' ') - .visit(renameColumn) + ctx.visit(K_ALTER_COLUMN).sql(' ') + .qualify(false, c -> c.visit(renameColumn)) .formatSeparator() .visit(K_RENAME_TO).sql(' ') - .visit(renameColumnTo) - .qualify(qualify); + .qualify(false, c -> c.visit(renameColumnTo)); + break; case FIREBIRD: - ctx.qualify(false) - .visit(K_ALTER_COLUMN).sql(' ') - .visit(renameColumn) + ctx.visit(K_ALTER_COLUMN).sql(' ') + .qualify(false, c -> c.visit(renameColumn)) .formatSeparator() .visit(K_TO).sql(' ') - .visit(renameColumnTo) - .qualify(qualify); + .qualify(false, c -> c.visit(renameColumnTo)); + break; @@ -1225,65 +1221,51 @@ final class AlterTableImpl extends AbstractRowCountQuery implements - - default: - ctx.qualify(false) - .visit(K_RENAME_COLUMN).sql(' ') - .visit(renameColumn) + ctx.visit(K_RENAME_COLUMN).sql(' ') + .qualify(false, c -> c.visit(renameColumn)) .formatSeparator() .visit(K_TO).sql(' ') - .visit(renameColumnTo) - .qualify(qualify); + .qualify(false, c -> c.visit(renameColumnTo)); + break; } ctx.end(ALTER_TABLE_RENAME_COLUMN); } else if (renameIndex != null) { - boolean qualify = ctx.qualify(); - ctx.start(ALTER_TABLE_RENAME_INDEX) - .qualify(false) .visit(K_RENAME_INDEX).sql(' ') - .visit(renameIndex) + .qualify(false, c -> c.visit(renameIndex)) .formatSeparator() .visit(K_TO).sql(' ') - .visit(renameIndexTo) - .qualify(qualify) + .qualify(false, c -> c.visit(renameIndexTo)) .end(ALTER_TABLE_RENAME_INDEX); } else if (renameConstraint != null) { - boolean qualify = ctx.qualify(); - ctx.start(ALTER_TABLE_RENAME_CONSTRAINT); ctx.data(DATA_CONSTRAINT_REFERENCE, true); if (family == HSQLDB) - ctx.qualify(false) - .visit(K_ALTER_CONSTRAINT).sql(' ') - .visit(renameConstraint) + ctx.visit(K_ALTER_CONSTRAINT).sql(' ') + .qualify(false, c -> c.visit(renameConstraint)) .formatSeparator() .visit(K_RENAME_TO).sql(' ') - .visit(renameConstraintTo) - .qualify(qualify); + .qualify(false, c -> c.visit(renameConstraintTo)); else - ctx.qualify(false) - .visit( K_RENAME_CONSTRAINT).sql(' ') - .visit(renameConstraint) + ctx.visit( K_RENAME_CONSTRAINT).sql(' ') + .qualify(false, c -> c.visit(renameConstraint)) .formatSeparator() .visit(K_TO).sql(' ') - .visit(renameConstraintTo) - .qualify(qualify); + .qualify(false, c -> c.visit(renameConstraintTo)); ctx.data().remove(DATA_CONSTRAINT_REFERENCE); ctx.end(ALTER_TABLE_RENAME_CONSTRAINT); } else if (add != null) { - boolean qualify = ctx.qualify(); boolean multiAdd = REQUIRE_REPEAT_ADD_ON_MULTI_ALTER.contains(ctx.dialect()); boolean parens = !multiAdd ; boolean comma = true ; @@ -1309,9 +1291,7 @@ final class AlterTableImpl extends AbstractRowCountQuery implements ctx.sql(comma ? "," : "").formatSeparator(); FieldOrConstraint part = add.get(i); - ctx.qualify(false) - .visit(part) - .qualify(qualify); + ctx.qualify(false, c -> c.visit(part)); if (part instanceof Field) { ctx.sql(' '); @@ -1330,8 +1310,6 @@ final class AlterTableImpl extends AbstractRowCountQuery implements ctx.end(ALTER_TABLE_ADD); } else if (addColumn != null) { - boolean qualify = ctx.qualify(); - ctx.start(ALTER_TABLE_ADD) .visit(K_ADD).sql(' '); @@ -1343,10 +1321,7 @@ final class AlterTableImpl extends AbstractRowCountQuery implements - ctx.qualify(false) - .visit(addColumn).sql(' ') - .qualify(qualify); - + ctx.qualify(false, c -> c.visit(addColumn)).sql(' '); toSQLDDLTypeDeclarationForAddition(ctx, addColumnType); @@ -1439,8 +1414,7 @@ final class AlterTableImpl extends AbstractRowCountQuery implements // MySQL's CHANGE COLUMN clause has a mandatory RENAMING syntax... if (alterColumnDefault == null && !alterColumnDropDefault) - ctx.visit(K_CHANGE_COLUMN) - .sql(' ').qualify(false).visit(alterColumn).qualify(true); + ctx.visit(K_CHANGE_COLUMN).sql(' ').qualify(false, c -> c.visit(alterColumn)); else ctx.visit(K_ALTER_COLUMN); @@ -1458,10 +1432,7 @@ final class AlterTableImpl extends AbstractRowCountQuery implements ctx.sql(' '); - - ctx.qualify(false) - .visit(alterColumn) - .qualify(true); + ctx.qualify(false, c -> c.visit(alterColumn)); if (alterColumnType != null) { switch (family) { @@ -1585,16 +1556,13 @@ final class AlterTableImpl extends AbstractRowCountQuery implements String separator = ""; for (Field dropColumn : dropColumns) { - ctx.sql(separator) - .qualify(false); + ctx.sql(separator); acceptDropColumn(ctx); if (ifExistsColumn && supportsIfExistsColumn(ctx)) ctx.sql(' ').visit(K_IF_EXISTS); - ctx.sql(' ') - .visit(dropColumn) - .qualify(true); + ctx.sql(' ').qualify(false, c -> c.visit(dropColumn)); @@ -1619,10 +1587,7 @@ final class AlterTableImpl extends AbstractRowCountQuery implements ctx.sql(' '); - - ctx.qualify(false) - .visit(dropColumns) - .qualify(true); + ctx.qualify(false, c -> c.visit(dropColumns)); @@ -1712,14 +1677,12 @@ final class AlterTableImpl extends AbstractRowCountQuery implements } private final void acceptFirstBeforeAfter(Context ctx) { - boolean previous = ctx.qualify(); - if (addFirst && ctx.family() != FIREBIRD) ctx.sql(' ').visit(K_FIRST); else if (addBefore != null) - ctx.sql(' ').visit(K_BEFORE).sql(' ').qualify(false).visit(addBefore).qualify(previous); + ctx.sql(' ').visit(K_BEFORE).sql(' ').qualify(false, c -> c.visit(addBefore)); else if (addAfter != null) - ctx.sql(' ').visit(K_AFTER).sql(' ').qualify(false).visit(addAfter).qualify(previous); + ctx.sql(' ').visit(K_AFTER).sql(' ').qualify(false, c -> c.visit(addAfter)); } private final void acceptDropColumn(Context ctx) { @@ -1813,17 +1776,6 @@ final class AlterTableImpl extends AbstractRowCountQuery implements - - - - - - - - - - - diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterTypeImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterTypeImpl.java index c77a4a78e7..37183003d8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterTypeImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterTypeImpl.java @@ -189,22 +189,17 @@ implements @Override public final void accept(Context ctx) { - ParamType previous = ctx.paramType(); - boolean qualified = ctx.qualify(); - ctx.visit(K_ALTER).sql(' ').visit(K_TYPE).sql(' ') .visit(type).sql(' '); if (renameTo != null) - ctx.visit(K_RENAME_TO).sql(' ').qualify(false).visit(renameTo).qualify(qualified); + ctx.visit(K_RENAME_TO).sql(' ').qualify(false, c -> c.visit(renameTo)); else if (setSchema != null) ctx.visit(K_SET).sql(' ').visit(K_SCHEMA).sql(' ').visit(setSchema); else if (addValue != null) ctx.visit(K_ADD).sql(' ').visit(K_VALUE).sql(' ').visit(addValue); else if (renameValue != null) ctx.visit(K_RENAME).sql(' ').visit(K_VALUE).sql(' ').visit(renameValue).sql(' ').visit(K_TO).sql(' ').visit(renameValueTo); - - ctx.paramType(previous); } diff --git a/jOOQ/src/main/java/org/jooq/impl/AlterViewImpl.java b/jOOQ/src/main/java/org/jooq/impl/AlterViewImpl.java index 38484dd86b..1812039311 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AlterViewImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/AlterViewImpl.java @@ -227,12 +227,6 @@ implements - - - - - - @@ -253,15 +247,11 @@ implements .formatIndentStart() .formatSeparator(); - if (renameTo != null) { - boolean qualify = ctx.qualify(); - + if (renameTo != null) ctx.start(Clause.ALTER_VIEW_RENAME) - .qualify(false) - .visit(K_RENAME_TO).sql(' ').visit(renameTo) - .qualify(qualify) + .visit(K_RENAME_TO).sql(' ') + .qualify(false, c -> c.visit(renameTo)) .end(Clause.ALTER_VIEW_RENAME); - } ctx.formatIndentEnd(); } diff --git a/jOOQ/src/main/java/org/jooq/impl/CommentOnImpl.java b/jOOQ/src/main/java/org/jooq/impl/CommentOnImpl.java index 35cfae0c2e..c75e668df7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CommentOnImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CommentOnImpl.java @@ -225,9 +225,6 @@ implements - - - diff --git a/jOOQ/src/main/java/org/jooq/impl/CompareCondition.java b/jOOQ/src/main/java/org/jooq/impl/CompareCondition.java index c774245891..e4bb1a53aa 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CompareCondition.java +++ b/jOOQ/src/main/java/org/jooq/impl/CompareCondition.java @@ -178,9 +178,7 @@ final class CompareCondition extends AbstractCondition implements LikeEscapeStep ctx.visit(op.toKeyword()).sql(' '); if (castRhs) ctx.visit(K_CAST).sql('('); - ctx.paramType(forcedParamType) - .visit(rhs) - .paramType(previousParamType); + ctx.visit(rhs, forcedParamType); if (castRhs) ctx.sql(' ').visit(K_AS).sql(' ').visit(K_VARCHAR).sql("(4000))"); if (escape != null) { diff --git a/jOOQ/src/main/java/org/jooq/impl/ConstraintImpl.java b/jOOQ/src/main/java/org/jooq/impl/ConstraintImpl.java index 773bc6b041..1d9dee420d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ConstraintImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/ConstraintImpl.java @@ -213,11 +213,7 @@ implements if (unique != null) { ctx.visit(K_UNIQUE) - .sql(" (") - .qualify(false) - .visit(wrap(unique)) - .qualify(qualify) - .sql(')'); + .sql(" (").visit(wrap(unique).qualify(false)).sql(')'); @@ -232,11 +228,7 @@ implements - ctx.sql(" (") - .qualify(false) - .visit(wrap(primaryKey)) - .qualify(qualify) - .sql(')'); + ctx.sql(" (").visit(wrap(primaryKey).qualify(false)).sql(')'); @@ -245,22 +237,14 @@ implements } else if (foreignKey != null) { ctx.visit(K_FOREIGN_KEY) - .sql(" (") - .qualify(false) - .visit(wrap(foreignKey)) - .qualify(qualify) - .sql(')') + .sql(" (").visit(wrap(foreignKey).qualify(false)).sql(')') .formatSeparator() .visit(K_REFERENCES) .sql(' ') .visit(referencesTable); if (references.length > 0) - ctx.sql(" (") - .qualify(false) - .visit(wrap(references)) - .qualify(qualify) - .sql(')'); + ctx.sql(" (").visit(wrap(references).qualify(false)).sql(')'); if (onDelete != null) @@ -278,11 +262,7 @@ implements } else if (check != null) { ctx.visit(K_CHECK) - .sql(" (") - .qualify(false) - .visit(check) - .qualify(qualify) - .sql(')'); + .sql(" (").qualify(false, c -> c.visit(check)).sql(')'); } if (!enforced) diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateIndexImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateIndexImpl.java index 7078eb932e..ca679d3401 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateIndexImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateIndexImpl.java @@ -295,7 +295,7 @@ implements boolean supportsInclude = SUPPORT_INCLUDE.contains(ctx.dialect()); boolean supportsFieldsBeforeTable = false ; - QueryPartList list = new QueryPartList<>(); + QueryPartList list = new QueryPartList<>().qualify(false); list.addAll(on); if (!supportsInclude && include != null) @@ -306,10 +306,6 @@ implements - - - - ctx.visit(K_ON) .sql(' ') .visit(table); @@ -317,11 +313,7 @@ implements - ctx.sql('(') - .qualify(false) - .visit(list) - .qualify(true) - .sql(')'); + ctx.sql('(').visit(list).sql(')'); if (supportsInclude && include != null) { Keyword keyword = K_INCLUDE; @@ -338,21 +330,20 @@ implements .sql(')'); } - Condition c = where; + Condition condition; - if (excludeNullKeys && c == null) + if (excludeNullKeys && where == null) + condition = on.size() == 1 + ? field(Tools.first(on)).isNotNull() + : row(Tools.fields(on)).isNotNull(); + else + condition = where; - - - c = on.size() == 1 ? field(Tools.first(on)).isNotNull() : row(Tools.fields(on)).isNotNull(); - - if (c != null && ctx.configuration().data("org.jooq.ddl.ignore-storage-clauses") == null) + if (condition != null && ctx.configuration().data("org.jooq.ddl.ignore-storage-clauses") == null) ctx.formatSeparator() .visit(K_WHERE) .sql(' ') - .qualify(false) - .visit(c) - .qualify(true); + .qualify(false, c -> c.visit(condition)); diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateTypeImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateTypeImpl.java index 8f076d0c68..3bc84fcd5f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateTypeImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateTypeImpl.java @@ -106,14 +106,10 @@ final class CreateTypeImpl extends AbstractRowCountQuery implements @Override public final void accept(Context ctx) { - ParamType previous = ctx.paramType(); - ctx.visit(K_CREATE).sql(' ').visit(K_TYPE).sql(' ') .visit(type).sql(' ') .visit(K_AS).sql(' ').visit(K_ENUM).sql(" (") - .paramType(ParamType.INLINED) - .visit(values) - .sql(')') - .paramType(previous); + .visit(values, ParamType.INLINED) + .sql(')'); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java b/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java index 66602d8da6..700e6543e1 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CreateViewImpl.java @@ -221,9 +221,6 @@ final class CreateViewImpl extends AbstractRowCountQuery imple - // [#4806] CREATE VIEW doesn't accept parameters in most databases - ParamType paramType = ctx.paramType(); - ctx.start(CREATE_VIEW_NAME) .visit(replaceSupported && orReplace ? K_REPLACE : K_CREATE); @@ -257,34 +254,23 @@ final class CreateViewImpl extends AbstractRowCountQuery imple - - - - - ctx.visit(view); - if (rename && renameSupported) { - boolean qualify = ctx.qualify(); - - ctx.sql('(') - .qualify(false) - .visit(wrap(f)) - .qualify(qualify) - .sql(')'); - } + if (rename && renameSupported) + ctx.sql('(').visit(wrap(f).qualify(false)).sql(')'); ctx.end(CREATE_VIEW_NAME) .formatSeparator() .visit(K_AS) .formatSeparator() .start(CREATE_VIEW_AS) - .paramType(INLINED) + // [#4806] CREATE VIEW doesn't accept parameters in most databases .visit( rename && !renameSupported ? selectFrom(parsed().asTable(name("t"), Tools.fieldNames(f))) - : select) - .paramType(paramType) + : select, + INLINED + ) .end(CREATE_VIEW_AS); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DeclarationImpl.java b/jOOQ/src/main/java/org/jooq/impl/DeclarationImpl.java index bdcbdba8fd..8f1dfdca27 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DeclarationImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DeclarationImpl.java @@ -155,6 +155,5 @@ package org.jooq.impl; - diff --git a/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java index 60c27fe393..96b84e37e5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DeleteQueryImpl.java @@ -199,8 +199,6 @@ final class DeleteQueryImpl extends AbstractDMLQuery implem @SuppressWarnings({ "unchecked", "rawtypes" }) @Override final void accept0(Context ctx) { - boolean declare = ctx.declareTables(); - ctx.start(DELETE_DELETE) .visit(K_DELETE).sql(' '); @@ -214,18 +212,15 @@ final class DeleteQueryImpl extends AbstractDMLQuery implem .sql(' '); } - ctx.visit(K_FROM).sql(' ') - .declareTables(true) - .visit(table(ctx)); + ctx.visit(K_FROM).sql(' ').declareTables(true, c -> c.visit(table(c))); if (!using.isEmpty()) ctx.formatSeparator() .visit(K_USING) .sql(' ') - .visit(using); + .declareTables(true, c -> c.visit(using)); - ctx.declareTables(declare) - .end(DELETE_DELETE); + ctx.end(DELETE_DELETE); diff --git a/jOOQ/src/main/java/org/jooq/impl/DropSequenceImpl.java b/jOOQ/src/main/java/org/jooq/impl/DropSequenceImpl.java index 18b458f1e8..85cd206ec7 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DropSequenceImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DropSequenceImpl.java @@ -123,11 +123,6 @@ implements - - - - - default: { ctx.visit(sequence); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/DropViewImpl.java b/jOOQ/src/main/java/org/jooq/impl/DropViewImpl.java index 06d00c0a53..e2950820d5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DropViewImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/DropViewImpl.java @@ -117,11 +117,6 @@ implements - - - - - ctx.visit(view); ctx.end(Clause.DROP_VIEW_TABLE); diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java index 4562441895..161af9a278 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapForUpdate.java @@ -93,8 +93,7 @@ final class FieldMapForUpdate extends AbstractQueryPartMap, Field> { // [#2055] Other dialects require qualified column references to // disambiguated columns in queries like // UPDATE t1 JOIN t2 .. SET t1.val = ..., t2.val = ... - boolean restoreQualify = ctx.qualify(); - boolean supportsQualify = !NO_SUPPORT_QUALIFY.contains(ctx.dialect()) && restoreQualify; + boolean supportsQualify = !NO_SUPPORT_QUALIFY.contains(ctx.dialect()) && ctx.qualify(); // [#2823] [#10034] Few dialects need bind value casts for UPDATE .. SET // Some regressions have been observed e.g. in PostgreSQL with JSON types, so let's be careful. @@ -108,9 +107,7 @@ final class FieldMapForUpdate extends AbstractQueryPartMap, Field> { .formatSeparator(); ctx.start(assignmentClause) - .qualify(supportsQualify) - .visit(entry.getKey()) - .qualify(restoreQualify) + .qualify(supportsQualify, c -> c.visit(entry.getKey())) .sql(" = "); // [#8479] Emulate WHERE clause using CASE diff --git a/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java b/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java index de1e52c94e..e3eb81035d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java +++ b/jOOQ/src/main/java/org/jooq/impl/FieldMapsForInsert.java @@ -524,15 +524,8 @@ final class FieldMapsForInsert extends AbstractQueryPart { return; } - ctx.sql(" ("); - // [#989] Avoid qualifying fields in INSERT field declaration - boolean qualify = ctx.qualify(); - ctx.qualify(false) - .visit(new QueryPartCollectionView<>(collect(flattenCollection(values.keySet(), true)))) - .qualify(qualify); - - ctx.sql(')'); + ctx.sql(" (").visit(new QueryPartCollectionView<>(collect(flattenCollection(values.keySet(), true))).qualify(false)).sql(')'); } final Map, List>> valuesFlattened() { diff --git a/jOOQ/src/main/java/org/jooq/impl/ForLock.java b/jOOQ/src/main/java/org/jooq/impl/ForLock.java index b4493b02e0..e65eaa34a5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ForLock.java +++ b/jOOQ/src/main/java/org/jooq/impl/ForLock.java @@ -142,17 +142,7 @@ final class ForLock extends AbstractQueryPart { // [#4151] [#6117] Some databases don't allow for qualifying column // names here. Copy also to TableList - boolean unqualified = NO_SUPPORT_FOR_UPDATE_QUALIFIED.contains(ctx.dialect()); - boolean qualify = ctx.qualify(); - - if (unqualified) - ctx.qualify(false); - - ctx.sql(' ').visit(K_OF) - .sql(' ').visit(forLockOf); - - if (unqualified) - ctx.qualify(qualify); + ctx.qualify(!NO_SUPPORT_FOR_UPDATE_QUALIFIED.contains(ctx.dialect()) && ctx.qualify(), c -> c.sql(' ').visit(K_OF).sql(' ').visit(forLockOf)); } else if (Tools.isNotEmpty(forLockOfTables)) { ctx.sql(' ').visit(K_OF).sql(' '); diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java index d414b21e48..d949e59097 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertQueryImpl.java @@ -180,7 +180,7 @@ final class InsertQueryImpl extends AbstractStoreQuery impl @Override public final void onConflict(Collection> fields) { - this.onConflict = new QueryPartList<>(fields); + this.onConflict = new QueryPartList>(fields).qualify(false); } @Override @@ -332,11 +332,7 @@ final class InsertQueryImpl extends AbstractStoreQuery impl ctx.sql('('); if (onConflict != null && onConflict.size() > 0) - ctx.qualify(false) - .visit(onConflict) - .qualify(qualify); - - + ctx.visit(onConflict); @@ -355,9 +351,7 @@ final class InsertQueryImpl extends AbstractStoreQuery impl else if (table().getPrimaryKey() == null) ctx.sql("[unknown primary key]"); else - ctx.qualify(false) - .visit(new FieldsImpl<>(table().getPrimaryKey().getFields())) - .qualify(qualify); + ctx.qualify(false, c -> c.visit(new FieldsImpl<>(table().getPrimaryKey().getFields()))); ctx.sql(')'); } @@ -514,11 +508,7 @@ final class InsertQueryImpl extends AbstractStoreQuery impl boolean qualify = ctx.qualify(); if (onConflict != null && onConflict.size() > 0) { - ctx.sql(" (") - .qualify(false) - .visit(onConflict) - .qualify(qualify) - .sql(')'); + ctx.sql(" (").visit(onConflict).sql(')'); if (onConflictWhere.hasWhere()) ctx.formatSeparator() @@ -537,10 +527,6 @@ final class InsertQueryImpl extends AbstractStoreQuery impl - - - - } ctx.formatSeparator() @@ -650,9 +636,7 @@ final class InsertQueryImpl extends AbstractStoreQuery impl ctx.visit(K_INTO) .sql(' ') - .declareTables(true) - .visit(table(ctx)) - .declareTables(declareTables); + .declareTables(true, c -> c.visit(table(c))); insertMaps.toSQLReferenceKeys(ctx); ctx.end(INSERT_INSERT_INTO); diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONExists.java b/jOOQ/src/main/java/org/jooq/impl/JSONExists.java index 0040d29ada..63cbf71adf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONExists.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONExists.java @@ -148,8 +148,6 @@ final class JSONExists extends AbstractCondition implements JSONExistsOnStep { - - ctx.visit(path); diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONTable.java b/jOOQ/src/main/java/org/jooq/impl/JSONTable.java index ab045cd216..b2fe1690a8 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONTable.java @@ -306,11 +306,6 @@ implements - - - - - ctx.visit(path); } @@ -340,12 +335,7 @@ implements @Override public final void accept(Context ctx) { - boolean previous = ctx.qualify(); - - ctx.qualify(false) - .visit(field) - .qualify(previous) - .sql(' '); + ctx.qualify(false, c -> c.visit(field)).sql(' '); if (forOrdinality) ctx.visit(K_FOR).sql(' ').visit(K_ORDINALITY); diff --git a/jOOQ/src/main/java/org/jooq/impl/JSONValue.java b/jOOQ/src/main/java/org/jooq/impl/JSONValue.java index 9295363e42..059b53e77d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JSONValue.java +++ b/jOOQ/src/main/java/org/jooq/impl/JSONValue.java @@ -198,8 +198,6 @@ implements - - ctx.visit(path); diff --git a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java index aec07fb15d..48844969e4 100755 --- a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java @@ -468,7 +468,6 @@ implements private final void toSQLJoinCondition(Context ctx) { if (!using.isEmpty()) { - boolean qualify = ctx.qualify(); @@ -482,11 +481,7 @@ implements ctx.formatSeparator() .start(TABLE_JOIN_USING) .visit(K_USING) - .sql(" (") - .qualify(false) - .visit(wrap(using).indentSize(0)) - .qualify(qualify) - .sql(')') + .sql(" (").visit(wrap(using).indentSize(0).qualify(false)).sql(')') .end(TABLE_JOIN_USING); } diff --git a/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java b/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java index 2b4280ed13..c0e2e14067 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java @@ -1398,31 +1398,27 @@ implements private final void toSQLH2Merge(Context ctx) { ctx.visit(K_MERGE_INTO) .sql(' ') - .declareTables(true) - .visit(table) + .declareTables(true, c -> c.visit(table)) .formatSeparator(); ctx.sql('(') .visit(wrap(getUpsertFields()).qualify(false)) .sql(')'); - if (!getUpsertKeys().isEmpty()) { + if (!getUpsertKeys().isEmpty()) ctx.formatSeparator() .visit(K_KEY).sql(" (") .visit(wrap(getUpsertKeys()).qualify(false)) .sql(')'); - } - if (upsertSelect != null) { + if (upsertSelect != null) ctx.formatSeparator() .visit(upsertSelect); - } - else { + else ctx.formatSeparator() .visit(K_VALUES).sql(" (") .visit(getUpsertValues()) .sql(')'); - } } @@ -1465,15 +1461,12 @@ implements - private final void toSQLStandard(Context ctx) { ctx.start(MERGE_MERGE_INTO) .visit(K_MERGE_INTO).sql(' ') - .declareTables(true) - .visit(table) - .declareTables(false) + .declareTables(true, c -> c.visit(table)) .end(MERGE_MERGE_INTO) .formatSeparator() .start(MERGE_USING) @@ -1494,9 +1487,8 @@ implements break; } } - else { + else ctx.visit(using); - } ctx.data().remove(DATA_WRAP_DERIVED_TABLES_IN_PARENTHESES); ctx.declareTables(false); diff --git a/jOOQ/src/main/java/org/jooq/impl/Pivot.java b/jOOQ/src/main/java/org/jooq/impl/Pivot.java index 9f527cd051..67360a6034 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Pivot.java +++ b/jOOQ/src/main/java/org/jooq/impl/Pivot.java @@ -345,11 +345,6 @@ package org.jooq.impl; - - - - - diff --git a/jOOQ/src/main/java/org/jooq/impl/Prior.java b/jOOQ/src/main/java/org/jooq/impl/Prior.java index 851a59738d..342f217166 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Prior.java +++ b/jOOQ/src/main/java/org/jooq/impl/Prior.java @@ -125,13 +125,6 @@ package org.jooq.impl; - - - - - - - diff --git a/jOOQ/src/main/java/org/jooq/impl/RowsFrom.java b/jOOQ/src/main/java/org/jooq/impl/RowsFrom.java index af6a4cd0fb..85ac2b01db 100644 --- a/jOOQ/src/main/java/org/jooq/impl/RowsFrom.java +++ b/jOOQ/src/main/java/org/jooq/impl/RowsFrom.java @@ -87,13 +87,6 @@ final class RowsFrom extends AbstractTable { @Override public final void accept(Context ctx) { - boolean declareTables = ctx.declareTables(); - - ctx.visit(K_ROWS_FROM) - .sql(" (") - .declareTables(true) - .visit(tables) - .declareTables(declareTables) - .sql(')'); + ctx.visit(K_ROWS_FROM).sql(" (").declareTables(true, c -> c.visit(tables)).sql(')'); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 6d55195a76..36ccc600e0 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -1627,7 +1627,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp // are referenced from the below ranking functions' ORDER BY clause. c.data(DATA_UNALIAS_ALIASED_EXPRESSIONS, !wrapQueryExpressionBodyInDerivedTable); - boolean qualify = c.qualify(); + boolean q = c.qualify(); c.data(DATA_OVERRIDE_ALIASES_IN_ORDER_BY, new Object[] { originalFields, alternativeFields }); if (wrapQueryExpressionBodyInDerivedTable) @@ -1654,8 +1654,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp c.data().remove(DATA_UNALIAS_ALIASED_EXPRESSIONS); c.data().remove(DATA_OVERRIDE_ALIASES_IN_ORDER_BY); if (wrapQueryExpressionBodyInDerivedTable) - c.qualify(qualify); - + c.qualify(q); } }.as("rn"); @@ -1663,9 +1662,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp final Field[] unaliasedFields = Tools.unaliasedFields(originalFields); ctx.visit(K_SELECT).separatorRequired(true) - .declareFields(true) - .visit(new SelectFieldList<>(unaliasedFields)) - .declareFields(false) + .declareFields(true, c -> c.visit(new SelectFieldList<>(unaliasedFields))) .formatSeparator() .visit(K_FROM).sql(" (") .formatIndentStart() @@ -1777,10 +1774,6 @@ final class SelectQueryImpl extends AbstractResultQuery imp - - - - @@ -1808,7 +1801,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp // Depending on the dialect and on various syntax elements, parts of the above must be wrapped in // synthetic parentheses boolean wrapQueryExpressionInDerivedTable; - boolean wrapQueryExpressionBodyInDerivedTable = false; + boolean wrapQueryExpressionBodyInDerivedTable; boolean applySeekOnDerivedTable = applySeekOnDerivedTable(); @@ -1833,6 +1826,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp .formatIndentStart() .formatNewLine(); + wrapQueryExpressionBodyInDerivedTable = false @@ -1846,7 +1840,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp // [#7459] In the presence of UNIONs and other set operations, the SEEK // predicate must be applied on a derived table, not on the individual subqueries - wrapQueryExpressionBodyInDerivedTable |= applySeekOnDerivedTable; + || applySeekOnDerivedTable; if (wrapQueryExpressionBodyInDerivedTable) { context.visit(K_SELECT).sql(' '); @@ -1862,9 +1856,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp if (alternativeFields != null && originalFields.length < alternativeFields.length) context.sql(", ") .formatSeparator() - .declareFields(true) - .visit(alternativeFields[alternativeFields.length - 1]) - .declareFields(false); + .declareFields(true, c -> c.visit(alternativeFields[alternativeFields.length - 1])); context.formatIndentEnd() .formatSeparator() @@ -2191,9 +2183,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp context.formatSeparator() .visit(K_WINDOW) .separatorRequired(true) - .declareWindows(true) - .visit(window) - .declareWindows(false); + .declareWindows(true, c -> c.visit(window)); context.end(SELECT_WINDOW); @@ -2257,26 +2247,18 @@ final class SelectQueryImpl extends AbstractResultQuery imp context.formatSeparator() .visit(K_WHERE) .sql(' ') - .qualify(false) - .visit(getSeekCondition()) - .qualify(qualify); + .qualify(false, c -> c.visit(getSeekCondition())); } } // ORDER BY clause for UNION // ------------------------- - try { - context.qualify(false); - toSQLOrderBy( - context, - originalFields, alternativeFields, - wrapQueryExpressionInDerivedTable, wrapQueryExpressionBodyInDerivedTable, - unionOrderBy, unionLimit - ); - } - finally { - context.qualify(qualify); - } + context.qualify(false, c -> toSQLOrderBy( + context, + originalFields, alternativeFields, + wrapQueryExpressionInDerivedTable, wrapQueryExpressionBodyInDerivedTable, + unionOrderBy, unionLimit + )); } private final boolean hasOuterJoins(TableList tablelist) { diff --git a/jOOQ/src/main/java/org/jooq/impl/SetCommand.java b/jOOQ/src/main/java/org/jooq/impl/SetCommand.java index 6c0054e6e5..e0e21e749e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SetCommand.java +++ b/jOOQ/src/main/java/org/jooq/impl/SetCommand.java @@ -103,15 +103,7 @@ extends if (setLocal) ctx.sql(' ').visit(K_LOCAL); - ParamType previous = ctx.paramType(); - - if (NO_SUPPORT_BIND_VALUES.contains(ctx.dialect())) - ctx.paramType(ParamType.INLINED); - - ctx.sql(' ').visit(name).sql(" = ").visit(value); - - if (NO_SUPPORT_BIND_VALUES.contains(ctx.dialect())) - ctx.paramType(previous); + ctx.sql(' ').visit(name).sql(" = ").paramTypeIf(ParamType.INLINED, NO_SUPPORT_BIND_VALUES.contains(ctx.dialect()), c -> c.visit(value)); } diff --git a/jOOQ/src/main/java/org/jooq/impl/TableList.java b/jOOQ/src/main/java/org/jooq/impl/TableList.java index 0297463f2d..a20f2d0bbe 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableList.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableList.java @@ -94,26 +94,20 @@ final class TableList extends QueryPartList> { * list. */ final void toSQLFields(Context ctx) { - String separator = ""; // [#4151] [#6117] Some databases don't allow for qualifying column // names here. Copy also to SelectQueryImpl - boolean unqualified = UNQUALIFY_FIELDS.contains(ctx.dialect()); - boolean qualify = ctx.qualify(); + ctx.qualify(!UNQUALIFY_FIELDS.contains(ctx.dialect()) && ctx.qualify(), c -> { + String sep = ""; - if (unqualified) - ctx.qualify(false); + for (Table table : this) { + for (Field field : table.fieldsRow().fields()) { + ctx.sql(sep); + ctx.visit(field); - for (Table table : this) { - for (Field field : table.fieldsRow().fields()) { - ctx.sql(separator); - ctx.visit(field); - - separator = ", "; + sep = ", "; + } } - } - - if (unqualified) - ctx.qualify(qualify); + }); } } diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 9267a6669e..da3ca0e173 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -1898,11 +1898,7 @@ final class Tools { return new CustomField(field.getQualifiedName(), field.getDataType()) { @Override public void accept(Context ctx) { - ParamType previous = ctx.paramType(); - - ctx.paramType(INLINED); - ctx.visit(field); - ctx.paramType(previous); + ctx.visit(field, INLINED); } }; } diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java index d598d5e3af..c791f4381b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java @@ -545,8 +545,6 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl - - ctx.formatSeparator() .start(UPDATE_SET) .visit(K_SET) @@ -572,12 +570,8 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl .formatIndentEnd(); } else { - boolean qualify = ctx.qualify(); - ctx.start(UPDATE_SET_ASSIGNMENT) - .qualify(false) - .visit(multiRow) - .qualify(qualify) + .qualify(false, c -> c.visit(multiRow)) .sql(" = "); // Some dialects don't really support row value expressions on the @@ -639,9 +633,7 @@ final class UpdateQueryImpl extends AbstractStoreQuery impl if (!from.isEmpty()) ctx.formatSeparator() .visit(K_FROM).sql(' ') - .declareTables(true) - .visit(from) - .declareTables(false); + .declareTables(true, c -> c.visit(from)); ctx.end(UPDATE_FROM); break; diff --git a/jOOQ/src/main/java/org/jooq/impl/WindowSpecificationImpl.java b/jOOQ/src/main/java/org/jooq/impl/WindowSpecificationImpl.java index 2b9abf1b67..619e578f58 100644 --- a/jOOQ/src/main/java/org/jooq/impl/WindowSpecificationImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/WindowSpecificationImpl.java @@ -173,13 +173,8 @@ final class WindowSpecificationImpl extends AbstractQueryPart implements ctx.formatIndentStart() .formatNewLine(); - if (windowDefinition != null) { - boolean declareWindows = ctx.declareWindows(); - - ctx.declareWindows(false) - .visit(windowDefinition) - .declareWindows(declareWindows); - } + if (windowDefinition != null) + ctx.declareWindows(false, c -> c.visit(windowDefinition)); if (hasPartitionBy) { diff --git a/jOOQ/src/main/java/org/jooq/impl/WithImpl.java b/jOOQ/src/main/java/org/jooq/impl/WithImpl.java index 375b871ff0..cac2e253cb 100644 --- a/jOOQ/src/main/java/org/jooq/impl/WithImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/WithImpl.java @@ -207,7 +207,7 @@ implements ctx.visit(K_RECURSIVE) .separatorRequired(true); - CommonTableExpressionList c = ctes; + CommonTableExpressionList list; @@ -220,9 +220,9 @@ implements - ctx.declareCTE(true) - .visit(c) - .declareCTE(false); + list = ctes; + + ctx.declareCTE(true, c -> c.visit(list)); } @Override diff --git a/jOOQ/src/main/java/org/jooq/impl/XMLAttributesImpl.java b/jOOQ/src/main/java/org/jooq/impl/XMLAttributesImpl.java index 770f638287..8199dfbd4c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/XMLAttributesImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/XMLAttributesImpl.java @@ -64,7 +64,6 @@ final class XMLAttributesImpl extends AbstractQueryPart implements XMLAttributes @Override public final void accept(Context ctx) { - boolean declareFields = ctx.declareFields(); boolean format = attributes.size() > 1; Object previous = ctx.data(DATA_AS_REQUIRED, true); @@ -74,9 +73,7 @@ final class XMLAttributesImpl extends AbstractQueryPart implements XMLAttributes ctx.formatIndentStart() .formatNewLine(); - ctx.declareFields(true) - .visit(attributes) - .declareFields(declareFields); + ctx.declareFields(true, c -> c.visit(attributes)); if (format) ctx.formatIndentEnd() diff --git a/jOOQ/src/main/java/org/jooq/impl/XMLForest.java b/jOOQ/src/main/java/org/jooq/impl/XMLForest.java index d64c00482d..977c6ea20b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/XMLForest.java +++ b/jOOQ/src/main/java/org/jooq/impl/XMLForest.java @@ -86,13 +86,10 @@ extends @Override public final void accept(Context ctx) { - boolean declareFields = ctx.declareFields(); Object previous = ctx.data(DATA_AS_REQUIRED, true); ctx.visit(N_XMLFOREST).sql('(') - .declareFields(true) - .visit(new SelectFieldList<>(fields)) - .declareFields(declareFields) + .declareFields(true, c -> c.visit(new SelectFieldList<>(fields))) .sql(')'); ctx.data(DATA_AS_REQUIRED, previous); diff --git a/jOOQ/src/main/java/org/jooq/impl/XMLTable.java b/jOOQ/src/main/java/org/jooq/impl/XMLTable.java index f5cc7f8ec4..161f9899c5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/XMLTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/XMLTable.java @@ -302,11 +302,6 @@ implements - - - - - ctx.visit(xpath); } @@ -325,11 +320,6 @@ implements - - - - - ctx.sql(' ').visit(passing); } @@ -354,12 +344,7 @@ implements @Override public final void accept(Context ctx) { - boolean previous = ctx.qualify(); - - ctx.qualify(false) - .visit(field) - .qualify(previous) - .sql(' '); + ctx.qualify(false, c -> c.visit(field)).sql(' '); if (forOrdinality) ctx.visit(K_FOR).sql(' ').visit(K_ORDINALITY);