summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathaniel Conroy <nathanielaconroy@gmail.com>2023-11-26 18:36:56 -0500
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-11-27 10:35:56 +0100
commit450d518d2fe28b33a12805fcaaad53f8244bd5df (patch)
tree9872d0a394b89e8c706a912020785b88a0dae1b9
parentbac9e94ace79d79c55e94b8aba05db0d148430e2 (diff)
[4.2.x] Fixed #34992 -- Fixed DatabaseFeatures.allows_group_by_selected_pks on MariaDB with ONLY_FULL_GROUP_BY sql mode.
Regression in 041551d716b69ee7c81199eee86a2d10a72e15ab. Backport of 0257426fe1fe9d146fd5813f09d909917ff59360 from main.
-rw-r--r--django/db/backends/mysql/features.py7
-rw-r--r--docs/releases/4.2.8.txt4
-rw-r--r--tests/backends/mysql/test_features.py18
3 files changed, 28 insertions, 1 deletions
diff --git a/django/db/backends/mysql/features.py b/django/db/backends/mysql/features.py
index 2cda788c2c..ff71eb77bc 100644
--- a/django/db/backends/mysql/features.py
+++ b/django/db/backends/mysql/features.py
@@ -6,7 +6,6 @@ from django.utils.functional import cached_property
class DatabaseFeatures(BaseDatabaseFeatures):
empty_fetchmany_value = ()
- allows_group_by_selected_pks = True
related_fields_match_type = True
# MySQL doesn't support sliced subqueries with IN/ALL/ANY/SOME.
allow_sliced_subqueries_with_in = False
@@ -348,3 +347,9 @@ class DatabaseFeatures(BaseDatabaseFeatures):
if self.connection.mysql_is_mariadb:
return self.connection.mysql_version >= (10, 5, 2)
return True
+
+ @cached_property
+ def allows_group_by_selected_pks(self):
+ if self.connection.mysql_is_mariadb:
+ return "ONLY_FULL_GROUP_BY" not in self.connection.sql_mode
+ return True
diff --git a/docs/releases/4.2.8.txt b/docs/releases/4.2.8.txt
index 5b0b558c35..44d80060b5 100644
--- a/docs/releases/4.2.8.txt
+++ b/docs/releases/4.2.8.txt
@@ -27,3 +27,7 @@ Bugfixes
* Fixed a regression in Django 4.2 where checkboxes in the admin would be
centered on narrower screen widths (:ticket:`34994`).
+
+* Fixed a regression in Django 4.2 that caused a crash of querysets with
+ aggregations on MariaDB when the ``ONLY_FULL_GROUP_BY`` SQL mode was enabled
+ (:ticket:`34992`).
diff --git a/tests/backends/mysql/test_features.py b/tests/backends/mysql/test_features.py
index 88e267f048..e99d7f9985 100644
--- a/tests/backends/mysql/test_features.py
+++ b/tests/backends/mysql/test_features.py
@@ -42,3 +42,21 @@ class TestFeatures(TestCase):
_connection.sql_mode = {"NO_AUTO_VALUE_ON_ZERO"}
database_features = DatabaseFeatures(_connection)
self.assertIs(database_features.allows_auto_pk_0, True)
+
+ def test_allows_group_by_selected_pks(self):
+ with mock.MagicMock() as _connection:
+ _connection.mysql_is_mariadb = False
+ database_features = DatabaseFeatures(_connection)
+ self.assertIs(database_features.allows_group_by_selected_pks, True)
+
+ with mock.MagicMock() as _connection:
+ _connection.mysql_is_mariadb = False
+ _connection.sql_mode = {}
+ database_features = DatabaseFeatures(_connection)
+ self.assertIs(database_features.allows_group_by_selected_pks, True)
+
+ with mock.MagicMock() as _connection:
+ _connection.mysql_is_mariadb = True
+ _connection.sql_mode = {"ONLY_FULL_GROUP_BY"}
+ database_features = DatabaseFeatures(_connection)
+ self.assertIs(database_features.allows_group_by_selected_pks, False)