]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
get nested joins to render on oracle 8
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 8 Jun 2013 22:54:14 +0000 (18:54 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 8 Jun 2013 22:54:14 +0000 (18:54 -0400)
lib/sqlalchemy/dialects/oracle/base.py
test/dialect/test_oracle.py

index 6b6c32ae0f16aa829e6291be3af5be1141cb56ef..a302bf40138e5ace3f22a77128a410b598819184 100644 (file)
@@ -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):
index d26ca6c03ba2e6ccc11cbc0a087b42edd5225e33..9a243f0f26757c05e80c25a1788bbcb6e1ca58dd 100644 (file)
@@ -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'),