[jOOQ/jOOQ#11253] Add some convenience API for locally overriding

Context.paramType(), Context.qualify(), and other flags
This commit is contained in:
Lukas Eder 2021-01-19 15:43:44 +01:00
parent c9d36e6978
commit 2592baf1bb
43 changed files with 330 additions and 461 deletions

View File

@ -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<C extends Context<C>> 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<? super C> consumer);
/**
* Whether the current context is rendering a SQL table declaration (e.g. a
* {@link Table} in the <code>FROM</code> or <code>JOIN</code> clause of the
@ -113,6 +121,13 @@ public interface Context<C extends Context<C>> 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<? super C> 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<C extends Context<C>> 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<? super C> consumer);
/**
* Whether the current context is rendering a SQL window declaration (e.g. a
* {@link WindowDefinition} in the <code>WINDOW</code> clause of the query).
@ -138,6 +161,13 @@ public interface Context<C extends Context<C>> 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<? super C> consumer);
/**
* Whether the current context is rendering a common table expression (e.g.
* a {@link CommonTableExpression} in the <code>WITH</code> clause of the
@ -151,6 +181,13 @@ public interface Context<C extends Context<C>> 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<? super C> consumer);
/**
* Whether the current context is rendering a sub-query (nested query).
*/
@ -501,6 +538,13 @@ public interface Context<C extends Context<C>> 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<? super C> consumer);
/**
* Whether query parts should render qualified names or not.
*/
@ -514,6 +558,13 @@ public interface Context<C extends Context<C>> 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<? super C> consumer);
/**
* Whether query parts should render qualified names or not.
* <p>
@ -527,6 +578,13 @@ public interface Context<C extends Context<C>> 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<? super C> consumer);
/**
* Whether query parts should render qualified names or not.
* <p>
@ -544,6 +602,16 @@ public interface Context<C extends Context<C>> extends Scope {
@NotNull
C qualifyCatalog(boolean qualifyCatalog);
/**
* Set the new context value for {@link #qualifyCatalog()} for the scope of
* a {@link Consumer}.
* <p>
* The catalog can only be qualified when {@link #qualifySchema()} is
* <code>true</code> as well.
*/
@NotNull
C qualifyCatalog(boolean qualifyCatalog, Consumer<? super C> consumer);
/**
* Specify, how bind values should be rendered.
* <p>
@ -566,11 +634,33 @@ public interface Context<C extends Context<C>> 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<? super C> 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<? super C> runnable);
/**
* The currently applied cast mode for bind values.
*/

View File

@ -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<C extends Context<C>> extends AbstractScope imple
protected abstract void visit0(QueryPartInternal internal);
private final C toggle(boolean b, BooleanSupplier get, BooleanConsumer set, Consumer<? super C> consumer) {
boolean previous = get.getAsBoolean();
try {
set.accept(b);
consumer.accept((C) this);
}
finally {
set.accept(previous);
}
return (C) this;
}
private final <T> C toggle(T t, Supplier<T> get, Consumer<T> set, Consumer<? super C> 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.
* <p>
@ -463,6 +501,11 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
return (C) this;
}
@Override
public C declareFields(boolean f, Consumer<? super C> consumer) {
return toggle(f, this::declareFields, this::declareFields, consumer);
}
@Override
public final boolean declareTables() {
return declareTables;
@ -475,6 +518,11 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
return (C) this;
}
@Override
public C declareTables(boolean f, Consumer<? super C> consumer) {
return toggle(f, this::declareTables, this::declareTables, consumer);
}
@Override
public final boolean declareAliases() {
return declareAliases;
@ -486,6 +534,11 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
return (C) this;
}
@Override
public C declareAliases(boolean f, Consumer<? super C> consumer) {
return toggle(f, this::declareAliases, this::declareAliases, consumer);
}
@Override
public final boolean declareWindows() {
return declareWindows;
@ -497,6 +550,11 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
return (C) this;
}
@Override
public C declareWindows(boolean f, Consumer<? super C> consumer) {
return toggle(f, this::declareWindows, this::declareWindows, consumer);
}
@Override
public final boolean declareCTE() {
return declareCTE;
@ -508,6 +566,11 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
return (C) this;
}
@Override
public C declareCTE(boolean f, Consumer<? super C> consumer) {
return toggle(f, this::declareCTE, this::declareCTE, consumer);
}
@Override
public final int subqueryLevel() {
return subquery;
@ -661,6 +724,11 @@ abstract class AbstractContext<C extends Context<C>> 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<C extends Context<C>> extends AbstractScope imple
return (C) this;
}
@Override
public final C paramType(ParamType p, Consumer<? super C> runnable) {
return toggle(p, this::paramType, this::paramType, runnable);
}
@Override
public final C paramTypeIf(ParamType p, boolean condition, Consumer<? super C> 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<C extends Context<C>> extends AbstractScope imple
return (C) this;
}
@Override
public final C quote(boolean q, Consumer<? super C> consumer) {
return toggle(q, this::quote, this::quote, consumer);
}
@Override
public final boolean qualify() {
return qualifySchema();
@ -690,6 +778,11 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
return qualifySchema(q);
}
@Override
public final C qualify(boolean q, Consumer<? super C> consumer) {
return toggle(q, this::qualify, this::qualify, consumer);
}
@Override
public final boolean qualifySchema() {
return qualifySchema;
@ -701,6 +794,11 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
return (C) this;
}
@Override
public final C qualifySchema(boolean q, Consumer<? super C> consumer) {
return toggle(q, this::qualifySchema, this::qualifySchema, consumer);
}
@Override
public final boolean qualifyCatalog() {
return qualifyCatalog;
@ -712,6 +810,11 @@ abstract class AbstractContext<C extends Context<C>> extends AbstractScope imple
return (C) this;
}
@Override
public final C qualifyCatalog(boolean q, Consumer<? super C> consumer) {
return toggle(q, this::qualifyCatalog, this::qualifyCatalog, consumer);
}
@Override
public final CastMode castMode() {
return castMode;

View File

@ -771,9 +771,6 @@ abstract class AbstractDMLQuery<R extends Record> extends AbstractRowCountQuery
@ -794,17 +791,14 @@ abstract class AbstractDMLQuery<R extends Record> 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);

