From 85368d25ed158c85bd19f4a63400884ab1cda26a Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sat, 8 Jun 2013 18:54:14 -0400 Subject: [PATCH] get nested joins to render on oracle 8 --- lib/sqlalchemy/dialects/oracle/base.py | 13 +++++++--- test/dialect/test_oracle.py | 33 ++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/lib/sqlalchemy/dialects/oracle/base.py b/lib/sqlalchemy/dialects/oracle/base.py index 6b6c32ae0f..a302bf4013 100644 --- a/lib/sqlalchemy/dialects/oracle/base.py +++ b/lib/sqlalchemy/dialects/oracle/base.py @@ -460,8 +460,13 @@ class OracleCompiler(compiler.SQLCompiler): return compiler.SQLCompiler.visit_join(self, join, **kwargs) else: kwargs['asfrom'] = True + if isinstance(join.right, expression.FromGrouping): + right = join.right.element + else: + right = join.right return self.process(join.left, **kwargs) + \ - ", " + self.process(join.right, **kwargs) + ", " + self.process(right, **kwargs) + def _get_nonansi_join_whereclause(self, froms): clauses = [] @@ -470,9 +475,9 @@ class OracleCompiler(compiler.SQLCompiler): if join.isouter: def visit_binary(binary): if binary.operator == sql_operators.eq: - if binary.left.table is join.right: + if join.right.is_derived_from(binary.left.table): binary.left = _OuterJoinColumn(binary.left) - elif binary.right.table is join.right: + elif join.right.is_derived_from(binary.right.table): binary.right = _OuterJoinColumn(binary.right) clauses.append(visitors.cloned_traverse(join.onclause, {}, {'binary': visit_binary})) @@ -482,6 +487,8 @@ class OracleCompiler(compiler.SQLCompiler): for j in join.left, join.right: if isinstance(j, expression.Join): visit_join(j) + elif isinstance(j, expression.FromGrouping): + visit_join(j.element) for f in froms: if isinstance(f, expression.Join): diff --git a/test/dialect/test_oracle.py b/test/dialect/test_oracle.py index d26ca6c03b..9a243f0f26 100644 --- a/test/dialect/test_oracle.py +++ b/test/dialect/test_oracle.py @@ -464,6 +464,39 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL): 'mytable.name) AS bar FROM mytable', dialect=oracle.dialect(use_ansi=False)) + def test_nonansi_nested_right_join(self): + a = table('a', column('a')) + b = table('b', column('b')) + c = table('c', column('c')) + + j = a.join(b.join(c, b.c.b == c.c.c), a.c.a == b.c.b) + + self.assert_compile( + select([j]), + "SELECT a.a, b.b, c.c FROM a, b, c " + "WHERE a.a = b.b AND b.b = c.c", + dialect=oracle.OracleDialect(use_ansi=False) + ) + + + j = a.outerjoin(b.join(c, b.c.b == c.c.c), a.c.a == b.c.b) + + self.assert_compile( + select([j]), + "SELECT a.a, b.b, c.c FROM a, b, c " + "WHERE a.a = b.b(+) AND b.b = c.c", + dialect=oracle.OracleDialect(use_ansi=False) + ) + + j = a.join(b.outerjoin(c, b.c.b == c.c.c), a.c.a == b.c.b) + + self.assert_compile( + select([j]), + "SELECT a.a, b.b, c.c FROM a, b, c " + "WHERE a.a = b.b AND b.b = c.c(+)", + dialect=oracle.OracleDialect(use_ansi=False) + ) + def test_alias_outer_join(self): address_types = table('address_types', column('id'), -- 2.47.3