From: Mike Bayer Date: Tue, 21 Jul 2020 16:36:20 +0000 (-0400) Subject: Allow Grouping to pass along proxy_set of element X-Git-Tag: rel_1_3_19~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d3ba45c00f83f7d57be5fb5caa7fb27f61624e28;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Allow Grouping to pass along proxy_set of element Repaired an issue where the "ORDER BY" clause rendering a label name rather than a complete expression, which is particularly important for SQL Server, would fail to occur if the expression were enclosed in a parenthesized grouping in some cases. This case has been added to test support. Fixes: #5470 Change-Id: Ie0e27c39e5d53be78b32f7810f93d2d0536375e7 (cherry picked from commit 30ec982ba697eb320d804164c6bc965ae239abe8) --- diff --git a/doc/build/changelog/unreleased_13/5470.rst b/doc/build/changelog/unreleased_13/5470.rst new file mode 100644 index 0000000000..ed7202df54 --- /dev/null +++ b/doc/build/changelog/unreleased_13/5470.rst @@ -0,0 +1,9 @@ +.. change:: + :tags: bug, sql + :tickets: 5470 + + Repaired an issue where the "ORDER BY" clause rendering a label name rather + than a complete expression, which is particularly important for SQL Server, + would fail to occur if the expression were enclosed in a parenthesized + grouping in some cases. This case has been added to test support. + diff --git a/lib/sqlalchemy/sql/elements.py b/lib/sqlalchemy/sql/elements.py index 91b5f9fe61..64824df42d 100644 --- a/lib/sqlalchemy/sql/elements.py +++ b/lib/sqlalchemy/sql/elements.py @@ -3387,6 +3387,13 @@ class Grouping(ColumnElement): def get_children(self, **kwargs): return (self.element,) + @property + def _proxies(self): + if isinstance(self.element, ColumnElement): + return [self.element] + else: + return [] + @property def _from_objects(self): return self.element._from_objects diff --git a/test/sql/test_text.py b/test/sql/test_text.py index b960fa47a8..99e20744f6 100644 --- a/test/sql/test_text.py +++ b/test/sql/test_text.py @@ -15,6 +15,7 @@ from sqlalchemy import MetaData from sqlalchemy import select from sqlalchemy import String from sqlalchemy import Table +from sqlalchemy import testing from sqlalchemy import text from sqlalchemy import union from sqlalchemy import util @@ -662,6 +663,25 @@ class OrderByLabelResolutionTest(fixtures.TestBase, AssertsCompiledSQL): "FROM mytable AS mytable_1 ORDER BY mytable_1.name", ) + @testing.combinations( + ((column("q") + 5).label("a"), "a", ()), + (column("q").op("+")(5).label("a"), "a", ()), + ((column("q") + 5).label("a"), "a DESC", (desc,)), + (column("q").op("+")(5).label("a"), "a DESC", (desc,)), + ) + def test_order_by_expr(self, case, expected, modifiers): + + order_by = case + for mod in modifiers: + order_by = mod(order_by) + + stmt = select([case]).order_by(order_by) + + col_expr = str(case) + self.assert_compile( + stmt, "SELECT %s AS a ORDER BY %s" % (col_expr, expected) + ) + def test_order_by_named_label_from_anon_label(self): s1 = select([table1.c.myid.label(None).label("foo"), table1.c.name]) stmt = s1.order_by("foo")