]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
fixed endless loop bug in select_by(), if the traversal hit
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 28 Jun 2006 23:01:04 +0000 (23:01 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 28 Jun 2006 23:01:04 +0000 (23:01 +0000)
two mappers that referenced each other

CHANGES
lib/sqlalchemy/orm/query.py
test/orm/mapper.py

diff --git a/CHANGES b/CHANGES
index 05e0d7f0dec19327cf16432ee2415d9b345a9296..9de4b105bbef365f386b442b35e618cd46839939 100644 (file)
--- 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
index dc910d16426b8d66d0b4e26f446fbd05954baef6..d27e23d846988ad4ead995a4818014ffdf3a6882 100644 (file)
@@ -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):
index e1cdb517796e81021c327122fbba2aa93ce3a6f0..1460998158328d44f21f92cd5d342d6eff541bf6 100644 (file)
@@ -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={