summaryrefslogtreecommitdiff
path: root/django/db/models/sql/where.py
diff options
context:
space:
mode:
authorIan Foote <python@ian.feete.org>2021-04-02 18:25:20 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-07-09 11:43:06 +0200
commitf42ccdd835e5b3f0914b5e6f87621c648136ea36 (patch)
tree49f0a1ecbd05b4d8d0049cec21ad564a663b427f /django/db/models/sql/where.py
parentf5dccbafb957841d0867f0b153d7f7123f0ec83d (diff)
Fixed #27021 -- Allowed lookup expressions in annotations, aggregations, and QuerySet.filter().
Thanks Hannes Ljungberg and Simon Charette for reviews. Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Diffstat (limited to 'django/db/models/sql/where.py')
-rw-r--r--django/db/models/sql/where.py19
1 files changed, 19 insertions, 0 deletions
diff --git a/django/db/models/sql/where.py b/django/db/models/sql/where.py
index 2577e1d7a5..5a4da97396 100644
--- a/django/db/models/sql/where.py
+++ b/django/db/models/sql/where.py
@@ -208,6 +208,25 @@ class WhereNode(tree.Node):
clone.resolved = True
return clone
+ @cached_property
+ def output_field(self):
+ from django.db.models import BooleanField
+ return BooleanField()
+
+ def select_format(self, compiler, sql, params):
+ # Wrap filters with a CASE WHEN expression if a database backend
+ # (e.g. Oracle) doesn't support boolean expression in SELECT or GROUP
+ # BY list.
+ if not compiler.connection.features.supports_boolean_expr_in_select_clause:
+ sql = f'CASE WHEN {sql} THEN 1 ELSE 0 END'
+ return sql, params
+
+ def get_db_converters(self, connection):
+ return self.output_field.get_db_converters(connection)
+
+ def get_lookup(self, lookup):
+ return self.output_field.get_lookup(lookup)
+
class NothingNode:
"""A node that matches nothing."""