Fixed #30986 -- Fixed queryset crash when filtering against boolean RawSQL expressions on Oracle.

This commit is contained in:
Mariusz Felisiak 2019-11-15 10:25:39 +01:00
parent 22a7a406c9
commit 8685e764ef
2 changed files with 11 additions and 1 deletions

View File

@ -5,7 +5,7 @@ from functools import lru_cache
from django.conf import settings from django.conf import settings
from django.db.backends.base.operations import BaseDatabaseOperations from django.db.backends.base.operations import BaseDatabaseOperations
from django.db.backends.utils import strip_quotes, truncate_name 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.models.query_utils import Q
from django.db.utils import DatabaseError from django.db.utils import DatabaseError
from django.utils import timezone from django.utils import timezone
@ -636,4 +636,6 @@ END;
return True return True
if isinstance(expression, ExpressionWrapper) and isinstance(expression.expression, Q): if isinstance(expression, ExpressionWrapper) and isinstance(expression.expression, Q):
return True return True
if isinstance(expression, RawSQL) and expression.conditional:
return True
return False return False

View File

@ -92,6 +92,14 @@ class BasicExpressionsTests(TestCase):
2, 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): def test_filter_inter_attribute(self):
# We can filter on attribute relationships on same model obj, e.g. # We can filter on attribute relationships on same model obj, e.g.
# find companies where the number of employees is greater # find companies where the number of employees is greater