From: Denis Kataev Date: Fri, 28 Jun 2019 13:57:47 +0000 (-0400) Subject: Test for _ORMJoin and fix issue X-Git-Tag: rel_1_3_6~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dadbc89b68ac3c502ee93da0e1fb452f76e2b876;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git 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 (cherry picked from commit a02ed10d5f6aa0e30970305172f51b69e0c49165) --- diff --git a/doc/build/changelog/unreleased_13/4713.rst b/doc/build/changelog/unreleased_13/4713.rst new file mode 100644 index 0000000000..1f6746b730 --- /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 30fc48cd35..a8af25c3fc 100644 --- a/lib/sqlalchemy/orm/util.py +++ b/lib/sqlalchemy/orm/util.py @@ -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( diff --git a/test/orm/test_joins.py b/test/orm/test_joins.py index ebef64d277..66b69f6acc 100644 --- a/test/orm/test_joins.py +++ b/test/orm/test_joins.py @@ -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 "