]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed labeling bug in Query whereby the NamedTuple
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 14 Oct 2010 16:04:51 +0000 (12:04 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 14 Oct 2010 16:04:51 +0000 (12:04 -0400)
would mis-apply labels if any of the column
expressions were un-labeled.

CHANGES
lib/sqlalchemy/orm/query.py
lib/sqlalchemy/util.py
test/orm/test_query.py

diff --git a/CHANGES b/CHANGES
index 0416bca24c1d88ef2067fae4a80d7d2f62d8bb17..788aa12c9f2e363b9b8ec26f4459c78e0856fbd6 100644 (file)
--- 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]
index 605f391aae0b65f35cdec067f49ac565e4b93733..17603e04a435e695eee14a9de42c01c2fd2b8f7e 100644 (file)
@@ -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 = {}
index 76aaed34d923152c0cc2eb70dfd9e06b0f977c6f..21026d53ca267dfc5c4f6aafa1886db70529f56f 100644 (file)
@@ -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):
index 91c09be63f13e469c097a5b6387d026dba7be0da..a812035ebf16765e55c3e041c70246302b5ead68 100644 (file)
@@ -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))