mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-05-28 11:35:19 -04:00
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:ac88706149Change-Id: If9a30a4ca56c430ddd6fec29ad519556e9001c4b (cherry picked from commita02ed10d5f)
This commit is contained in:
+9
@@ -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.
|
||||
@@ -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(
|
||||
|
||||
@@ -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 "
|
||||
|
||||
Reference in New Issue
Block a user