From 17160819f3d98a6355bfd608fe756a43cba33343 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Sun, 9 Feb 2025 12:57:40 +0100 Subject: [PATCH] Fixed #36105 -- Dropped support for MariaDB 10.5. --- django/db/backends/mysql/features.py | 27 +++------------------------ django/db/backends/mysql/schema.py | 21 +++------------------ docs/ref/databases.txt | 4 ++-- docs/ref/migration-operations.txt | 5 ++--- docs/releases/6.0.txt | 6 ++++++ tests/backends/mysql/tests.py | 4 ++-- 6 files changed, 18 insertions(+), 49 deletions(-) diff --git a/django/db/backends/mysql/features.py b/django/db/backends/mysql/features.py index 414f552d94..6e1b64c502 100644 --- a/django/db/backends/mysql/features.py +++ b/django/db/backends/mysql/features.py @@ -11,6 +11,7 @@ class DatabaseFeatures(BaseDatabaseFeatures): allow_sliced_subqueries_with_in = False has_select_for_update = True has_select_for_update_nowait = True + has_select_for_update_skip_locked = True supports_forward_references = False supports_regex_backreferencing = False supports_date_lookup_using_string = False @@ -26,6 +27,7 @@ class DatabaseFeatures(BaseDatabaseFeatures): supports_over_clause = True supports_frame_range_fixed_distance = True supports_update_conflicts = True + can_rename_index = True delete_can_self_reference_subquery = False create_test_procedure_without_params_sql = """ CREATE PROCEDURE test_procedure () @@ -65,7 +67,7 @@ class DatabaseFeatures(BaseDatabaseFeatures): @cached_property def minimum_database_version(self): if self.connection.mysql_is_mariadb: - return (10, 5) + return (10, 6) else: return (8, 0, 11) @@ -105,17 +107,6 @@ class DatabaseFeatures(BaseDatabaseFeatures): "update.tests.AdvancedTests.test_update_ordered_by_m2m_annotation_desc", }, } - if self.connection.mysql_is_mariadb and ( - self.connection.mysql_version < (10, 5, 2) - ): - skips.update( - { - "https://jira.mariadb.org/browse/MDEV-19598": { - "schema.tests.SchemaTests." - "test_alter_not_unique_field_to_primary_key", - }, - } - ) if not self.supports_explain_analyze: skips.update( { @@ -222,12 +213,6 @@ class DatabaseFeatures(BaseDatabaseFeatures): return True return self.connection.mysql_version >= (8, 0, 16) - @cached_property - def has_select_for_update_skip_locked(self): - if self.connection.mysql_is_mariadb: - return self.connection.mysql_version >= (10, 6) - return True - @cached_property def has_select_for_update_of(self): return not self.connection.mysql_is_mariadb @@ -300,12 +285,6 @@ class DatabaseFeatures(BaseDatabaseFeatures): operator.attrgetter("supports_select_intersection") ) - @cached_property - def can_rename_index(self): - if self.connection.mysql_is_mariadb: - return self.connection.mysql_version >= (10, 5, 2) - return True - @cached_property def supports_expression_defaults(self): if self.connection.mysql_is_mariadb: diff --git a/django/db/backends/mysql/schema.py b/django/db/backends/mysql/schema.py index b4192bb8cc..002ed20700 100644 --- a/django/db/backends/mysql/schema.py +++ b/django/db/backends/mysql/schema.py @@ -43,15 +43,6 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): return "ALTER TABLE %(table)s DROP CONSTRAINT IF EXISTS %(name)s" return "ALTER TABLE %(table)s DROP CHECK %(name)s" - @property - def sql_rename_column(self): - is_mariadb = self.connection.mysql_is_mariadb - if is_mariadb and self.connection.mysql_version < (10, 5, 2): - # MariaDB < 10.5.2 doesn't support an - # "ALTER TABLE ... RENAME COLUMN" statement. - return "ALTER TABLE %(table)s CHANGE %(old_column)s %(new_column)s %(type)s" - return super().sql_rename_column - def quote_value(self, value): self.connection.ensure_connection() # MySQLdb escapes to string, PyMySQL to bytes. @@ -241,16 +232,10 @@ class DatabaseSchemaEditor(BaseDatabaseSchemaEditor): ) def _field_db_check(self, field, field_db_params): - if self.connection.mysql_is_mariadb and self.connection.mysql_version >= ( - 10, - 5, - 2, - ): + if self.connection.mysql_is_mariadb: return super()._field_db_check(field, field_db_params) - # On MySQL and MariaDB < 10.5.2 (no support for - # "ALTER TABLE ... RENAME COLUMN" statements), check constraints with - # the column name as it requires explicit recreation when the column is - # renamed. + # On MySQL, check constraints with the column name as it requires + # explicit recreation when the column is renamed. return field_db_params["check"] def _rename_field_sql(self, table, old_field, new_field, new_type): diff --git a/docs/ref/databases.txt b/docs/ref/databases.txt index 541f6e6b71..77f0ac93ff 100644 --- a/docs/ref/databases.txt +++ b/docs/ref/databases.txt @@ -417,7 +417,7 @@ non-durable `_. MariaDB notes ============= -Django supports MariaDB 10.5 and higher. +Django supports MariaDB 10.6 and higher. To use MariaDB, use the MySQL backend, which is shared between the two. See the :ref:`MySQL notes ` for more details. @@ -774,7 +774,7 @@ a :exc:`~django.db.NotSupportedError` is raised. =============== ========= ===== Option MariaDB MySQL =============== ========= ===== -``SKIP LOCKED`` X (≥10.6) X +``SKIP LOCKED`` X X ``NOWAIT`` X X ``OF`` X ``NO KEY`` diff --git a/docs/ref/migration-operations.txt b/docs/ref/migration-operations.txt index f4d4ae96dd..8379221df5 100644 --- a/docs/ref/migration-operations.txt +++ b/docs/ref/migration-operations.txt @@ -259,9 +259,8 @@ Exactly one of ``old_name`` and ``old_fields`` can be provided. ``old_fields`` is an iterable of the strings, often corresponding to fields of ``index_together`` (pre-Django 5.1 option). -On databases that don't support an index renaming statement (SQLite and MariaDB -< 10.5.2), the operation will drop and recreate the index, which can be -expensive. +On databases that don't support an index renaming statement (SQLite), the +operation will drop and recreate the index, which can be expensive. ``AddConstraint`` ----------------- diff --git a/docs/releases/6.0.txt b/docs/releases/6.0.txt index 9dd7100c74..4e5f3c1f02 100644 --- a/docs/releases/6.0.txt +++ b/docs/releases/6.0.txt @@ -237,6 +237,12 @@ backends. * ... +Dropped support for MariaDB 10.5 +-------------------------------- + +Upstream support for MariaDB 10.5 ends in June 2025. Django 6.0 supports +MariaDB 10.6 and higher. + Dropped support for Python < 3.12 --------------------------------- diff --git a/tests/backends/mysql/tests.py b/tests/backends/mysql/tests.py index 3c95b1b09f..e718f9fae4 100644 --- a/tests/backends/mysql/tests.py +++ b/tests/backends/mysql/tests.py @@ -106,8 +106,8 @@ class Tests(TestCase): @mock.patch.object(connection, "get_database_version") def test_check_database_version_supported(self, mocked_get_database_version): if connection.mysql_is_mariadb: - mocked_get_database_version.return_value = (10, 4) - msg = "MariaDB 10.5 or later is required (found 10.4)." + mocked_get_database_version.return_value = (10, 5) + msg = "MariaDB 10.6 or later is required (found 10.5)." else: mocked_get_database_version.return_value = (8, 0, 4) msg = "MySQL 8.0.11 or later is required (found 8.0.4)."