From 8685e764efd2957085762d9249e07794d9a58dcb Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Fri, 15 Nov 2019 10:25:39 +0100 Subject: [PATCH] Fixed #30986 -- Fixed queryset crash when filtering against boolean RawSQL expressions on Oracle. --- django/db/backends/oracle/operations.py | 4 +++- tests/expressions/tests.py | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/django/db/backends/oracle/operations.py b/django/db/backends/oracle/operations.py index 59f55dccd5..3d093792b8 100644 --- a/django/db/backends/oracle/operations.py +++ b/django/db/backends/oracle/operations.py @@ -5,7 +5,7 @@ from functools import lru_cache from django.conf import settings from django.db.backends.base.operations import BaseDatabaseOperations from django.db.backends.utils import strip_quotes, truncate_name -from django.db.models.expressions import Exists, ExpressionWrapper +from django.db.models.expressions import Exists, ExpressionWrapper, RawSQL from django.db.models.query_utils import Q from django.db.utils import DatabaseError from django.utils import timezone @@ -636,4 +636,6 @@ END; return True if isinstance(expression, ExpressionWrapper) and isinstance(expression.expression, Q): return True + if isinstance(expression, RawSQL) and expression.conditional: + return True return False diff --git a/tests/expressions/tests.py b/tests/expressions/tests.py index 1dba3d083a..ee8b246966 100644 --- a/tests/expressions/tests.py +++ b/tests/expressions/tests.py @@ -92,6 +92,14 @@ class BasicExpressionsTests(TestCase): 2, ) + def test_filtering_on_rawsql_that_is_boolean(self): + self.assertEqual( + Company.objects.filter( + RawSQL('num_employees > %s', (3,), output_field=models.BooleanField()), + ).count(), + 2, + ) + def test_filter_inter_attribute(self): # We can filter on attribute relationships on same model obj, e.g. # find companies where the number of employees is greater