]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Test for _ORMJoin and fix issue
authorDenis Kataev <denis.a.kataev+git@gmail.com>
Fri, 28 Jun 2019 13:57:47 +0000 (09:57 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 28 Jun 2019 15:28:50 +0000 (11:28 -0400)
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)

doc/build/changelog/unreleased_13/4713.rst [new file with mode: 0644]
lib/sqlalchemy/orm/util.py
test/orm/test_joins.py

diff --git a/doc/build/changelog/unreleased_13/4713.rst b/doc/build/changelog/unreleased_13/4713.rst
new file mode 100644 (file)
index 0000000..1f6746b
--- /dev/null
@@ -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.
index 30fc48cd3586f789ff88534e6e5787ea883e90f5..a8af25c3fc3c975a89cd3c892caf091d0917ead9 100644 (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, fullisouter)
+        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(
index ebef64d2770546aebcbf2eacd9a637b7a0c7435c..66b69f6acc68f94aefa4c3a16822c13299e86301 100644 (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 "