summaryrefslogtreecommitdiff
path: root/django/db/models/sql
diff options
context:
space:
mode:
authorAnssi Kääriäinen <akaariai@gmail.com>2012-10-24 00:04:37 +0300
committerAnssi Kääriäinen <akaariai@gmail.com>2013-01-06 19:18:28 +0200
commita2396a4c8f2ccd7f91adee6d8c2e9c31f13f0e3f (patch)
treef1f67939a21dbf2ac08db770b9b6776754d05ad9 /django/db/models/sql
parenta843539af2f557e9bdc71b9b5ef66eabe0e39e3c (diff)
Fixed #19173 -- Made EmptyQuerySet a marker class only
The guarantee that no queries will be made when accessing results is done by new EmptyWhere class which is used for query.where and having. Thanks to Simon Charette for reviewing and valuable suggestions.
Diffstat (limited to 'django/db/models/sql')
-rw-r--r--django/db/models/sql/query.py9
-rw-r--r--django/db/models/sql/where.py8
2 files changed, 16 insertions, 1 deletions
diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py
index 87104f0d13..f021d571e9 100644
--- a/django/db/models/sql/query.py
+++ b/django/db/models/sql/query.py
@@ -25,7 +25,7 @@ from django.db.models.sql.constants import (QUERY_TERMS, ORDER_DIR, SINGLE,
from django.db.models.sql.datastructures import EmptyResultSet, Empty, MultiJoin
from django.db.models.sql.expressions import SQLEvaluator
from django.db.models.sql.where import (WhereNode, Constraint, EverythingNode,
- ExtraWhere, AND, OR)
+ ExtraWhere, AND, OR, EmptyWhere)
from django.core.exceptions import FieldError
__all__ = ['Query', 'RawQuery']
@@ -1511,6 +1511,13 @@ class Query(object):
self.add_filter(('%s__isnull' % trimmed_prefix, False), negate=True,
can_reuse=can_reuse)
+ def set_empty(self):
+ self.where = EmptyWhere()
+ self.having = EmptyWhere()
+
+ def is_empty(self):
+ return isinstance(self.where, EmptyWhere) or isinstance(self.having, EmptyWhere)
+
def set_limits(self, low=None, high=None):
"""
Adjusts the limits on the rows retrieved. We use low/high to set these,
diff --git a/django/db/models/sql/where.py b/django/db/models/sql/where.py
index 47f4ffaba9..02847b1f54 100644
--- a/django/db/models/sql/where.py
+++ b/django/db/models/sql/where.py
@@ -272,6 +272,14 @@ class WhereNode(tree.Node):
if hasattr(child[3], 'relabel_aliases'):
child[3].relabel_aliases(change_map)
+class EmptyWhere(WhereNode):
+
+ def add(self, data, connector):
+ return
+
+ def as_sql(self, qn=None, connection=None):
+ raise EmptyResultSet
+
class EverythingNode(object):
"""
A node that matches everything.