]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fixed bug where sending a composite attribute into :meth:`.Query.order_by`
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 10 Jun 2013 17:50:06 +0000 (13:50 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 10 Jun 2013 17:51:18 +0000 (13:51 -0400)
would produce a parenthesized expression not accepted by some databases.
[ticket:2754]

Conflicts:
doc/build/changelog/changelog_09.rst

doc/build/changelog/changelog_08.rst
lib/sqlalchemy/orm/descriptor_props.py
test/orm/test_composites.py

index bedb5da024f3a7bb689f1c3b84cb7e54b0d65cf1..ffd5bd4e4d09905b906fbbf09da94a2e0f575603 100644 (file)
@@ -6,6 +6,13 @@
 .. changelog::
     :version: 0.8.2
 
+    .. change::
+        :tags: bug, orm
+        :tickets: 2754
+
+        Fixed bug where sending a composite attribute into :meth:`.Query.order_by`
+        would produce a parenthesized expression not accepted by some databases.
+
     .. change::
         :tags: bug, orm
         :tickets: 2755
index dc2d770d74eed492d7688ecff7ebefe96b667ea0..e4c0d1525a570b56ed2bb33de7d19b93dca07e0d 100644 (file)
@@ -320,7 +320,7 @@ class CompositeProperty(DescriptorProperty):
         """
 
         def __clause_element__(self):
-            return expression.ClauseList(*self._comparable_elements)
+            return expression.ClauseList(group=False, *self._comparable_elements)
 
         __hash__ = None
 
index ed80d6105e8f43ca7063c7130ecb08b937ffb3ec..9b582ce17af8fe08c4a758a590e1e5f1913c26d6 100644 (file)
@@ -712,7 +712,9 @@ class ConfigurationTest(fixtures.MappedTest):
         })
         self._test_roundtrip()
 
-class ComparatorTest(fixtures.MappedTest):
+class ComparatorTest(fixtures.MappedTest, testing.AssertsCompiledSQL):
+    __dialect__ = 'default'
+
     @classmethod
     def define_tables(cls, metadata):
         Table('edge', metadata,
@@ -836,4 +838,28 @@ class ComparatorTest(fixtures.MappedTest):
 
         assert edge_1 in near_edges and edge_2 in near_edges
 
+    def test_order_by(self):
+        self._fixture(False)
+        Edge = self.classes.Edge
+        s = Session()
+        self.assert_compile(
+            s.query(Edge).order_by(Edge.start, Edge.end),
+            "SELECT edge.id AS edge_id, edge.x1 AS edge_x1, "
+            "edge.y1 AS edge_y1, edge.x2 AS edge_x2, edge.y2 AS edge_y2 "
+            "FROM edge ORDER BY edge.x1, edge.y1, edge.x2, edge.y2"
+        )
+
+    def test_order_by_aliased(self):
+        self._fixture(False)
+        Edge = self.classes.Edge
+        s = Session()
+        ea = aliased(Edge)
+        self.assert_compile(
+            s.query(ea).order_by(ea.start, ea.end),
+            "SELECT edge_1.id AS edge_1_id, edge_1.x1 AS edge_1_x1, "
+            "edge_1.y1 AS edge_1_y1, edge_1.x2 AS edge_1_x2, "
+            "edge_1.y2 AS edge_1_y2 "
+            "FROM edge AS edge_1 ORDER BY edge_1.x1, edge_1.y1, "
+            "edge_1.x2, edge_1.y2"
+        )