1
0
mirror of https://github.com/django/django.git synced 2025-10-27 15:46:10 +00:00

Fixed #33759 -- Avoided unnecessary subquery in QuerySet.delete() with self-referential subqueries if supported.

This commit is contained in:
4the4ryushin
2023-04-28 02:33:25 +05:30
committed by Mariusz Felisiak
parent 5a6d4d3bfd
commit 0b0998dc15
4 changed files with 21 additions and 9 deletions

View File

@@ -12,6 +12,9 @@ class BaseDatabaseFeatures:
allows_group_by_select_index = True
empty_fetchmany_value = []
update_can_self_select = True
# Does the backend support self-reference subqueries in the DELETE
# statement?
delete_can_self_reference_subquery = True
# Does the backend distinguish between '' and None?
interprets_empty_strings_as_nulls = False

View File

@@ -24,6 +24,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
supports_slicing_ordering_in_compound = True
supports_index_on_text_field = False
supports_update_conflicts = True
delete_can_self_reference_subquery = False
create_test_procedure_without_params_sql = """
CREATE PROCEDURE test_procedure ()
BEGIN

View File

@@ -1890,7 +1890,10 @@ class SQLDeleteCompiler(SQLCompiler):
Create the SQL for this query. Return the SQL string and list of
parameters.
"""
if self.single_alias and not self.contains_self_reference_subquery:
if self.single_alias and (
self.connection.features.delete_can_self_reference_subquery
or not self.contains_self_reference_subquery
):
return self._as_sql(self.query)
innerq = self.query.clone()
innerq.__class__ = Query