Fixed #33257 -- Fixed Case() and ExpressionWrapper() with decimal values on SQLite.

This commit is contained in:
Matthijs Kooijman 2021-11-04 18:24:19 +01:00 committed by Mariusz Felisiak
parent 4f8c7fd9d9
commit 1a5023883b
3 changed files with 18 additions and 2 deletions

View File

@ -933,7 +933,7 @@ class ExpressionList(Func):
return self.as_sql(compiler, connection, **extra_context) return self.as_sql(compiler, connection, **extra_context)
class ExpressionWrapper(Expression): class ExpressionWrapper(SQLiteNumericMixin, Expression):
""" """
An expression that can wrap another expression so that it can provide An expression that can wrap another expression so that it can provide
extra context to the inner expression, such as the output_field. extra context to the inner expression, such as the output_field.
@ -1032,7 +1032,7 @@ class When(Expression):
return cols return cols
class Case(Expression): class Case(SQLiteNumericMixin, Expression):
""" """
An SQL searched CASE expression: An SQL searched CASE expression:

View File

@ -1178,6 +1178,13 @@ class ExpressionsNumericTests(TestCase):
ordered=False ordered=False
) )
def test_filter_decimal_expression(self):
obj = Number.objects.create(integer=0, float=1, decimal_value=Decimal('1'))
qs = Number.objects.annotate(
x=ExpressionWrapper(Value(1), output_field=DecimalField()),
).filter(Q(x=1, integer=0) & Q(x=Decimal('1')))
self.assertSequenceEqual(qs, [obj])
def test_complex_expressions(self): def test_complex_expressions(self):
""" """
Complex expressions of different connection types are possible. Complex expressions of different connection types are possible.

View File

@ -256,6 +256,15 @@ class CaseExpressionTests(TestCase):
transform=attrgetter('integer', 'test') transform=attrgetter('integer', 'test')
) )
def test_annotate_filter_decimal(self):
obj = CaseTestModel.objects.create(integer=0, decimal=Decimal('1'))
qs = CaseTestModel.objects.annotate(
x=Case(When(integer=0, then=F('decimal'))),
y=Case(When(integer=0, then=Value(Decimal('1')))),
)
self.assertSequenceEqual(qs.filter(Q(x=1) & Q(x=Decimal('1'))), [obj])
self.assertSequenceEqual(qs.filter(Q(y=1) & Q(y=Decimal('1'))), [obj])
def test_annotate_values_not_in_order_by(self): def test_annotate_values_not_in_order_by(self):
self.assertEqual( self.assertEqual(
list(CaseTestModel.objects.annotate(test=Case( list(CaseTestModel.objects.annotate(test=Case(