From: Mike Bayer Date: Wed, 20 Feb 2008 17:09:25 +0000 (+0000) Subject: - fixed potential generative bug when the same Query was X-Git-Tag: rel_0_4_4~65 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f827e3c0b7d7493ec94f8f3c0ee69c78c3441bb8;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - fixed potential generative bug when the same Query was used to generate multiple Query objects using join(). --- diff --git a/CHANGES b/CHANGES index 53f4258e6b..101b7e6e32 100644 --- 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 ------ diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 2bb87ea715..9c917ec2d5 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -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: diff --git a/test/orm/query.py b/test/orm/query.py index d48abd5d2e..41ae444614 100644 --- a/test/orm/query.py +++ b/test/orm/query.py @@ -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