From 4475506371342b6e61d8dc236ec1ba9d7877e9e5 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 22 Mar 2010 13:16:21 -0400 Subject: [PATCH] - Fixed bug in Query whereby calling q.join(prop).from_self(...). join(prop) would fail to render the second join outside the subquery, when joining on the same criterion as was on the inside. --- CHANGES | 9 +++++++++ lib/sqlalchemy/orm/query.py | 8 +++++--- test/orm/test_query.py | 19 +++++++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 5453f6e510..baa8e03188 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,15 @@ CHANGES ======= +0.6beta3 +======== + +- orm + - Fixed bug in Query whereby calling q.join(prop).from_self(...). + join(prop) would fail to render the second join outside the + subquery, when joining on the same criterion as was on the + inside. + 0.6beta2 ======== diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 8d3d7fbb36..7ae1194c1f 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -627,9 +627,11 @@ class Query(object): @_generative() def _from_selectable(self, fromclause): - self._statement = self._criterion = None - self._order_by = self._group_by = self._distinct = False - self._limit = self._offset = None + for attr in ('_statement', '_criterion', '_order_by', '_group_by', + '_limit', '_offset', '_joinpath', '_joinpoint', + '_distinct' + ): + self.__dict__.pop(attr, None) self._set_select_from(fromclause) old_entities = self._entities self._entities = [] diff --git a/test/orm/test_query.py b/test/orm/test_query.py index fa5211e3ef..cd76f53b0c 100644 --- a/test/orm/test_query.py +++ b/test/orm/test_query.py @@ -2275,6 +2275,25 @@ class JoinTest(QueryTest, AssertsCompiledSQL): [(u'jack',), (u'ed',), (u'ed',), (u'ed',), (u'fred',)] ) + def test_from_self_resets_joinpaths(self): + """test a join from from_self() doesn't confuse joins inside the subquery + with the outside. + """ + sess = create_session() + + self.assert_compile( + sess.query(Item).join(Item.keywords).from_self(Keyword).join(Item.keywords), + "SELECT keywords.id AS keywords_id, keywords.name AS keywords_name FROM " + "(SELECT items.id AS items_id, items.description AS items_description " + "FROM items JOIN item_keywords AS item_keywords_1 ON items.id = " + "item_keywords_1.item_id JOIN keywords ON keywords.id = item_keywords_1.keyword_id) " + "AS anon_1 JOIN item_keywords AS item_keywords_2 ON " + "anon_1.items_id = item_keywords_2.item_id " + "JOIN keywords ON " + "keywords.id = item_keywords_2.keyword_id", + use_default_dialect=True + ) + class MultiplePathTest(_base.MappedTest, AssertsCompiledSQL): @classmethod -- 2.47.3