Fixed #31770 -- Allowed select_for_update(of) on MySQL 8.0.1+.

This commit is contained in:
Simon Charette 2020-07-12 00:25:03 -04:00 committed by Mariusz Felisiak
parent f36862b69c
commit ca6c5e5fc2
4 changed files with 13 additions and 4 deletions

View File

@ -117,6 +117,10 @@ class DatabaseFeatures(BaseDatabaseFeatures):
return self.connection.mysql_version >= (10, 3, 0) return self.connection.mysql_version >= (10, 3, 0)
return self.connection.mysql_version >= (8, 0, 1) return self.connection.mysql_version >= (8, 0, 1)
@cached_property
def has_select_for_update_of(self):
return not self.connection.mysql_is_mariadb and self.connection.mysql_version >= (8, 0, 1)
@cached_property @cached_property
def supports_explain_analyze(self): def supports_explain_analyze(self):
return self.connection.mysql_is_mariadb or self.connection.mysql_version >= (8, 0, 18) return self.connection.mysql_is_mariadb or self.connection.mysql_version >= (8, 0, 18)

View File

@ -639,7 +639,7 @@ Option MariaDB MySQL
=============== ========= ========== =============== ========= ==========
``SKIP LOCKED`` X (≥8.0.1) ``SKIP LOCKED`` X (≥8.0.1)
``NOWAIT`` X (≥10.3) X (≥8.0.1) ``NOWAIT`` X (≥10.3) X (≥8.0.1)
``OF`` ``OF`` X (≥8.0.1)
``NO KEY`` ``NO KEY``
=============== ========= ========== =============== ========= ==========

View File

@ -1729,9 +1729,9 @@ them::
Currently, the ``postgresql``, ``oracle``, and ``mysql`` database Currently, the ``postgresql``, ``oracle``, and ``mysql`` database
backends support ``select_for_update()``. However, MariaDB 10.3+ supports only backends support ``select_for_update()``. However, MariaDB 10.3+ supports only
the ``nowait`` argument and MySQL 8.0.1+ supports the ``nowait`` and the ``nowait`` argument and MySQL 8.0.1+ supports the ``nowait``,
``skip_locked`` arguments. MySQL and MariaDB don't support the ``of`` argument. ``skip_locked``, and ``of`` arguments. The ``no_key`` argument is supported
The ``no_key`` argument is supported only on PostgreSQL. only on PostgreSQL.
Passing ``nowait=True``, ``skip_locked=True``, ``no_key=True``, or ``of`` to Passing ``nowait=True``, ``skip_locked=True``, ``no_key=True``, or ``of`` to
``select_for_update()`` using database backends that do not support these ``select_for_update()`` using database backends that do not support these
@ -1769,6 +1769,8 @@ raised if ``select_for_update()`` is used in autocommit mode.
The ``no_key`` argument was added. The ``no_key`` argument was added.
The ``of`` argument was allowed on MySQL 8.0.1+.
``raw()`` ``raw()``
~~~~~~~~~ ~~~~~~~~~

View File

@ -230,6 +230,9 @@ Models
* :class:`FilteredRelation() <django.db.models.FilteredRelation>` now supports * :class:`FilteredRelation() <django.db.models.FilteredRelation>` now supports
nested relations. nested relations.
* The ``of`` argument of :meth:`.QuerySet.select_for_update()` is now allowed
on MySQL 8.0.1+.
Requests and Responses Requests and Responses
~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~