diff --git a/django/contrib/gis/db/models/aggregates.py b/django/contrib/gis/db/models/aggregates.py index c19cbd06c390..849388269677 100644 --- a/django/contrib/gis/db/models/aggregates.py +++ b/django/contrib/gis/db/models/aggregates.py @@ -4,7 +4,7 @@ GeometryField, LineStringField, ) -from django.db.models import Aggregate, Value +from django.db.models import Aggregate, Func, Value from django.utils.functional import cached_property __all__ = ["Collect", "Extent", "Extent3D", "MakeLine", "Union"] @@ -33,16 +33,20 @@ def as_oracle(self, compiler, connection, **extra_context): if not self.is_extent: tolerance = self.extra.get("tolerance") or getattr(self, "tolerance", 0.05) clone = self.copy() - clone.set_source_expressions( - [ - *self.get_source_expressions(), - Value(tolerance), - ] - ) - template = "%(function)s(SDOAGGRTYPE(%(expressions)s))" - return clone.as_sql( - compiler, connection, template=template, **extra_context + source_expressions = self.get_source_expressions() + if self.filter: + source_expressions.pop() + spatial_type_expr = Func( + *source_expressions, + Value(tolerance), + function="SDOAGGRTYPE", + output_field=self.output_field, ) + source_expressions = [spatial_type_expr] + if self.filter: + source_expressions.append(self.filter) + clone.set_source_expressions(source_expressions) + return clone.as_sql(compiler, connection, **extra_context) return self.as_sql(compiler, connection, **extra_context) def resolve_expression(