mirror of
https://github.com/django/django.git
synced 2025-06-05 03:29:12 +00:00
Fixed #20091 -- Oracle null promotion for empty strings
This commit is contained in:
parent
a4b8a4b632
commit
e17fa9e877
@ -1078,6 +1078,14 @@ class Query(object):
|
|||||||
elif isinstance(value, ExpressionNode):
|
elif isinstance(value, ExpressionNode):
|
||||||
# If value is a query expression, evaluate it
|
# If value is a query expression, evaluate it
|
||||||
value = SQLEvaluator(value, self, reuse=can_reuse)
|
value = SQLEvaluator(value, self, reuse=can_reuse)
|
||||||
|
# For Oracle '' is equivalent to null. The check needs to be done
|
||||||
|
# at this stage because join promotion can't be done at compiler
|
||||||
|
# stage. Using DEFAULT_DB_ALIAS isn't nice, but it is the best we
|
||||||
|
# can do here. Similar thing is done in is_nullable(), too.
|
||||||
|
if (connections[DEFAULT_DB_ALIAS].features.interprets_empty_strings_as_nulls and
|
||||||
|
lookup_type == 'exact' and value == ''):
|
||||||
|
value = True
|
||||||
|
lookup_type = 'isnull'
|
||||||
|
|
||||||
for alias, aggregate in self.aggregates.items():
|
for alias, aggregate in self.aggregates.items():
|
||||||
if alias in (parts[0], LOOKUP_SEP.join(parts)):
|
if alias in (parts[0], LOOKUP_SEP.join(parts)):
|
||||||
|
@ -1785,7 +1785,6 @@ class Queries6Tests(TestCase):
|
|||||||
|
|
||||||
# Nested queries are possible (although should be used with care, since
|
# Nested queries are possible (although should be used with care, since
|
||||||
# they have performance problems on backends like MySQL.
|
# they have performance problems on backends like MySQL.
|
||||||
|
|
||||||
self.assertQuerysetEqual(
|
self.assertQuerysetEqual(
|
||||||
Annotation.objects.filter(notes__in=Note.objects.filter(note="n1")),
|
Annotation.objects.filter(notes__in=Note.objects.filter(note="n1")),
|
||||||
['<Annotation: a1>']
|
['<Annotation: a1>']
|
||||||
@ -2824,3 +2823,11 @@ class Ticket20101Tests(TestCase):
|
|||||||
self.assertTrue(n in qs1)
|
self.assertTrue(n in qs1)
|
||||||
self.assertFalse(n in qs2)
|
self.assertFalse(n in qs2)
|
||||||
self.assertTrue(n in (qs1 | qs2))
|
self.assertTrue(n in (qs1 | qs2))
|
||||||
|
|
||||||
|
class EmptyStringPromotionTests(TestCase):
|
||||||
|
def test_empty_string_promotion(self):
|
||||||
|
qs = RelatedObject.objects.filter(single__name='')
|
||||||
|
if connection.features.interprets_empty_strings_as_nulls:
|
||||||
|
self.assertIn('LEFT OUTER JOIN', str(qs.query))
|
||||||
|
else:
|
||||||
|
self.assertNotIn('LEFT OUTER JOIN', str(qs.query))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user