Skip to content

Commit

Permalink
Fixed #35803 -- Added support for Collect, GeoHash, and IsValid on Ma…
Browse files Browse the repository at this point in the history
…riaDB 11.7+.
  • Loading branch information
felixxm authored and sarahboyce committed Oct 25, 2024
1 parent 0b7edb9 commit c775737
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 28 deletions.
8 changes: 6 additions & 2 deletions django/contrib/gis/db/backends/mysql/operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,10 @@ def disallowed_aggregates(self):
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)

Expand Down Expand Up @@ -105,7 +108,8 @@ def unsupported_functions(self):
}
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):
Expand Down
25 changes: 12 additions & 13 deletions docs/ref/contrib/gis/db-api.txt
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,7 @@ Lookup Type PostGIS Oracle MariaDB MySQL [#]_ S
:lookup:`exact <same_as>` 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
Expand Down Expand Up @@ -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)
Expand All @@ -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 <https://portal.ogc.org/files/?artifact_id=829>`_, Document 99-049 (May 5, 1999), at Ch. 3.2.5, p. 3-11 (SQL Textual Representation of Geometry).
Expand Down
12 changes: 10 additions & 2 deletions docs/ref/contrib/gis/functions.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
<https://dev.mysql.com/doc/refman/en/spatial-geohash-functions.html#function_st-geohash>`__,
`PostGIS <https://postgis.net/docs/ST_GeoHash.html>`__, SpatiaLite
(LWGEOM/RTTOPO)
Expand All @@ -406,6 +406,10 @@ result.

__ https://en.wikipedia.org/wiki/Geohash

.. versionchanged:: 5.2

MariaDB 11.7+ support was added.

``GeometryDistance``
====================

Expand Down Expand Up @@ -444,13 +448,17 @@ geometry. Returns ``True`` if its value is empty and ``False`` otherwise.

.. class:: IsValid(expr)

*Availability*: `MySQL
*Availability*: MariaDB, `MySQL
<https://dev.mysql.com/doc/refman/en/spatial-convenience-functions.html#function_st-isvalid>`__,
`PostGIS <https://postgis.net/docs/ST_IsValid.html>`__, 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``
==========

Expand Down
28 changes: 18 additions & 10 deletions docs/ref/contrib/gis/geoquerysets.txt
Original file line number Diff line number Diff line change
Expand Up @@ -370,21 +370,25 @@ Example::
``isvalid``
-----------

*Availability*: MySQL, `PostGIS <https://postgis.net/docs/ST_IsValid.html>`__,
Oracle, SpatiaLite
*Availability*: MariaDB, MySQL,
`PostGIS <https://postgis.net/docs/ST_IsValid.html>`__, Oracle, SpatiaLite

Tests if the geometry is valid.

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

Expand Down Expand Up @@ -876,8 +880,8 @@ Example:

.. class:: Collect(geo_field, filter=None)

*Availability*: `PostGIS <https://postgis.net/docs/ST_Collect.html>`__, MySQL,
SpatiaLite
*Availability*: `PostGIS <https://postgis.net/docs/ST_Collect.html>`__,
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`
Expand All @@ -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``
~~~~~~~~~~

Expand Down
6 changes: 5 additions & 1 deletion docs/releases/5.2.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Expand Down

0 comments on commit c775737

Please sign in to comment.