summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2006-06-28 23:01:04 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2006-06-28 23:01:04 +0000
commit2fb9221b797e5a29e34096c09d97615d859e95d1 (patch)
tree965d4eeb9ac74a6d83fa4867cf0c0b3496a7c35c
parent5c0e32bf33a5db32c1beabc0fadb4ddd1fbd24be (diff)
downloadsqlalchemy-2fb9221b797e5a29e34096c09d97615d859e95d1.tar.gz
fixed endless loop bug in select_by(), if the traversal hit
two mappers that referenced each other
-rw-r--r--CHANGES4
-rw-r--r--lib/sqlalchemy/orm/query.py4
-rw-r--r--test/orm/mapper.py9
3 files changed, 17 insertions, 0 deletions
diff --git a/CHANGES b/CHANGES
index 05e0d7f0d..9de4b105b 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+0.2.5
+- fixed endless loop bug in select_by(), if the traversal hit
+two mappers that referenced each other
+
0.2.4
- try/except when the mapper sets init.__name__ on a mapped class,
supports python 2.3
diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py
index dc910d164..d27e23d84 100644
--- a/lib/sqlalchemy/orm/query.py
+++ b/lib/sqlalchemy/orm/query.py
@@ -115,7 +115,11 @@ class Query(object):
def _locate_prop(self, key):
import properties
keys = []
+ seen = util.Set()
def search_for_prop(mapper):
+ if mapper in seen:
+ return None
+ seen.add(mapper)
if mapper.props.has_key(key):
prop = mapper.props[key]
if isinstance(prop, properties.PropertyLoader):
diff --git a/test/orm/mapper.py b/test/orm/mapper.py
index e1cdb5177..146099815 100644
--- a/test/orm/mapper.py
+++ b/test/orm/mapper.py
@@ -247,6 +247,15 @@ class MapperTest(MapperSuperTest):
l = create_session().query(User).select(users.c.user_name.endswith('ed'))
self.assert_result(l, User, *user_result[1:3])
+ def testrecursiveselectby(self):
+ """test that no endless loop occurs when traversing for select_by"""
+ m = mapper(User, users, properties={
+ 'orders':relation(mapper(Order, orders), backref='user'),
+ 'addresses':relation(mapper(Address, addresses), backref='user'),
+ })
+ q = create_session().query(m)
+ q.select_by(email_address='foo')
+
def testjoinvia(self):
m = mapper(User, users, properties={
'orders':relation(mapper(Order, orders, properties={