diff options
author | Denis Kataev <denis.a.kataev+git@gmail.com> | 2019-06-28 09:57:47 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-06-28 11:28:20 -0400 |
commit | a02ed10d5f6aa0e30970305172f51b69e0c49165 (patch) | |
tree | 5ff28ffafdf22c1a53ac31d1c8772a1aba033129 | |
parent | 502cd9240e639bd9334ac83111d22500506ca773 (diff) | |
download | sqlalchemy-a02ed10d5f6aa0e30970305172f51b69e0c49165.tar.gz |
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: ac8870614947259320b5d000a59fadb8c2328a04
Change-Id: If9a30a4ca56c430ddd6fec29ad519556e9001c4b
-rw-r--r-- | doc/build/changelog/unreleased_13/4713.rst | 9 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/util.py | 5 | ||||
-rw-r--r-- | test/orm/test_joins.py | 53 |
3 files changed, 64 insertions, 3 deletions
diff --git a/doc/build/changelog/unreleased_13/4713.rst b/doc/build/changelog/unreleased_13/4713.rst new file mode 100644 index 000000000..1f6746b73 --- /dev/null +++ b/doc/build/changelog/unreleased_13/4713.rst @@ -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. diff --git a/lib/sqlalchemy/orm/util.py b/lib/sqlalchemy/orm/util.py index bfc2f71b3..80d4b26b2 100644 --- a/lib/sqlalchemy/orm/util.py +++ b/lib/sqlalchemy/orm/util.py @@ -980,7 +980,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) @@ -1090,10 +1089,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( diff --git a/test/orm/test_joins.py b/test/orm/test_joins.py index ebef64d27..66b69f6ac 100644 --- a/test/orm/test_joins.py +++ b/test/orm/test_joins.py @@ -1161,6 +1161,59 @@ class JoinTest(QueryTest, AssertsCompiledSQL): ) 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 " "ON users_1.id = orders_1.user_id", |