View File

@ -255,9 +255,7 @@ final class Alias<Q extends QueryPart> 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<Q extends QueryPart> 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) {

View File

@ -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));
}

View File

@ -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();

View File

@ -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();
}

View File

@ -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 {

View File

@ -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

View File

@ -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);
}

View File

@ -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();
}

View File

@ -225,9 +225,6 @@ implements

View File

@ -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) {

View File

@ -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)

View File

@ -295,7 +295,7 @@ implements
boolean supportsInclude = SUPPORT_INCLUDE.contains(ctx.dialect());
boolean supportsFieldsBeforeTable = false ;
QueryPartList<QueryPart> list = new QueryPartList<>();
QueryPartList<QueryPart> 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));

View File

@ -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(')');
}
}

View File

@ -221,9 +221,6 @@ final class CreateViewImpl<R extends Record> 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<R extends Record> 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);
}

View File

@ -155,6 +155,5 @@ package org.jooq.impl;

View File

@ -199,8 +199,6 @@ final class DeleteQueryImpl<R extends Record> extends AbstractDMLQuery<R> 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<R extends Record> extends AbstractDMLQuery<R> 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);

View File

@ -123,11 +123,6 @@ implements
default: {
ctx.visit(sequence);
break;

View File

@ -117,11 +117,6 @@ implements
ctx.visit(view);
ctx.end(Clause.DROP_VIEW_TABLE);

View File

@ -93,8 +93,7 @@ final class FieldMapForUpdate extends AbstractQueryPartMap<Field<?>, 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<?>, 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

View File

@ -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<Field<?>, List<Field<?>>> valuesFlattened() {

View File

@ -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(' ');

View File

@ -180,7 +180,7 @@ final class InsertQueryImpl<R extends Record> extends AbstractStoreQuery<R> impl
@Override
public final void onConflict(Collection<? extends Field<?>> fields) {
this.onConflict = new QueryPartList<>(fields);
this.onConflict = new QueryPartList<Field<?>>(fields).qualify(false);
}
@Override
@ -332,11 +332,7 @@ final class InsertQueryImpl<R extends Record> extends AbstractStoreQuery<R> 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<R extends Record> extends AbstractStoreQuery<R> 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<R extends Record> extends AbstractStoreQuery<R> 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<R extends Record> extends AbstractStoreQuery<R> impl
}
ctx.formatSeparator()
@ -650,9 +636,7 @@ final class InsertQueryImpl<R extends Record> extends AbstractStoreQuery<R> 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);

View File

@ -148,8 +148,6 @@ final class JSONExists extends AbstractCondition implements JSONExistsOnStep {
ctx.visit(path);

View File

@ -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);

View File

@ -198,8 +198,6 @@ implements
ctx.visit(path);

View File

@ -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);
}

View File

@ -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);

View File

@ -345,11 +345,6 @@ package org.jooq.impl;

View File

@ -125,13 +125,6 @@ package org.jooq.impl;

View File

@ -87,13 +87,6 @@ final class RowsFrom extends AbstractTable<Record> {
@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(')');
}
}

View File

@ -1627,7 +1627,7 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> 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<R extends Record> extends AbstractResultQuery<R> 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<R extends Record> extends AbstractResultQuery<R> 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<R extends Record> extends AbstractResultQuery<R> imp
@ -1808,7 +1801,7 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> 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<R extends Record> extends AbstractResultQuery<R> imp
.formatIndentStart()
.formatNewLine();
wrapQueryExpressionBodyInDerivedTable = false
@ -1846,7 +1840,7 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> 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<R extends Record> extends AbstractResultQuery<R> 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<R extends Record> extends AbstractResultQuery<R> 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<R extends Record> extends AbstractResultQuery<R> 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) {

View File

@ -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));
}

View File

@ -94,26 +94,20 @@ final class TableList extends QueryPartList<Table<?>> {
* 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);
});
}
}

View File

@ -1898,11 +1898,7 @@ final class Tools {
return new CustomField<T>(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);
}
};
}

View File

@ -545,8 +545,6 @@ final class UpdateQueryImpl<R extends Record> extends AbstractStoreQuery<R> impl
ctx.formatSeparator()
.start(UPDATE_SET)
.visit(K_SET)
@ -572,12 +570,8 @@ final class UpdateQueryImpl<R extends Record> extends AbstractStoreQuery<R> 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<R extends Record> extends AbstractStoreQuery<R> 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;

View File

@ -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) {

View File

@ -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

View File

@ -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()

View File

@ -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);

View File

@ -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);