diff options
| author | Simon Charette <charette.s@gmail.com> | 2022-11-06 11:19:33 -0500 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-11-07 20:23:53 +0100 |
| commit | 76e37513e22f4d9a01c7f15eee36fe44388e6670 (patch) | |
| tree | 575decec7547c3c128857b0444f342452865a0f9 /django/db/models/sql/compiler.py | |
| parent | 4b702c832cd550fe682ef37a69e93866815b9123 (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.py | 37 |
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) |
