From 967560fb1b218fb0ee5bb343205063b3ff2f0752 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Fri, 9 Feb 2018 12:03:19 +0100 Subject: [PATCH] [#1502] Support implicit join on aliased root table --- .../java/org/jooq/impl/AbstractContext.java | 20 +++++++++++-- jOOQ/src/main/java/org/jooq/impl/Alias.java | 6 ++-- .../org/jooq/impl/DefaultRenderContext.java | 28 ++++++------------- .../main/java/org/jooq/impl/TableImpl.java | 4 +-- 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java index 2f14955d04..faa43e55d4 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractContext.java @@ -102,6 +102,7 @@ abstract class AbstractContext> extends AbstractScope imple String stringLiteralEscapedApos = "'"; int index; int scopeLevel = -1; + int scopeMarking; final ScopeStack scopeStack; // [#2665] VisitListener API @@ -522,7 +523,11 @@ abstract class AbstractContext> extends AbstractScope imple } @Override - public /* non-final */ C scopeMarkStart(QueryPart part) { + public final C scopeMarkStart(QueryPart part) { + if (scopeLevel >= 0 && scopeMarking == 0) + scopeMarkStart0(part); + + scopeMarking++; return (C) this; } @@ -532,7 +537,11 @@ abstract class AbstractContext> extends AbstractScope imple } @Override - public /* non-final */ C scopeMarkEnd(QueryPart part) { + public final C scopeMarkEnd(QueryPart part) { + if (scopeLevel >= 0 && scopeMarking == 1) + scopeMarkEnd0(part); + + scopeMarking--; return (C) this; } @@ -546,6 +555,8 @@ abstract class AbstractContext> extends AbstractScope imple } void scopeStart0() {} + void scopeMarkStart0(QueryPart part) {} + void scopeMarkEnd0(QueryPart part) {} void scopeEnd0() {} @Override @@ -731,6 +742,11 @@ abstract class AbstractContext> extends AbstractScope imple return result; } + + @Override + public String toString() { + return joinTree().toString(); + } } static class ScopeStackElement { diff --git a/jOOQ/src/main/java/org/jooq/impl/Alias.java b/jOOQ/src/main/java/org/jooq/impl/Alias.java index bf58c0d6b9..4b6ae1440b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Alias.java +++ b/jOOQ/src/main/java/org/jooq/impl/Alias.java @@ -201,9 +201,6 @@ final class Alias extends AbstractQueryPart { toSQLWrapped(context); } - if (wrapped instanceof Table) - context.scopeMarkEnd(wrapping); - // [#291] some aliases cause trouble, if they are not explicitly marked using "as" toSQLAs(context); @@ -244,6 +241,9 @@ final class Alias extends AbstractQueryPart { } } + if (wrapped instanceof Table) + context.scopeMarkEnd(wrapping); + context.declareAliases(true); } diff --git a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java index 72af6c5692..b4fb086934 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java +++ b/jOOQ/src/main/java/org/jooq/impl/DefaultRenderContext.java @@ -167,26 +167,15 @@ class DefaultRenderContext extends AbstractContext implements Ren // ------------------------------------------------------------------------ @Override - public RenderContext scopeMarkStart(QueryPart part) { - if (scopeLevel >= 0) { - ScopeStackElement e = scopeStack.get(part); - if (e.positions == null) - e.positions = new int[2]; - - e.positions[0] = sql.length(); - } - - return this; + void scopeMarkStart0(QueryPart part) { + ScopeStackElement e = scopeStack.get(part); + e.positions = new int[] { sql.length(), -1 }; } @Override - public RenderContext scopeMarkEnd(QueryPart part) { - if (scopeLevel >= 0) { - ScopeStackElement e = scopeStack.get(part); - e.positions[1] = sql.length(); - } - - return this; + void scopeMarkEnd0(QueryPart part) { + ScopeStackElement e = scopeStack.get(part); + e.positions[1] = sql.length(); } @Override @@ -200,7 +189,7 @@ class DefaultRenderContext extends AbstractContext implements Ren List> tables = new ArrayList>(); while (root instanceof TableImpl && (child = ((TableImpl) root).child) != null) { - keys.add(((TableImpl) root).path); + keys.add(((TableImpl) root).childPath); tables.add(root); root = child; } @@ -226,6 +215,7 @@ class DefaultRenderContext extends AbstractContext implements Ren return this; } + @SuppressWarnings("deprecation") @Override void scopeEnd0() { outer: @@ -233,7 +223,7 @@ class DefaultRenderContext extends AbstractContext implements Ren if (e1.positions == null || e1.joinNode == null) continue outer; - String replaced = "(" + DSL.using(configuration).render(e1.joinNode.joinTree()) + ")"; + String replaced = "(" + DSL.using(configuration).renderContext().declareTables(true).render(e1.joinNode.joinTree()) + ")"; sql.replace(e1.positions[0], e1.positions[1], replaced); int shift = replaced.length() - (e1.positions[1] - e1.positions[0]); diff --git a/jOOQ/src/main/java/org/jooq/impl/TableImpl.java b/jOOQ/src/main/java/org/jooq/impl/TableImpl.java index 021d4ffd20..64683b70d5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/TableImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/TableImpl.java @@ -80,7 +80,7 @@ public class TableImpl extends AbstractTable { protected final Field[] parameters; final Table child; - final ForeignKey path; + final ForeignKey childPath; /** * @deprecated - 3.10 - [#5996] - Use {@link #TableImpl(Name)} instead (or @@ -164,7 +164,7 @@ public class TableImpl extends AbstractTable { this.fields = new Fields(); this.child = child; - this.path = path; + this.childPath = path; if (aliased != null) {