summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2008-08-06 20:58:48 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2008-08-06 20:58:48 +0000
commit2829092cb8e08f0db4b454a11250eed3241d3792 (patch)
tree6b5c0abe52a3738d084a98ca472a0bffb22d3325 /test
parent665cd4d36acb7ecbb50c3ebfdf25535aa375cbb9 (diff)
downloadsqlalchemy-2829092cb8e08f0db4b454a11250eed3241d3792.tar.gz
- Improved the determination of the FROM clause
when placing SQL expressions in the query() list of entities. In particular scalar subqueries should not "leak" their inner FROM objects out into the enclosing query.
Diffstat (limited to 'test')
-rw-r--r--test/orm/inheritance/query.py2
-rw-r--r--test/orm/query.py30
2 files changed, 30 insertions, 2 deletions
diff --git a/test/orm/inheritance/query.py b/test/orm/inheritance/query.py
index 0ce3b4fb7..28659ba38 100644
--- a/test/orm/inheritance/query.py
+++ b/test/orm/inheritance/query.py
@@ -510,7 +510,6 @@ def make_test(select_type):
self.assertEquals(sess.query(Person).filter(Person.person_id==subq).one(), e1)
-
def test_mixed_entities(self):
sess = create_session()
@@ -537,7 +536,6 @@ def make_test(select_type):
[('pointy haired boss foo', ), ('dogbert foo',)]
)
-
row = sess.query(Engineer.name, Engineer.primary_language).filter(Engineer.name=='dilbert').first()
assert row.name == 'dilbert'
assert row.primary_language == 'java'
diff --git a/test/orm/query.py b/test/orm/query.py
index 30cb03ab8..d3e69573d 100644
--- a/test/orm/query.py
+++ b/test/orm/query.py
@@ -1207,6 +1207,36 @@ class MixedEntitiesTest(QueryTest):
q2 = q.select_from(sel).filter(users.c.id==8).filter(users.c.id>sel.c.id).values(users.c.name, sel.c.name, User.name)
self.assertEquals(list(q2), [(u'ed', u'jack', u'jack')])
+ def test_scalar_subquery(self):
+ """test that a subquery constructed from ORM attributes doesn't leak out
+ those entities to the outermost query.
+
+ """
+ sess = create_session()
+
+ subq = select([func.count()]).\
+ where(User.id==Address.user_id).\
+ correlate(users).\
+ label('count')
+
+ # we don't want Address to be outside of the subquery here
+ self.assertEquals(
+ list(sess.query(User, subq)[0:3]),
+ [(User(id=7,name=u'jack'), 1), (User(id=8,name=u'ed'), 3), (User(id=9,name=u'fred'), 1)]
+ )
+
+ # same thing without the correlate, as it should
+ # not be needed
+ subq = select([func.count()]).\
+ where(User.id==Address.user_id).\
+ label('count')
+
+ # we don't want Address to be outside of the subquery here
+ self.assertEquals(
+ list(sess.query(User, subq)[0:3]),
+ [(User(id=7,name=u'jack'), 1), (User(id=8,name=u'ed'), 3), (User(id=9,name=u'fred'), 1)]
+ )
+
def test_tuple_labeling(self):
sess = create_session()
for row in sess.query(User, Address).join(User.addresses).all():