From 47b555198295358dfd653f270c91a342110b62ac Mon Sep 17 00:00:00 2001 From: lukaseder Date: Fri, 9 Feb 2018 16:00:27 +0100 Subject: [PATCH] [#1502] Eagerly initialise scope with all tables This is required to support implicit join paths referencing roots from outer scopes from within correlated subqueries in the SELECT clause --- .../java/org/jooq/impl/DefaultRenderContext.java | 3 +-- jOOQ/src/main/java/org/jooq/impl/JoinTable.java | 4 ++-- .../main/java/org/jooq/impl/SelectQueryImpl.java | 14 +++++++++++++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java index da1b155e2c..1e24528c7b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java @@ -182,8 +182,7 @@ class DefaultRenderContext extends AbstractContext implements Ren public RenderContext scopeRegister(QueryPart part) { if (scopeLevel >= 0) { if (part instanceof TableImpl) { - Table table = (Table) part; - Table root = table; + Table root = (Table) part; Table child = root; List> keys = new ArrayList>(); List> tables = new ArrayList>(); diff --git a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java index 4102a40899..8ae44ed664 100755 --- a/jOOQ/src/main/java/org/jooq/impl/JoinTable.java +++ b/jOOQ/src/main/java/org/jooq/impl/JoinTable.java @@ -142,8 +142,8 @@ implements private static final EnumSet EMULATE_NATURAL_OUTER_JOIN = EnumSet.of(CUBRID, H2); private static final EnumSet EMULATE_JOIN_USING = EnumSet.of(CUBRID, H2); - private final Table lhs; - private final Table rhs; + final Table lhs; + final Table rhs; diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index 5b28d55a05..2e3c8d4ad3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -452,6 +452,8 @@ final class SelectQueryImpl extends AbstractResultQuery imp @Override public final void accept(Context context) { context.scopeStart(); + for (Table table : getFrom()) + registerTable(context, table); SQLDialect dialect = context.dialect(); SQLDialect family = context.family(); @@ -770,6 +772,16 @@ final class SelectQueryImpl extends AbstractResultQuery imp context.scopeEnd(); } + private final void registerTable(Context context, Table table) { + if (table instanceof JoinTable) { + registerTable(context, ((JoinTable) table).lhs); + registerTable(context, ((JoinTable) table).rhs); + } + else if (table instanceof TableImpl) { + context.scopeRegister(table); + } + } + private final void pushWindow(Context context) { // [#531] [#2790] Make the WINDOW clause available to the SELECT clause // to be able to inline window definitions if the WINDOW clause is not @@ -1786,7 +1798,7 @@ final class SelectQueryImpl extends AbstractResultQuery imp return getSelect0(); } - private >> Q resolveAsterisk(Q result) { + private final >> Q resolveAsterisk(Q result) { // [#109] [#489]: SELECT * is only applied when at least one table // from the table source is "unknown", i.e. not generated from a