From 798c6f36ffeb87b396a79b5c61c67af7c65bed1d Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Fri, 6 Dec 2019 11:38:55 -0500 Subject: [PATCH] Use label reference coercion for select() distinct keyword argument Fixed bug where "distinct" keyword passed to :func:`.select` would not treat a string value as a "label reference" in the same way that the :meth:`.select.distinct` does; it would instead raise unconditionally. This keyword argument and the others passed to :func:`.select` will ultimately be deprecated for SQLAlchemy 2.0. Fixes: #5028 Change-Id: Id36cfe477ed836c3248824ce1b81d0016dbe99f4 (cherry picked from commit 926952c4afe0b2e16c4a74f05958bded7b932760) --- doc/build/changelog/unreleased_13/5028.rst | 10 ++++++++++ lib/sqlalchemy/sql/selectable.py | 3 ++- test/sql/test_text.py | 9 +++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 doc/build/changelog/unreleased_13/5028.rst diff --git a/doc/build/changelog/unreleased_13/5028.rst b/doc/build/changelog/unreleased_13/5028.rst new file mode 100644 index 0000000000..be2a354c25 --- /dev/null +++ b/doc/build/changelog/unreleased_13/5028.rst @@ -0,0 +1,10 @@ +.. change:: + :tags: bug, sql + :tickets: 5028 + + Fixed bug where "distinct" keyword passed to :func:`.select` would not + treat a string value as a "label reference" in the same way that the + :meth:`.select.distinct` does; it would instead raise unconditionally. This + keyword argument and the others passed to :func:`.select` will ultimately + be deprecated for SQLAlchemy 2.0. + diff --git a/lib/sqlalchemy/sql/selectable.py b/lib/sqlalchemy/sql/selectable.py index c418d1542a..c727b03b4e 100644 --- a/lib/sqlalchemy/sql/selectable.py +++ b/lib/sqlalchemy/sql/selectable.py @@ -2957,7 +2957,8 @@ class Select(HasPrefixes, HasSuffixes, GenerativeSelect): self._distinct = True else: self._distinct = [ - _literal_as_text(e) for e in util.to_list(distinct) + _literal_as_label_reference(e) + for e in util.to_list(distinct) ] if from_obj is not None: diff --git a/test/sql/test_text.py b/test/sql/test_text.py index 46493cdc1b..b960fa47a8 100644 --- a/test/sql/test_text.py +++ b/test/sql/test_text.py @@ -698,6 +698,15 @@ class OrderByLabelResolutionTest(fixtures.TestBase, AssertsCompiledSQL): dialect="postgresql", ) + def test_distinct_label_keyword(self): + + stmt = select([table1.c.myid.label("foo")], distinct="foo") + self.assert_compile( + stmt, + "SELECT DISTINCT ON (foo) mytable.myid AS foo FROM mytable", + dialect="postgresql", + ) + def test_unresolvable_distinct_label(self): from sqlalchemy.dialects import postgresql -- 2.47.2