]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- fixed potential generative bug when the same Query was
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 20 Feb 2008 17:09:25 +0000 (17:09 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 20 Feb 2008 17:09:25 +0000 (17:09 +0000)
used to generate multiple Query objects using join().

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

diff --git a/CHANGES b/CHANGES
index 53f4258e6b6bd0e3b7a75524fdd569728725be85..101b7e6e32f662d549c3dd9b23e2dc0987f4bf41 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -18,6 +18,8 @@ CHANGES
       Note that if you session.save()'ed the pending item 
       explicitly, the attribute/collection removal still knocks 
       it out.
+    - fixed potential generative bug when the same Query was
+      used to generate multiple Query objects using join().
       
 0.4.4
 ------
index 2bb87ea715a39028cf580ddf7f301ddd3ccf57eb..9c917ec2d5b56c5989ace3450365717e7d618e4a 100644 (file)
@@ -665,7 +665,14 @@ class Query(object):
         q._from_obj = clause
         q._joinpoint = mapper
         q._aliases = aliases
-
+        
+        q._alias_ids = {}
+        for k, v in self._alias_ids.items():
+            if isinstance(v, list):
+                q._alias_ids[k] = list(v)
+            else:
+                q._alias_ids[k] = v
+        
         if aliases:
             q._adapter = sql_util.ClauseAdapter(aliases.alias).copy_and_chain(q._adapter)
         else:
index d48abd5d2ef7e9767b49fda4908468ecb175055b..41ae4446143e0d77adfd7fcc8e534b05d5839778 100644 (file)
@@ -550,6 +550,20 @@ class JoinTest(QueryTest):
         result = create_session().query(User).outerjoin(['orders', 'items']).filter_by(id=3).outerjoin(['orders','address']).filter_by(id=1).all()
         assert [User(id=7, name='jack')] == result
 
+    def test_generative_join(self):
+        # test that alised_ids is copied
+        sess = create_session()
+        q = sess.query(User).add_entity(Address)
+        q1 = q.join('addresses', aliased=True)
+        q2 = q.join('addresses', aliased=True)
+        q3 = q2.join('addresses', aliased=True)
+        q4 = q2.join('addresses', aliased=True, id='someid')
+        q5 = q2.join('addresses', aliased=True, id='someid')
+        q6 = q5.join('addresses', aliased=True, id='someid')
+        assert q1._alias_ids[class_mapper(Address)] != q2._alias_ids[class_mapper(Address)]
+        assert q2._alias_ids[class_mapper(Address)] != q3._alias_ids[class_mapper(Address)]
+        assert q4._alias_ids['someid'] != q5._alias_ids['someid']
+        
     def test_reset_joinpoint(self):
         for aliased in (True, False):
             # load a user who has an order that contains item id 3 and address id 1 (order 3, owned by jack)
@@ -1012,7 +1026,7 @@ class SelectFromTest(QueryTest):
                 (User(name='ed',id=8), Address(user_id=8,email_address='ed@lala.com',id=4))
             ]
         )
-
+    
     def test_more_joins(self):
         mapper(User, users, properties={
             'orders':relation(Order, backref='user'), # o2m, m2o