From 0203c6f67cab7dd83fea16851fdeb325b4e09779 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 8 Mar 2021 21:43:11 +0100 Subject: [PATCH] [jOOQ/jOOQ#11586] Put TOP_LEVEL_CTE marker at DML statement beginning, not SELECT, in SQL Server --- .../main/java/org/jooq/impl/AbstractDMLQuery.java | 15 ++++++++++++++- .../main/java/org/jooq/impl/SelectQueryImpl.java | 13 ++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java index 3b8ca7b598..4c9475c479 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractDMLQuery.java @@ -86,6 +86,7 @@ import static org.jooq.impl.Keywords.K_ROWCOUNT; import static org.jooq.impl.Keywords.K_SELECT; import static org.jooq.impl.Keywords.K_SQL; import static org.jooq.impl.Keywords.K_TABLE; +import static org.jooq.impl.ScopeMarker.TOP_LEVEL_CTE; import static org.jooq.impl.Tools.EMPTY_FIELD; import static org.jooq.impl.Tools.EMPTY_STRING; import static org.jooq.impl.Tools.flattenCollection; @@ -93,6 +94,7 @@ import static org.jooq.impl.Tools.qualify; import static org.jooq.impl.Tools.BooleanDataKey.DATA_EMULATE_BULK_INSERT_RETURNING; import static org.jooq.impl.Tools.BooleanDataKey.DATA_UNALIAS_ALIASED_EXPRESSIONS; import static org.jooq.impl.Tools.DataKey.DATA_DML_TARGET_TABLE; +import static org.jooq.impl.Tools.DataKey.DATA_TOP_LEVEL_CTE; import static org.jooq.tools.StringUtils.defaultIfNull; import static org.jooq.util.sqlite.SQLiteDSL.rowid; @@ -320,7 +322,12 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery public final void accept(Context ctx) { WithImpl w = with; - ctx.data(DATA_DML_TARGET_TABLE, table); + ctx.scopeStart() + .data(DATA_DML_TARGET_TABLE, table); + + + + @@ -340,6 +347,11 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery if (w != null) ctx.visit(w); + else + ctx.scopeMarkStart(TOP_LEVEL_CTE.beforeFirst) + .scopeMarkEnd(TOP_LEVEL_CTE.beforeFirst) + .scopeMarkStart(TOP_LEVEL_CTE.afterLast) + .scopeMarkEnd(TOP_LEVEL_CTE.afterLast); boolean previousDeclareFields = ctx.declareFields(); @@ -608,6 +620,7 @@ abstract class AbstractDMLQuery extends AbstractRowCountQuery ctx.data().remove(DATA_DML_TARGET_TABLE); + ctx.scopeEnd(); } diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 96469efe1a..96f44451cf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -1296,8 +1296,15 @@ final class SelectQueryImpl extends AbstractResultQuery imp } final void accept0(Context context) { - if (context.subqueryLevel() == 0) - context.scopeStart().data(DATA_TOP_LEVEL_CTE, new TopLevelCte()); + boolean topLevelCte = false; + + // Subquery scopes are started in AbstractContext + if (context.subqueryLevel() == 0) { + context.scopeStart(); + + if (topLevelCte |= (context.data(DATA_TOP_LEVEL_CTE) == null)) + context.data(DATA_TOP_LEVEL_CTE, new TopLevelCte()); + } SQLDialect dialect = context.dialect(); @@ -1341,7 +1348,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp if (with != null) context.visit(with); - else if (context.subqueryLevel() == 0) + else if (topLevelCte && context.subqueryLevel() == 0) context.scopeMarkStart(TOP_LEVEL_CTE.beforeFirst) .scopeMarkEnd(TOP_LEVEL_CTE.beforeFirst) .scopeMarkStart(TOP_LEVEL_CTE.afterLast)