[jOOQ/jOOQ#12868] The DATA_RENDERING_DATA_CHANGE_DELTA_TABLE qualification omission doesn't work correctly in the presence of scalar subqueries

This commit is contained in:
Lukas Eder 2022-05-18 15:34:15 +02:00
parent 7aeed2e41f
commit a39f95a117
4 changed files with 23 additions and 25 deletions

View File

@ -97,9 +97,11 @@ import static org.jooq.impl.Tools.EMPTY_STRING;
import static org.jooq.impl.Tools.anyMatch;
import static org.jooq.impl.Tools.autoAlias;
import static org.jooq.impl.Tools.flattenCollection;
import static org.jooq.impl.Tools.increment;
import static org.jooq.impl.Tools.map;
import static org.jooq.impl.Tools.BooleanDataKey.DATA_UNALIAS_ALIASED_EXPRESSIONS;
import static org.jooq.impl.Tools.SimpleDataKey.DATA_DML_TARGET_TABLE;
import static org.jooq.impl.Tools.SimpleDataKey.DATA_RENDERING_DATA_CHANGE_DELTA_TABLE;
import static org.jooq.impl.Tools.SimpleDataKey.DATA_TOP_LEVEL_CTE;
import static org.jooq.tools.StringUtils.defaultIfNull;
import static org.jooq.util.sqlite.SQLiteDSL.rowid;
@ -367,14 +369,14 @@ abstract class AbstractDMLQuery<R extends Record> extends AbstractRowCountQuery
boolean previousDeclareFields = ctx.declareFields();
if (NATIVE_SUPPORT_DATA_CHANGE_DELTA_TABLE.contains(ctx.dialect())
&& !returning.isEmpty()
&& !TRUE.equals(ctx.data(BooleanDataKey.DATA_RENDERING_DATA_CHANGE_DELTA_TABLE))) {
ctx.data(BooleanDataKey.DATA_RENDERING_DATA_CHANGE_DELTA_TABLE,
true,
c -> c.visit(select(returning).from(
&& !returning.isEmpty()
&& ctx.data(DATA_RENDERING_DATA_CHANGE_DELTA_TABLE) == null
) {
increment(ctx.data(), DATA_RENDERING_DATA_CHANGE_DELTA_TABLE, () -> {
ctx.visit(select(returning).from(
new DataChangeDeltaTable<>(this instanceof Delete ? ResultOption.OLD : ResultOption.FINAL, this).as(table().getUnqualifiedName())
))
);
));
});
}

View File

@ -52,19 +52,17 @@ import static org.jooq.impl.Keywords.K_OLD;
import static org.jooq.impl.Keywords.K_RETURNING;
import static org.jooq.impl.Keywords.K_TABLE;
import static org.jooq.impl.Tools.abstractDMLQuery;
import static org.jooq.impl.Tools.increment;
import static org.jooq.impl.Tools.SimpleDataKey.DATA_RENDERING_DATA_CHANGE_DELTA_TABLE;
import static org.jooq.impl.Tools.SimpleDataKey.DATA_TOP_LEVEL_CTE;
import java.util.Set;
import java.util.UUID;
import java.util.function.BiFunction;
import java.util.function.Predicate;
import org.jooq.Context;
import org.jooq.DMLQuery;
import org.jooq.Delete;
import org.jooq.Function1;
import org.jooq.Insert;
import org.jooq.Merge;
import org.jooq.Name;
import org.jooq.QueryPart;
import org.jooq.Record;
@ -167,8 +165,7 @@ implements
if (requiresWorkaroundFor12925(ctx))
ctx.sql("/* [#12925] ").sql(UUID.randomUUID().toString()).sql(" */").formatSeparator();
ctx.visit(query)
.sqlIndentEnd(')');
increment(ctx.data(), DATA_RENDERING_DATA_CHANGE_DELTA_TABLE, () -> ctx.visit(query).sqlIndentEnd(')'));
}
private final boolean requiresWorkaroundFor12925(Context<?> ctx) {

View File

@ -169,7 +169,6 @@ import static org.jooq.impl.Keywords.K_MATERIALIZE;
import static org.jooq.impl.Keywords.K_NOCYCLE;
import static org.jooq.impl.Keywords.K_ORDER;
import static org.jooq.impl.Keywords.K_ORDER_BY;
import static org.jooq.impl.Keywords.K_PERCENT;
import static org.jooq.impl.Keywords.K_QUALIFY;
import static org.jooq.impl.Keywords.K_SELECT;
import static org.jooq.impl.Keywords.K_SIBLINGS;
@ -194,7 +193,6 @@ import static org.jooq.impl.Tools.autoAlias;
import static org.jooq.impl.Tools.camelCase;
import static org.jooq.impl.Tools.containsUnaliasedTable;
import static org.jooq.impl.Tools.fieldArray;
import static org.jooq.impl.Tools.filter;
import static org.jooq.impl.Tools.hasAmbiguousNames;
import static org.jooq.impl.Tools.isEmpty;
import static org.jooq.impl.Tools.isNotEmpty;
@ -219,6 +217,7 @@ import static org.jooq.impl.Tools.ExtendedDataKey.DATA_TRANSFORM_ROWNUM_TO_LIMIT
import static org.jooq.impl.Tools.SimpleDataKey.DATA_COLLECTED_SEMI_ANTI_JOIN;
import static org.jooq.impl.Tools.SimpleDataKey.DATA_DML_TARGET_TABLE;
import static org.jooq.impl.Tools.SimpleDataKey.DATA_OVERRIDE_ALIASES_IN_ORDER_BY;
import static org.jooq.impl.Tools.SimpleDataKey.DATA_RENDERING_DATA_CHANGE_DELTA_TABLE;
import static org.jooq.impl.Tools.SimpleDataKey.DATA_SELECT_ALIASES;
import static org.jooq.impl.Tools.SimpleDataKey.DATA_SELECT_INTO_TABLE;
import static org.jooq.impl.Tools.SimpleDataKey.DATA_TOP_LEVEL_CTE;
@ -2212,7 +2211,7 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
if (TRUE.equals(context.data(BooleanDataKey.DATA_RENDERING_DATA_CHANGE_DELTA_TABLE)))
if (Integer.valueOf(1).equals(context.data(DATA_RENDERING_DATA_CHANGE_DELTA_TABLE)))
context.qualify(false);
context.declareFields(true);
@ -2229,7 +2228,7 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
else
context.visit(getSelectResolveUnsupportedAsterisks(context));
if (TRUE.equals(context.data(BooleanDataKey.DATA_RENDERING_DATA_CHANGE_DELTA_TABLE)))
if (Integer.valueOf(1).equals(context.data(DATA_RENDERING_DATA_CHANGE_DELTA_TABLE)))
context.qualify(qualify);
context.declareFields(false)

View File

@ -505,14 +505,6 @@ final class Tools {
*/
DATA_ROW_VALUE_EXPRESSION_PREDICATE_SUBQUERY,
/**
* [#2744] Currently rendering the data change delta table syntax.
* <p>
* In some dialects, a <code>FINAL TABLE (INSERT ...)</code> clause exists, which
* corresponds to the PostgreSQL <code>INSERT .. RETURNING</code> clause.
*/
DATA_RENDERING_DATA_CHANGE_DELTA_TABLE,
@ -679,6 +671,14 @@ final class Tools {
*/
DATA_BLOCK_NESTING,
/**
* [#2744] Currently rendering the data change delta table syntax.
* <p>
* In some dialects, a <code>FINAL TABLE (INSERT ...)</code> clause exists, which
* corresponds to the PostgreSQL <code>INSERT .. RETURNING</code> clause.
*/
DATA_RENDERING_DATA_CHANGE_DELTA_TABLE,
/**
* [#531] The local window definitions.
* <p>