summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2020-07-21 12:36:20 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2020-07-21 12:36:20 -0400
commit30ec982ba697eb320d804164c6bc965ae239abe8 (patch)
tree5250f2b709e9771543e208ef759cc5671ee397a3
parent547e959157f841f4f6d1e405ceed14755fcbd0bd (diff)
downloadsqlalchemy-30ec982ba697eb320d804164c6bc965ae239abe8.tar.gz
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
-rw-r--r--doc/build/changelog/unreleased_13/5470.rst9
-rw-r--r--lib/sqlalchemy/sql/elements.py7
-rw-r--r--test/sql/test_text.py20
3 files changed, 36 insertions, 0 deletions
diff --git a/doc/build/changelog/unreleased_13/5470.rst b/doc/build/changelog/unreleased_13/5470.rst
new file mode 100644
index 000000000..ed7202df5
--- /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 c7e5aabcc..ca73a4392 100644
--- a/lib/sqlalchemy/sql/elements.py
+++ b/lib/sqlalchemy/sql/elements.py
@@ -3714,6 +3714,13 @@ class Grouping(GroupedElement, ColumnElement):
return getattr(self.element, "_label", None) or self.anon_label
@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 58de41709..1a7ee6f34 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
@@ -710,6 +711,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")