--- /dev/null
+.. change::
+ :tags: bug, sql
+ :tickets: 13396
+
+ Fixed issue where :meth:`_sql.Select.get_final_froms` would emit a
+ deprecation warning when the statement made use of the PostgreSQL-specific
+ expression argument to :meth:`_sql.Select.distinct`; the same spurious
+ warning would be emitted when stringifying such a statement without
+ explicitly using a PostgreSQL dialect. The fix ensures that this 1.4-era
+ warning is suppressed under both 2.0 and 2.1.
+
+ Note that under SQLAlchemy 2.1, passing an expression to
+ :meth:`_sql.Select.distinct` is deprecated overall, and is replaced by a
+ new PostgreSQL-specific construct (see :ticket:`12342`).
from sqlalchemy.testing import AssertsCompiledSQL
from sqlalchemy.testing import eq_
from sqlalchemy.testing import eq_ignore_whitespace
+from sqlalchemy.testing import expect_deprecated
from sqlalchemy.testing import expect_raises
from sqlalchemy.testing import expect_raises_message
from sqlalchemy.testing import fixtures
"SELECT DISTINCT mytable.myid AS mytable_myid FROM mytable",
)
+ @testing.variation("case", ["stringify", "final_froms"])
+ def test_distinct_expr_no_dep_warning_str_compiler(self, case):
+ """test for #13396"""
+
+ t = Table("foo", MetaData(), Column("bar"))
+
+ with expect_deprecated(
+ "Passing expression to ``distinct`` to generate a DISTINCT ON"
+ ):
+ stmt = select(t).distinct(t.c.bar)
+
+ if case.stringify:
+ eq_(str(stmt), "SELECT DISTINCT foo.bar \nFROM foo")
+ elif case.final_froms:
+ eq_(stmt.get_final_froms(), [t])
+ else:
+ case.fail()
+
@testing.emits_warning("Column-expression-level unary distinct")
def test_distinct_function_6008(self):
# the bug fixed here as part of #6008 is the same bug that's
"DISTINCT ON is currently supported only by the PostgreSQL "
"dialect",
):
- select("*").distinct(table1.c.myid).compile()
+ self.assert_compile(
+ select("*").distinct(table1.c.myid), "SELECT DISTINCT *"
+ )
def test_where_empty(self):
self.assert_compile(