From b47983f8ecdc022c42d2c3b624894e58b4f18538 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Thu, 14 Oct 2010 12:04:51 -0400 Subject: [PATCH] - Fixed labeling bug in Query whereby the NamedTuple would mis-apply labels if any of the column expressions were un-labeled. --- CHANGES | 4 ++++ lib/sqlalchemy/orm/query.py | 6 ++---- lib/sqlalchemy/util.py | 2 +- test/orm/test_query.py | 16 +++++++++++----- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index 0416bca24c..788aa12c9f 100644 --- a/CHANGES +++ b/CHANGES @@ -16,6 +16,10 @@ CHANGES passed an empty list to "include_properties" on mapper() [ticket:1918] + - Fixed labeling bug in Query whereby the NamedTuple + would mis-apply labels if any of the column + expressions were un-labeled. + - Patched a case where query.join() would adapt the right side to the right side of the left's join inappropriately [ticket:1925] diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 605f391aae..17603e04a4 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -1721,10 +1721,8 @@ class Query(object): query_entity.row_processor(self, context, custom_rows) for query_entity in self._entities ]) - - if not single_entity: - labels = [l for l in labels if l] - + + while True: context.progress = {} context.partials = {} diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py index 76aaed34d9..21026d53ca 100644 --- a/lib/sqlalchemy/util.py +++ b/lib/sqlalchemy/util.py @@ -745,7 +745,7 @@ class NamedTuple(tuple): return t def keys(self): - return self._labels + return [l for l in self._labels if l is not None] class OrderedProperties(object): diff --git a/test/orm/test_query.py b/test/orm/test_query.py index 91c09be63f..a812035ebf 100644 --- a/test/orm/test_query.py +++ b/test/orm/test_query.py @@ -2957,21 +2957,21 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL): if pickled is not False: row = util.pickle.loads(util.pickle.dumps(row, pickled)) - eq_(set(row.keys()), set(['User', 'Address'])) + eq_(row.keys(), ['User', 'Address']) eq_(row.User, row[0]) eq_(row.Address, row[1]) for row in sess.query(User.name, User.id.label('foobar')): if pickled is not False: row = util.pickle.loads(util.pickle.dumps(row, pickled)) - eq_(set(row.keys()), set(['name', 'foobar'])) + eq_(row.keys(), ['name', 'foobar']) eq_(row.name, row[0]) eq_(row.foobar, row[1]) for row in sess.query(User).values(User.name, User.id.label('foobar')): if pickled is not False: row = util.pickle.loads(util.pickle.dumps(row, pickled)) - eq_(set(row.keys()), set(['name', 'foobar'])) + eq_(row.keys(), ['name', 'foobar']) eq_(row.name, row[0]) eq_(row.foobar, row[1]) @@ -2979,17 +2979,23 @@ class MixedEntitiesTest(QueryTest, AssertsCompiledSQL): for row in sess.query(User, oalias).join(User.orders).all(): if pickled is not False: row = util.pickle.loads(util.pickle.dumps(row, pickled)) - eq_(set(row.keys()), set(['User'])) + eq_(row.keys(), ['User']) eq_(row.User, row[0]) oalias = aliased(Order, name='orders') for row in sess.query(User, oalias).join(User.orders).all(): if pickled is not False: row = util.pickle.loads(util.pickle.dumps(row, pickled)) - eq_(set(row.keys()), set(['User', 'orders'])) + eq_(row.keys(), ['User', 'orders']) eq_(row.User, row[0]) eq_(row.orders, row[1]) + # test here that first col is not labeled, only + # one name in keys, matches correctly + for row in sess.query(User.name + 'hoho', User.name): + eq_(row.keys(), ['name']) + eq_(row[0], row.name + 'hoho') + if pickled is not False: ret = sess.query(User, Address).join(User.addresses).all() util.pickle.loads(util.pickle.dumps(ret, pickled)) -- 2.47.3