From d4c7068440d6840393cd0369f9d3ff880a0c1b8a Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Wed, 4 Nov 2009 13:28:28 +0000 Subject: [PATCH] - Fixed bug where Query would crash if a join() with no clear "left" side were called when a non-mapped column entity appeared in the columns list. [ticket:1602] --- CHANGES | 4 ++++ lib/sqlalchemy/orm/query.py | 7 +++++-- test/orm/test_query.py | 11 +++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 1fda8a31d3..09375c42db 100644 --- a/CHANGES +++ b/CHANGES @@ -32,6 +32,10 @@ CHANGES - Fixed the call to get_committed_value() on CompositeProperty. [ticket:1504] + + - Fixed bug where Query would crash if a join() with no clear + "left" side were called when a non-mapped column entity + appeared in the columns list. [ticket:1602] - sql - Fixed the "numeric" paramstyle, which apparently is the diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 239f455622..a3c78940b4 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -2138,10 +2138,13 @@ class _ColumnEntity(_QueryEntity): self.froms.add(from_obj) def corresponds_to(self, entity): - if _is_aliased_class(entity): + if self.entity_zero is None: + return False + elif _is_aliased_class(entity): return entity is self.entity_zero else: - return not _is_aliased_class(self.entity_zero) and entity.base_mapper.common_parent(self.entity_zero) + return not _is_aliased_class(self.entity_zero) and \ + entity.base_mapper.common_parent(self.entity_zero) def _resolve_expr_against_query_aliases(self, query, expr, context): return query._adapt_clause(expr, False, True) diff --git a/test/orm/test_query.py b/test/orm/test_query.py index 1934a1330f..c7dce9332e 100644 --- a/test/orm/test_query.py +++ b/test/orm/test_query.py @@ -1148,6 +1148,17 @@ class JoinTest(QueryTest): [] ) + def test_join_nonmapped_column(self): + """test that the search for a 'left' doesn't trip on non-mapped cols""" + sess = create_session() + + # intentionally join() with a non-existent "left" side + q = sess.query(User.id, literal_column('foo')).join(Order.user) + eq_( + str(q.statement.apply_labels().compile(dialect=default.DefaultDialect())), + "SELECT users.id AS users_id, foo \nFROM orders JOIN users ON users.id = orders.user_id" + ) + def test_backwards_join(self): # a more controversial feature. join from # User->Address, but the onclause is Address.user. -- 2.47.3