]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed regression from as yet unreleased 0.9.10 where the new addition
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 30 Apr 2015 16:53:27 +0000 (12:53 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 30 Apr 2015 16:53:27 +0000 (12:53 -0400)
of ``entity`` to the :attr:`.Query.column_descriptions` accessor
would fail if the target entity was produced from a core selectable
such as a :class:`.Table` or :class:`.CTE` object.
fixes #3403  references #3320

doc/build/changelog/changelog_09.rst
doc/build/changelog/changelog_10.rst
lib/sqlalchemy/orm/query.py
test/orm/test_query.py

index 2f2f5926356c6ece45499f1901d5114e42a3b1cd..778881b909bba789a8709cf5a084e9b335d655a4 100644 (file)
         Compared to the existing entry for ``"type"``, it will always be
         a mapped entity, even if extracted from a column expression, or
         None if the given expression is a pure core expression.
+        See also :ticket:`3403` which repaired a regression in this feature
+        which was unreleased in 0.9.10 but was released in the 1.0 version.
+
 
 .. changelog::
     :version: 0.9.9
index 5e32c667fb3ba753af5a11fd994a07460812fb8d..43689160177d9cffbcfded1d798d156d154e7a97 100644 (file)
 .. changelog::
     :version: 1.0.3
 
+    .. change::
+        :tags: bug, orm
+        :tickets: 3403, 3320
+
+        Fixed regression from as yet unreleased 0.9.10 where the new addition
+        of ``entity`` to the :attr:`.Query.column_descriptions` accessor
+        would fail if the target entity was produced from a core selectable
+        such as a :class:`.Table` or :class:`.CTE` object.
+
     .. change::
         :tags: feature, sql
 
index c3638f66d46e7e160cf95e161a6299f5362e580a..f4b04b078ea6d8b7b7f550f5106f4a08ec87b35a 100644 (file)
@@ -2577,6 +2577,7 @@ class Query(object):
                 'expr': ent.expr,
                 'entity':
                     ent.entity_zero.entity if ent.entity_zero is not None
+                    and not inspect(ent.entity_zero).is_selectable
                     else None
             }
             for ent in self._entities
@@ -3620,7 +3621,6 @@ class _ColumnEntity(_QueryEntity):
                 if 'parententity' in elem._annotations
                 and actual_froms.intersection(elem._from_objects)
             ])
-
             if self.entities:
                 self.entity_zero = self.entities[0]
             elif self.namespace is not None:
index 850014ab44e06359264a3058f3a7a47097eea1f5..cb428469e7ca2e1f01cd324b64872bdb6bee8439 100644 (file)
@@ -73,6 +73,7 @@ class RowTupleTest(QueryTest):
         fn = func.count(User.id)
         name_label = User.name.label('uname')
         bundle = Bundle('b1', User.id, User.name)
+        cte = sess.query(User.id).cte()
         for q, asserted in [
             (
                 sess.query(User),
@@ -122,6 +123,26 @@ class RowTupleTest(QueryTest):
                         'expr': fn, 'entity': User},
                 ]
             ),
+            (
+                sess.query(cte),
+                [
+                {
+                    'aliased': False,
+                    'expr': cte.c.id, 'type': cte.c.id.type,
+                    'name': 'id', 'entity': None
+                }]
+            ),
+            (
+                sess.query(users),
+                [
+                    {'aliased': False,
+                     'expr': users.c.id, 'type': users.c.id.type,
+                     'name': 'id', 'entity': None},
+                    {'aliased': False,
+                     'expr': users.c.name, 'type': users.c.name.type,
+                     'name': 'name', 'entity': None}
+                ]
+            ),
             (
                 sess.query(users.c.name),
                 [{