diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java index de7f46660c..9dfe09b051 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java @@ -1184,14 +1184,14 @@ abstract class AbstractContext> extends AbstractScope imple } static class JoinNode { - final Configuration configuration; + final Context ctx; final Table table; final Map, JoinNode> pathsToOne; final Map, JoinNode> pathsToMany; int references; - JoinNode(Configuration configuration, Table table) { - this.configuration = configuration; + JoinNode(Context ctx, Table table) { + this.ctx = ctx; this.table = table; this.pathsToOne = new LinkedHashMap<>(); this.pathsToMany = new LinkedHashMap<>(); @@ -1215,7 +1215,6 @@ abstract class AbstractContext> extends AbstractScope imple - for (Entry, JoinNode> e : pathsToOne.entrySet()) { Table t = e.getValue().joinTree(); @@ -1265,7 +1264,7 @@ abstract class AbstractContext> extends AbstractScope imple } private final JoinType joinType(JoinType onDefault) { - switch (defaultIfNull(Tools.settings(configuration).getRenderImplicitJoinType(), RenderImplicitJoinType.DEFAULT)) { + switch (defaultIfNull(Tools.settings(ctx.configuration()).getRenderImplicitJoinType(), RenderImplicitJoinType.DEFAULT)) { case INNER_JOIN: return JOIN; case LEFT_JOIN: diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java index 973a71a110..2cbf23bae6 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java @@ -152,6 +152,7 @@ class DefaultRenderContext extends AbstractContext implements Ren qualifySchema(context.qualifySchema()); quote(context.quote()); castMode(context.castMode()); + topLevelForLanguageContext(context.topLevelForLanguageContext()); if (copyLocalState) { data().putAll(context.data()); @@ -248,16 +249,16 @@ class DefaultRenderContext extends AbstractContext implements Ren : scopeStack.getOrCreate(root); if (e.joinNode == null) - e.joinNode = new JoinNode(configuration(), root); + e.joinNode = new JoinNode(this, root); JoinNode node = e.joinNode; for (int i = tables.size() - 1; i >= 0; i--) { TableImpl t = tables.get(i); if (t.childPath != null) - node = node.pathsToOne.computeIfAbsent(t.childPath, k -> new JoinNode(configuration(), t)); + node = node.pathsToOne.computeIfAbsent(t.childPath, k -> new JoinNode(this, t)); else - node = node.pathsToMany.computeIfAbsent(t.parentPath, k -> new JoinNode(configuration(), t)); + node = node.pathsToMany.computeIfAbsent(t.parentPath, k -> new JoinNode(this, t)); if (i == 0) node.references++; diff --git a/jOOQ/src/main/java/org/jooq/impl/InlineDerivedTable.java b/jOOQ/src/main/java/org/jooq/impl/InlineDerivedTable.java index 2c1a732e9b..5ef826a89c 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InlineDerivedTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/InlineDerivedTable.java @@ -42,6 +42,8 @@ import static org.jooq.impl.DSL.selectFrom; import static org.jooq.impl.DSL.table; import org.jooq.Condition; +import org.jooq.Context; +// ... import org.jooq.QueryPart; import org.jooq.Record; // ... @@ -68,6 +70,21 @@ final class InlineDerivedTable extends DerivedTable { this.condition = condition; } + static final Table inlineDerivedTable(Context ctx, Table t) { + + + + + + + + + + + + return InlineDerivedTable.derivedTable(t); + } + static final Table derivedTable(Table t) { if (t instanceof InlineDerivedTable i) { return i; diff --git a/jOOQ/src/main/java/org/jooq/impl/Policies.java b/jOOQ/src/main/java/org/jooq/impl/Policies.java index bbc0156aab..a6e07bc11f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Policies.java +++ b/jOOQ/src/main/java/org/jooq/impl/Policies.java @@ -73,25 +73,6 @@ package org.jooq.impl; - - - - - - - - - - - - - - - - - - - diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 7ae813ce87..2895f7a684 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -2783,18 +2783,8 @@ final class SelectQueryImpl extends AbstractResultQuery imp return r; } - private static final Table inlineDerivedTable(Context ctx, Table t) { - - - - - - - return InlineDerivedTable.derivedTable(t); - } - private static final boolean hasInlineDerivedTables(Context ctx, Table t) { - return inlineDerivedTable(ctx, t) != null + return InlineDerivedTable.inlineDerivedTable(ctx, t) != null || t instanceof JoinTable && (hasInlineDerivedTables(ctx, ((JoinTable) t).lhs) || hasInlineDerivedTables(ctx, ((JoinTable) t).rhs)); } @@ -2853,7 +2843,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp TableList result, ConditionProviderImpl where ) { - Table t = inlineDerivedTable(ctx, table); + Table t = InlineDerivedTable.inlineDerivedTable(ctx, table); if (t != null) { if (t instanceof InlineDerivedTable i) { @@ -2875,7 +2865,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp ConditionProviderImpl where, boolean keepDerivedTable ) { - Table t = inlineDerivedTable(ctx, table); + Table t = InlineDerivedTable.inlineDerivedTable(ctx, table); if (t != null) { if (t instanceof InlineDerivedTable i) { diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java index 21724ed813..6bacffb171 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdateQueryImpl.java @@ -564,14 +564,13 @@ implements @Override public final void accept(Context ctx) { - - - - - - - - accept0(ctx); + // [#2682] [#15632] Apply inline derived tables to the target table (TODO: Apply also to USING, etc.) + Table t = InlineDerivedTable.inlineDerivedTable(ctx, table(ctx)); + if (t instanceof InlineDerivedTable i) { + copy(d -> d.addConditions(i.condition), i.table).accept0(ctx); + } + else + accept0(ctx); } @Override