[5.1.x] Refs #35074 -- Avoided failed attempts to remove spatial indexes on nullable fields on MySQL.

MySQL doesn't support spatial indexes on NULL columns, so there is no
point in removing them.

Backport of 20c2d625d3 from main.
This commit is contained in:
Mariusz Felisiak 2024-06-18 22:19:11 +02:00 committed by Sarah Boyce
parent ba81b3f0a3
commit adb72fa854
2 changed files with 19 additions and 1 deletions

View File

@ -54,7 +54,7 @@ class MySQLGISSchemaEditor(DatabaseSchemaEditor):
self.create_spatial_indexes()
def remove_field(self, model, field):
if isinstance(field, GeometryField) and field.spatial_index:
if isinstance(field, GeometryField) and field.spatial_index and not field.null:
index_name = self._create_spatial_index_name(model, field)
sql = self._delete_index_sql(model, index_name)
try:

View File

@ -134,6 +134,24 @@ class OperationTests(OperationTestCase):
if self.has_spatial_indexes:
self.assertSpatialIndexExists("gis_neighborhood", "path")
@skipUnless(connection.vendor == "mysql", "MySQL specific test")
def test_remove_geom_field_nullable_with_index(self):
# MySQL doesn't support spatial indexes on NULL columns.
with self.assertNumQueries(1) as ctx:
self.alter_gis_model(
migrations.AddField,
"Neighborhood",
"path",
fields.LineStringField,
field_class_kwargs={"null": True},
)
self.assertColumnExists("gis_neighborhood", "path")
self.assertNotIn("CREATE SPATIAL INDEX", ctx.captured_queries[0]["sql"])
with self.assertNumQueries(1), self.assertNoLogs("django.contrib.gis", "ERROR"):
self.alter_gis_model(migrations.RemoveField, "Neighborhood", "path")
self.assertColumnNotExists("gis_neighborhood", "path")
@skipUnless(HAS_GEOMETRY_COLUMNS, "Backend doesn't support GeometryColumns.")
def test_geom_col_name(self):
self.assertEqual(