From a39f95a117d47ad0954c344467460968e4e5abf2 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 18 May 2022 15:34:15 +0200 Subject: [PATCH] [jOOQ/jOOQ#12868] The DATA_RENDERING_DATA_CHANGE_DELTA_TABLE qualification omission doesn't work correctly in the presence of scalar subqueries --- .../java/org/jooq/impl/AbstractDMLQuery.java | 16 +++++++++------- .../java/org/jooq/impl/DataChangeDeltaTable.java | 9 +++------ .../main/java/org/jooq/impl/SelectQueryImpl.java | 7 +++---- jOOQ/src/main/java/org/jooq/impl/Tools.java | 16 ++++++++-------- 4 files changed, 23 insertions(+), 25 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java index 17683d53c9..1dbc30ca0d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java @@ -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 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()) - )) - ); + )); + }); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DataChangeDeltaTable.java b/jOOQ/src/main/java/org/jooq/impl/DataChangeDeltaTable.java index 947bc2c711..8b181bf68e 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DataChangeDeltaTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/DataChangeDeltaTable.java @@ -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) { diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 354ef00698..b36c46841a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -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 extends AbstractResultQuery 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 extends AbstractResultQuery 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) diff --git a/jOOQ/src/main/java/org/jooq/impl/Tools.java b/jOOQ/src/main/java/org/jooq/impl/Tools.java index 2693685a0e..d8c4ea7fdd 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Tools.java +++ b/jOOQ/src/main/java/org/jooq/impl/Tools.java @@ -505,14 +505,6 @@ final class Tools { */ DATA_ROW_VALUE_EXPRESSION_PREDICATE_SUBQUERY, - /** - * [#2744] Currently rendering the data change delta table syntax. - *

- * In some dialects, a FINAL TABLE (INSERT ...) clause exists, which - * corresponds to the PostgreSQL INSERT .. RETURNING 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. + *

+ * In some dialects, a FINAL TABLE (INSERT ...) clause exists, which + * corresponds to the PostgreSQL INSERT .. RETURNING clause. + */ + DATA_RENDERING_DATA_CHANGE_DELTA_TABLE, + /** * [#531] The local window definitions. *