From: Mike Bayer Date: Thu, 14 Oct 2010 16:04:51 +0000 (-0400) Subject: - Fixed labeling bug in Query whereby the NamedTuple X-Git-Tag: rel_0_6_5~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b47983f8ecdc022c42d2c3b624894e58b4f18538;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Fixed labeling bug in Query whereby the NamedTuple would mis-apply labels if any of the column expressions were un-labeled. --- 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))