From: Mike Bayer Date: Wed, 28 Jun 2006 23:01:04 +0000 (+0000) Subject: fixed endless loop bug in select_by(), if the traversal hit X-Git-Tag: rel_0_2_5~15 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2fb9221b797e5a29e34096c09d97615d859e95d1;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git fixed endless loop bug in select_by(), if the traversal hit two mappers that referenced each other --- diff --git a/CHANGES b/CHANGES index 05e0d7f0de..9de4b105bb 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 dc910d1642..d27e23d846 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 e1cdb51779..1460998158 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={