diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-06-28 23:01:04 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2006-06-28 23:01:04 +0000 |
| commit | 2fb9221b797e5a29e34096c09d97615d859e95d1 (patch) | |
| tree | 965d4eeb9ac74a6d83fa4867cf0c0b3496a7c35c | |
| parent | 5c0e32bf33a5db32c1beabc0fadb4ddd1fbd24be (diff) | |
| download | sqlalchemy-2fb9221b797e5a29e34096c09d97615d859e95d1.tar.gz | |
fixed endless loop bug in select_by(), if the traversal hit
two mappers that referenced each other
| -rw-r--r-- | CHANGES | 4 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/query.py | 4 | ||||
| -rw-r--r-- | test/orm/mapper.py | 9 |
3 files changed, 17 insertions, 0 deletions
@@ -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={ |
