Commit 0d6a776c authored by Russell Keith-Magee's avatar Russell Keith-Magee
Browse files

[1.1.X] Fixed #12328 -- Corrected the handling of subqueries with ordering and...

[1.1.X] Fixed #12328 -- Corrected the handling of subqueries with ordering and slicing, especially when used in delete subqueries. Thanks to Walter Doekes for the report.

This fixes a feature that isn't available under MySQL and Oracle (Refs #10099).

Backport of r12912 from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12914 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 17636ef9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -102,6 +102,7 @@ class BaseDatabaseFeatures(object):
    # If True, don't use integer foreign keys referring to, e.g., positive
    # integer primary keys.
    related_fields_match_type = False
    allow_sliced_subqueries = True

class BaseDatabaseOperations(object):
    """
+1 −0
Original line number Diff line number Diff line
@@ -113,6 +113,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
    update_can_self_select = False
    allows_group_by_pk = True
    related_fields_match_type = True
    allow_sliced_subqueries = False

class DatabaseOperations(BaseDatabaseOperations):
    def date_extract_sql(self, lookup_type, field_name):
+1 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
    interprets_empty_strings_as_nulls = True
    uses_savepoints = True
    can_return_id_from_insert = True
    allow_sliced_subqueries = False


class DatabaseOperations(BaseDatabaseOperations):
+7 −3
Original line number Diff line number Diff line
@@ -7,6 +7,8 @@ try:
except NameError:
    from sets import Set as set     # Python 2.3 fallback

from itertools import izip

from django.db import connection, transaction, IntegrityError
from django.db.models.aggregates import Aggregate
from django.db.models.fields import DateField
@@ -387,11 +389,13 @@ class QuerySet(object):
        # becoming too long.
        seen_objs = None
        while 1:
            # Collect all the objects to be deleted in this chunk, and all the
            # Collect a chunk of objects to be deleted, and then all the
            # objects that are related to the objects that are to be deleted.
            # The chunking *isn't* done by slicing the del_query because we
            # need to maintain the query cache on del_query (see #12328)
            seen_objs = CollectedObjects(seen_objs)
            for object in del_query[:CHUNK_SIZE]:
                object._collect_sub_objects(seen_objs)
            for i, obj in izip(xrange(CHUNK_SIZE), del_query):
                obj._collect_sub_objects(seen_objs)

            if not seen_objs:
                break
+5 −4
Original line number Diff line number Diff line
@@ -456,12 +456,13 @@ class BaseQuery(object):
        """
        Perform the same functionality as the as_sql() method, returning an
        SQL string and parameters. However, the alias prefixes are bumped
        beforehand (in a copy -- the current query isn't changed) and any
        ordering is removed.

        beforehand (in a copy -- the current query isn't changed), and any
        ordering is removed if the query is unsliced.
        Used when nesting this query inside another.
        """
        obj = self.clone()
        if obj.low_mark == 0 and obj.high_mark is None:
            # If there is no slicing in use, then we can safely drop all ordering
            obj.clear_ordering(True)
        obj.bump_prefix()
        return obj.as_sql()
Loading