diff --git a/django/db/backends/mysql/features.py b/django/db/backends/mysql/features.py index 357e431524e..834ea4f88f2 100644 --- a/django/db/backends/mysql/features.py +++ b/django/db/backends/mysql/features.py @@ -56,6 +56,17 @@ class DatabaseFeatures(BaseDatabaseFeatures): else: return (5, 7) + @cached_property + def bare_select_suffix(self): + if ( + self.connection.mysql_is_mariadb and self.connection.mysql_version < (10, 4) + ) or ( + not self.connection.mysql_is_mariadb + and self.connection.mysql_version < (8,) + ): + return " FROM DUAL" + return "" + @cached_property def test_collations(self): charset = "utf8" diff --git a/tests/backends/tests.py b/tests/backends/tests.py index 28e00a04ca4..85b0e55cb01 100644 --- a/tests/backends/tests.py +++ b/tests/backends/tests.py @@ -548,6 +548,12 @@ class BackendTestCase(TransactionTestCase): ) self.assertEqual(tuple(kwargs["extra"].values()), params[1:]) + def test_queries_bare_where(self): + sql = f"SELECT 1{connection.features.bare_select_suffix} WHERE 1=1" + with connection.cursor() as cursor: + cursor.execute(sql) + self.assertEqual(cursor.fetchone(), (1,)) + def test_timezone_none_use_tz_false(self): connection.ensure_connection() with self.settings(TIME_ZONE=None, USE_TZ=False):