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 = []
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}))
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):
'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'),