diff --git a/django/contrib/gis/db/backends/mysql/operations.py b/django/contrib/gis/db/backends/mysql/operations.py index f4533a3b4ef..e9aec1e96c5 100644 --- a/django/contrib/gis/db/backends/mysql/operations.py +++ b/django/contrib/gis/db/backends/mysql/operations.py @@ -71,7 +71,10 @@ class MySQLOperations(BaseSpatialOperations, DatabaseOperations): models.Union, ] is_mariadb = self.connection.mysql_is_mariadb - if is_mariadb or self.connection.mysql_version < (8, 0, 24): + if is_mariadb: + if self.connection.mysql_version < (11, 7): + disallowed_aggregates.insert(0, models.Collect) + elif self.connection.mysql_version < (8, 0, 24): disallowed_aggregates.insert(0, models.Collect) return tuple(disallowed_aggregates) @@ -105,7 +108,8 @@ class MySQLOperations(BaseSpatialOperations, DatabaseOperations): } if self.connection.mysql_is_mariadb: unsupported.remove("PointOnSurface") - unsupported.update({"GeoHash", "IsValid"}) + if self.connection.mysql_version < (11, 7): + unsupported.update({"GeoHash", "IsValid"}) return unsupported def geo_db_type(self, f): diff --git a/docs/ref/contrib/gis/db-api.txt b/docs/ref/contrib/gis/db-api.txt index 8afc29869e1..b587f1d9bef 100644 --- a/docs/ref/contrib/gis/db-api.txt +++ b/docs/ref/contrib/gis/db-api.txt @@ -360,7 +360,7 @@ Lookup Type PostGIS Oracle MariaDB MySQL [#]_ S :lookup:`exact ` X X X X X B :lookup:`intersects` X X X X X B :lookup:`isempty` X -:lookup:`isvalid` X X X X +:lookup:`isvalid` X X X (≥ 11.7) X X :lookup:`overlaps` X X X X X B :lookup:`relate` X X X X C :lookup:`same_as` X X X X X B @@ -406,10 +406,10 @@ Function PostGIS Oracle MariaDB MySQL :class:`ForcePolygonCW` X X :class:`FromWKB` X X X X X :class:`FromWKT` X X X X X -:class:`GeoHash` X X X (LWGEOM/RTTOPO) +:class:`GeoHash` X X (≥ 11.7) X X (LWGEOM/RTTOPO) :class:`Intersection` X X X X X :class:`IsEmpty` X -:class:`IsValid` X X X X +:class:`IsValid` X X X (≥ 11.7) X X :class:`Length` X X X X X :class:`LineLocatePoint` X X :class:`MakeValid` X X (LWGEOM/RTTOPO) @@ -431,20 +431,19 @@ Aggregate Functions ------------------- The following table provides a summary of what GIS-specific aggregate functions -are available on each spatial backend. Please note that MariaDB does not -support any of these aggregates, and is thus excluded from the table. +are available on each spatial backend. .. currentmodule:: django.contrib.gis.db.models -======================= ======= ====== ============ ========== -Aggregate PostGIS Oracle MySQL SpatiaLite -======================= ======= ====== ============ ========== -:class:`Collect` X X (≥ 8.0.24) X -:class:`Extent` X X X +======================= ======= ====== ========== ============ ========== +Aggregate PostGIS Oracle MariaDB MySQL SpatiaLite +======================= ======= ====== ========== ============ ========== +:class:`Collect` X X (≥ 11.7) X (≥ 8.0.24) X +:class:`Extent` X X X :class:`Extent3D` X -:class:`MakeLine` X X -:class:`Union` X X X -======================= ======= ====== ============ ========== +:class:`MakeLine` X X +:class:`Union` X X X +======================= ======= ====== ========== ============ ========== .. rubric:: Footnotes .. [#fnwkt] *See* Open Geospatial Consortium, Inc., `OpenGIS Simple Feature Specification For SQL `_, Document 99-049 (May 5, 1999), at Ch. 3.2.5, p. 3-11 (SQL Textual Representation of Geometry). diff --git a/docs/ref/contrib/gis/functions.txt b/docs/ref/contrib/gis/functions.txt index ff05d0ec961..ff62c17580e 100644 --- a/docs/ref/contrib/gis/functions.txt +++ b/docs/ref/contrib/gis/functions.txt @@ -393,7 +393,7 @@ Creates geometry from `Well-known text (WKT)`_ representation. The optional .. class:: GeoHash(expression, precision=None, **extra) -*Availability*: `MySQL +*Availability*: MariaDB, `MySQL `__, `PostGIS `__, SpatiaLite (LWGEOM/RTTOPO) @@ -406,6 +406,10 @@ result. __ https://en.wikipedia.org/wiki/Geohash +.. versionchanged:: 5.2 + + MariaDB 11.7+ support was added. + ``GeometryDistance`` ==================== @@ -444,13 +448,17 @@ geometry. Returns ``True`` if its value is empty and ``False`` otherwise. .. class:: IsValid(expr) -*Availability*: `MySQL +*Availability*: MariaDB, `MySQL `__, `PostGIS `__, Oracle, SpatiaLite Accepts a geographic field or expression and tests if the value is well formed. Returns ``True`` if its value is a valid geometry and ``False`` otherwise. +.. versionchanged:: 5.2 + + MariaDB 11.7+ support was added. + ``Length`` ========== diff --git a/docs/ref/contrib/gis/geoquerysets.txt b/docs/ref/contrib/gis/geoquerysets.txt index 2bafa8eb437..607e743a2d5 100644 --- a/docs/ref/contrib/gis/geoquerysets.txt +++ b/docs/ref/contrib/gis/geoquerysets.txt @@ -370,8 +370,8 @@ Example:: ``isvalid`` ----------- -*Availability*: MySQL, `PostGIS `__, -Oracle, SpatiaLite +*Availability*: MariaDB, MySQL, +`PostGIS `__, Oracle, SpatiaLite Tests if the geometry is valid. @@ -379,12 +379,16 @@ Example:: Zipcode.objects.filter(poly__isvalid=True) -========================== ================================================================ -Backend SQL Equivalent -========================== ================================================================ -MySQL, PostGIS, SpatiaLite ``ST_IsValid(poly)`` -Oracle ``SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(poly, 0.05) = 'TRUE'`` -========================== ================================================================ +=================================== ================================================================ +Backend SQL Equivalent +=================================== ================================================================ +MariaDB, MySQL, PostGIS, SpatiaLite ``ST_IsValid(poly)`` +Oracle ``SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(poly, 0.05) = 'TRUE'`` +=================================== ================================================================ + +.. versionchanged:: 5.2 + + MariaDB 11.7+ support was added. .. fieldlookup:: overlaps @@ -876,8 +880,8 @@ Example: .. class:: Collect(geo_field, filter=None) -*Availability*: `PostGIS `__, MySQL, -SpatiaLite +*Availability*: `PostGIS `__, +MariaDB, MySQL, SpatiaLite Returns a ``GEOMETRYCOLLECTION`` or a ``MULTI`` geometry object from the geometry column. This is analogous to a simplified version of the :class:`Union` @@ -889,6 +893,10 @@ caring about dissolving boundaries. MySQL 8.0.24+ support was added. +.. versionchanged:: 5.2 + + MariaDB 11.7+ support was added. + ``Extent`` ~~~~~~~~~~ diff --git a/docs/releases/5.2.txt b/docs/releases/5.2.txt index faee74548ee..72fd0e219bc 100644 --- a/docs/releases/5.2.txt +++ b/docs/releases/5.2.txt @@ -102,7 +102,11 @@ Minor features * :lookup:`coveredby` lookup is now supported on MySQL. -* :lookup:`coveredby` lookup is now supported on MariaDB 11.7+. +* :lookup:`coveredby` and :lookup:`isvalid` lookups, + :class:`~django.contrib.gis.db.models.Collect` aggregation, and + :class:`~django.contrib.gis.db.models.functions.GeoHash` and + :class:`~django.contrib.gis.db.models.functions.IsValid` database functions + are now supported on MariaDB 11.7+. :mod:`django.contrib.messages` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~