diff --git a/django/contrib/gis/db/backends/base/features.py b/django/contrib/gis/db/backends/base/features.py index a88ad03684..9d1c1b04da 100644 --- a/django/contrib/gis/db/backends/base/features.py +++ b/django/contrib/gis/db/backends/base/features.py @@ -51,6 +51,9 @@ class BaseSpatialFeatures: # Can SchemaEditor alter geometry fields? can_alter_geometry_field = True + # Do the database functions/aggregates support the tolerance parameter? + supports_tolerance_parameter = False + # Set of options that AsGeoJSON() doesn't support. unsupported_geojson_options = {} diff --git a/django/contrib/gis/db/backends/oracle/features.py b/django/contrib/gis/db/backends/oracle/features.py index 80c71e0dcb..c458eb33c6 100644 --- a/django/contrib/gis/db/backends/oracle/features.py +++ b/django/contrib/gis/db/backends/oracle/features.py @@ -10,4 +10,5 @@ class DatabaseFeatures(BaseSpatialFeatures, OracleDatabaseFeatures): supports_geometry_field_unique_index = False supports_perimeter_geodetic = True supports_dwithin_distance_expr = False + supports_tolerance_parameter = True unsupported_geojson_options = {'bbox', 'crs', 'precision'} diff --git a/tests/gis_tests/distapp/tests.py b/tests/gis_tests/distapp/tests.py index dbf8c4b6fd..10a0f99efc 100644 --- a/tests/gis_tests/distapp/tests.py +++ b/tests/gis_tests/distapp/tests.py @@ -432,10 +432,7 @@ class DistanceFunctionsTests(FuncTestMixin, TestCase): ).filter(d=D(m=1)) self.assertTrue(qs.exists()) - @unittest.skipUnless( - connection.vendor == 'oracle', - 'Oracle supports tolerance parameter.', - ) + @skipUnlessDBFeature('supports_tolerance_parameter') def test_distance_function_tolerance_escaping(self): qs = Interstate.objects.annotate( d=Distance( @@ -448,10 +445,7 @@ class DistanceFunctionsTests(FuncTestMixin, TestCase): with self.assertRaisesMessage(TypeError, msg): qs.exists() - @unittest.skipUnless( - connection.vendor == 'oracle', - 'Oracle supports tolerance parameter.', - ) + @skipUnlessDBFeature('supports_tolerance_parameter') def test_distance_function_tolerance(self): # Tolerance is greater than distance. qs = Interstate.objects.annotate( diff --git a/tests/gis_tests/geoapp/tests.py b/tests/gis_tests/geoapp/tests.py index 607db43d4a..350bd04629 100644 --- a/tests/gis_tests/geoapp/tests.py +++ b/tests/gis_tests/geoapp/tests.py @@ -607,10 +607,7 @@ class GeoQuerySetTest(TestCase): ), True) self.assertIn('subquery', ctx.captured_queries[0]['sql']) - @unittest.skipUnless( - connection.vendor == 'oracle', - 'Oracle supports tolerance parameter.', - ) + @skipUnlessDBFeature('supports_tolerance_parameter') def test_unionagg_tolerance(self): City.objects.create( point=fromstr('POINT(-96.467222 32.751389)', srid=4326), @@ -633,10 +630,7 @@ class GeoQuerySetTest(TestCase): True, ) - @unittest.skipUnless( - connection.vendor == 'oracle', - 'Oracle supports tolerance parameter.', - ) + @skipUnlessDBFeature('supports_tolerance_parameter') def test_unionagg_tolerance_escaping(self): tx = Country.objects.get(name='Texas').mpoly with self.assertRaises(DatabaseError):