[jOOQ/jOOQ#11253] Add some convenience API for locally overriding
Context.paramType(), Context.qualify(), and other flags
This commit is contained in:
parent
c9d36e6978
commit
2592baf1bb
@ -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.
|
||||
*/
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -225,9 +225,6 @@ implements
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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));
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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(')');
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -155,6 +155,5 @@ package org.jooq.impl;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
|
||||
|
||||
@ -123,11 +123,6 @@ implements
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
default: {
|
||||
ctx.visit(sequence);
|
||||
break;
|
||||
|
||||
@ -117,11 +117,6 @@ implements
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
ctx.visit(view);
|
||||
|
||||
ctx.end(Clause.DROP_VIEW_TABLE);
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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(' ');
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -148,8 +148,6 @@ final class JSONExists extends AbstractCondition implements JSONExistsOnStep {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
ctx.visit(path);
|
||||
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -198,8 +198,6 @@ implements
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
ctx.visit(path);
|
||||
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -345,11 +345,6 @@ package org.jooq.impl;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -125,13 +125,6 @@ package org.jooq.impl;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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(')');
|
||||
}
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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) {
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user