]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
tweak for correlated subqueries here, seems to work for test_eager_relations:Correlat...
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 10 Feb 2012 22:59:06 +0000 (17:59 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 10 Feb 2012 22:59:06 +0000 (17:59 -0500)
lib/sqlalchemy/sql/util.py
test/sql/test_generative.py

index 9a45a577750e06bf6c661e3559d26c26f92c468a..511a5b0c2ef9236b64495dc63aaf2fe34114b1ab 100644 (file)
@@ -100,7 +100,12 @@ def visit_binary_product(fn, expr):
     """
     stack = []
     def visit(element):
-        if element.__visit_name__ == 'binary' and \
+        if isinstance(element, (expression.FromClause, 
+                                expression._ScalarSelect)):
+            # we dont want to dig into correlated subqueries,
+            # those are just column elements by themselves
+            yield element
+        elif element.__visit_name__ == 'binary' and \
             operators.is_comparison(element.operator):
             stack.insert(0, element)
             for l in visit(element.left):
index d4f324dd7eea9f1ed84d871e4f1c6b17a985a478..c2e437e8781a6bf0cb13ca47ff30e0492b0f2ad2 100644 (file)
@@ -250,6 +250,18 @@ class BinaryEndpointTraversalTest(fixtures.TestBase):
             ]
         )
 
+    def test_subquery(self):
+        a, b, c = column("a"), column("b"), column("c")
+        subq = select([c]).where(c == a).as_scalar()
+        expr = and_(a == b, b == subq)
+        self._assert_traversal(
+            expr,
+            [
+                (operators.eq, a, b),
+                (operators.eq, b, subq),
+            ]
+        )
+
 class ClauseTest(fixtures.TestBase, AssertsCompiledSQL):
     """test copy-in-place behavior of various ClauseElements."""