[jOOQ/jOOQ#11586] Put TOP_LEVEL_CTE marker at DML statement beginning,

not SELECT, in SQL Server
This commit is contained in:
Lukas Eder 2021-03-08 21:43:11 +01:00
parent 593ad03ab4
commit 0203c6f67c
2 changed files with 24 additions and 4 deletions

View File

@ -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<R extends Record> 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<R extends Record> 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<R extends Record> extends AbstractRowCountQuery
ctx.data().remove(DATA_DML_TARGET_TABLE);
ctx.scopeEnd();
}

View File

@ -1296,8 +1296,15 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> 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<R extends Record> extends AbstractResultQuery<R> 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)