Test for _ORMJoin and fix issue

Fixed an issue where the :meth:`.orm._ORMJoin.join` method, which is a
not-internally-used ORM-level method that exposes what is normally an
internal process of :meth:`.Query.join`, did not propagate the ``full`` and
``outerjoin`` keyword arguments correctly.  Pull request courtesy Denis
Kataev.

Fixes: #4713
Closes: #4744
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/4744
Pull-request-sha: ac88706149

Change-Id: If9a30a4ca56c430ddd6fec29ad519556e9001c4b
(cherry picked from commit a02ed10d5f)
This commit is contained in:
Denis Kataev
2019-06-28 09:57:47 -04:00
committed by Mike Bayer
parent ce9de9fff6
commit dadbc89b68
3 changed files with 64 additions and 3 deletions
+9
View File
@@ -0,0 +1,9 @@
.. change::
:tags: bug, orm
:tickets: 4713
Fixed an issue where the :meth:`.orm._ORMJoin.join` method, which is a
not-internally-used ORM-level method that exposes what is normally an
internal process of :meth:`.Query.join`, did not propagate the ``full`` and
``outerjoin`` keyword arguments correctly. Pull request courtesy Denis
Kataev.
+2 -3
View File
@@ -976,7 +976,6 @@ class _ORMJoin(expression.Join):
_left_memo=None,
_right_memo=None,
):
left_info = inspection.inspect(left)
left_orm_info = getattr(left, "_joined_from_info", left_info)
@@ -1086,10 +1085,10 @@ class _ORMJoin(expression.Join):
full=False,
join_to_left=None,
):
return _ORMJoin(self, right, onclause, full, isouter)
return _ORMJoin(self, right, onclause, full=full, isouter=isouter)
def outerjoin(self, right, onclause=None, full=False, join_to_left=None):
return _ORMJoin(self, right, onclause, True, full=full)
return _ORMJoin(self, right, onclause, isouter=True, full=full)
def join(
+53
View File
@@ -1160,6 +1160,59 @@ class JoinTest(QueryTest, AssertsCompiledSQL):
use_default_dialect=True,
)
self.assert_compile(
join(User, oalias2, User.id == oalias2.user_id, full=True),
"users FULL OUTER JOIN orders AS orders_1 "
"ON users.id = orders_1.user_id",
use_default_dialect=True,
)
self.assert_compile(
join(User, oalias2, User.id == oalias2.user_id, isouter=True),
"users LEFT OUTER JOIN orders AS orders_1 "
"ON users.id = orders_1.user_id",
use_default_dialect=True,
)
self.assert_compile(
join(User, oalias2, User.id == oalias2.user_id,
isouter=True, full=True),
"users FULL OUTER JOIN orders AS orders_1 "
"ON users.id = orders_1.user_id",
use_default_dialect=True,
)
self.assert_compile(
join(User, oalias1).join(oalias2),
"users JOIN orders AS orders_1 ON users.id = orders_1.user_id "
"JOIN orders AS orders_2 ON users.id = orders_2.user_id",
use_default_dialect=True,
)
self.assert_compile(
join(User, oalias1).join(oalias2, isouter=True),
"users JOIN orders AS orders_1 ON users.id = orders_1.user_id "
"LEFT OUTER JOIN orders AS orders_2 "
"ON users.id = orders_2.user_id",
use_default_dialect=True,
)
self.assert_compile(
join(User, oalias1).join(oalias2, full=True),
"users JOIN orders AS orders_1 ON users.id = orders_1.user_id "
"FULL OUTER JOIN orders AS orders_2 "
"ON users.id = orders_2.user_id",
use_default_dialect=True,
)
self.assert_compile(
join(User, oalias1).join(oalias2, full=True, isouter=True),
"users JOIN orders AS orders_1 ON users.id = orders_1.user_id "
"FULL OUTER JOIN orders AS orders_2 "
"ON users.id = orders_2.user_id",
use_default_dialect=True,
)
self.assert_compile(
join(ualias, oalias1, ualias.orders),
"users AS users_1 JOIN orders AS orders_1 "