summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Kataev <denis.a.kataev+git@gmail.com>2019-06-28 09:57:47 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2019-06-28 11:28:20 -0400
commita02ed10d5f6aa0e30970305172f51b69e0c49165 (patch)
tree5ff28ffafdf22c1a53ac31d1c8772a1aba033129
parent502cd9240e639bd9334ac83111d22500506ca773 (diff)
downloadsqlalchemy-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.rst9
-rw-r--r--lib/sqlalchemy/orm/util.py5
-rw-r--r--test/orm/test_joins.py53
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",