summaryrefslogtreecommitdiff
path: root/django/db/models/sql/compiler.py
diff options
context:
space:
mode:
authorSimon Charette <charette.s@gmail.com>2022-11-06 11:19:33 -0500
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-11-07 20:23:53 +0100
commit76e37513e22f4d9a01c7f15eee36fe44388e6670 (patch)
tree575decec7547c3c128857b0444f342452865a0f9 /django/db/models/sql/compiler.py
parent4b702c832cd550fe682ef37a69e93866815b9123 (diff)
Refs #33374 -- Adjusted full match condition handling.
Adjusting WhereNode.as_sql() to raise an exception when encoutering a full match just like with empty matches ensures that all case are explicitly handled.
Diffstat (limited to 'django/db/models/sql/compiler.py')
-rw-r--r--django/db/models/sql/compiler.py37
1 files changed, 25 insertions, 12 deletions
diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py
index 97c7ba2013..170bde1d42 100644
--- a/django/db/models/sql/compiler.py
+++ b/django/db/models/sql/compiler.py
@@ -4,7 +4,7 @@ import re
from functools import partial
from itertools import chain
-from django.core.exceptions import EmptyResultSet, FieldError
+from django.core.exceptions import EmptyResultSet, FieldError, FullResultSet
from django.db import DatabaseError, NotSupportedError
from django.db.models.constants import LOOKUP_SEP
from django.db.models.expressions import F, OrderBy, RawSQL, Ref, Value
@@ -169,7 +169,7 @@ class SQLCompiler:
expr = Ref(alias, expr)
try:
sql, params = self.compile(expr)
- except EmptyResultSet:
+ except (EmptyResultSet, FullResultSet):
continue
sql, params = expr.select_format(self, sql, params)
params_hash = make_hashable(params)
@@ -287,6 +287,8 @@ class SQLCompiler:
sql, params = "0", ()
else:
sql, params = self.compile(Value(empty_result_set_value))
+ except FullResultSet:
+ sql, params = self.compile(Value(True))
else:
sql, params = col.select_format(self, sql, params)
if alias is None and with_col_aliases:
@@ -721,9 +723,16 @@ class SQLCompiler:
raise
# Use a predicate that's always False.
where, w_params = "0 = 1", []
- having, h_params = (
- self.compile(self.having) if self.having is not None else ("", [])
- )
+ except FullResultSet:
+ where, w_params = "", []
+ try:
+ having, h_params = (
+ self.compile(self.having)
+ if self.having is not None
+ else ("", [])
+ )
+ except FullResultSet:
+ having, h_params = "", []
result = ["SELECT"]
params = []
@@ -1817,11 +1826,12 @@ class SQLDeleteCompiler(SQLCompiler):
)
def _as_sql(self, query):
- result = ["DELETE FROM %s" % self.quote_name_unless_alias(query.base_table)]
- where, params = self.compile(query.where)
- if where:
- result.append("WHERE %s" % where)
- return " ".join(result), tuple(params)
+ delete = "DELETE FROM %s" % self.quote_name_unless_alias(query.base_table)
+ try:
+ where, params = self.compile(query.where)
+ except FullResultSet:
+ return delete, ()
+ return f"{delete} WHERE {where}", tuple(params)
def as_sql(self):
"""
@@ -1906,8 +1916,11 @@ class SQLUpdateCompiler(SQLCompiler):
"UPDATE %s SET" % qn(table),
", ".join(values),
]
- where, params = self.compile(self.query.where)
- if where:
+ try:
+ where, params = self.compile(self.query.where)
+ except FullResultSet:
+ params = []
+ else:
result.append("WHERE %s" % where)
return " ".join(result), tuple(update_params + params)