summaryrefslogtreecommitdiff
path: root/django/db/models/sql/subqueries.py
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2019-10-17 01:57:39 -0400
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-10-24 12:24:53 +0200
commit7acef095d73322f45dcceb99afa1a4e50b520479 (patch)
tree44390915d053c6789d7263c8c454581909d42fd3 /django/db/models/sql/subqueries.py
parente645f27907da0098ee08455d9f1acec14b285f98 (diff)
Fixed #23576 -- Implemented multi-alias fast-path deletion in MySQL backend.
This required moving the entirety of DELETE SQL generation to the compiler where it should have been in the first place and implementing a specialized compiler on MySQL/MariaDB. The MySQL compiler relies on the "DELETE table FROM table JOIN" syntax for queries spanning over multiple tables.
Diffstat (limited to 'django/db/models/sql/subqueries.py')
-rw-r--r--django/db/models/sql/subqueries.py35
1 files changed, 0 insertions, 35 deletions
diff --git a/django/db/models/sql/subqueries.py b/django/db/models/sql/subqueries.py
index fbc265d113..af48239cdc 100644
--- a/django/db/models/sql/subqueries.py
+++ b/django/db/models/sql/subqueries.py
@@ -3,7 +3,6 @@ Query subclasses which provide extra functionality beyond simple data retrieval.
"""
from django.core.exceptions import FieldError
-from django.db import connections
from django.db.models.query_utils import Q
from django.db.models.sql.constants import (
CURSOR, GET_ITERATOR_CHUNK_SIZE, NO_RESULTS,
@@ -41,40 +40,6 @@ class DeleteQuery(Query):
num_deleted += self.do_query(self.get_meta().db_table, self.where, using=using)
return num_deleted
- def delete_qs(self, query, using):
- """
- Delete the queryset in one SQL query (if possible). For simple queries
- this is done by copying the query.query.where to self.query, for
- complex queries by using subquery.
- """
- innerq = query.query
- # Make sure the inner query has at least one table in use.
- innerq.get_initial_alias()
- # The same for our new query.
- self.get_initial_alias()
- innerq_used_tables = tuple([t for t in innerq.alias_map if innerq.alias_refcount[t]])
- if not innerq_used_tables or innerq_used_tables == tuple(self.alias_map):
- # There is only the base table in use in the query.
- self.where = innerq.where
- else:
- pk = query.model._meta.pk
- if not connections[using].features.update_can_self_select:
- # We can't do the delete using subquery.
- values = list(query.values_list('pk', flat=True))
- if not values:
- return 0
- return self.delete_batch(values, using)
- else:
- innerq.clear_select_clause()
- innerq.select = [
- pk.get_col(self.get_initial_alias())
- ]
- values = innerq
- self.where = self.where_class()
- self.add_q(Q(pk__in=values))
- cursor = self.get_compiler(using).execute_sql(CURSOR)
- return cursor.rowcount if cursor else 0
-
class UpdateQuery(Query):
"""An UPDATE SQL query."""