mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #18247 -- Added cast to NUMERIC for Decimals on sqlite
On sqlite the SUM() of a decimal column doesn't have a NUMERIC type so when comparing it to a string literal (which a Decimal gets converted to in Django) it is not compared as expected.
This commit is contained in:
		
				
					committed by
					
						 Tim Graham
						Tim Graham
					
				
			
			
				
	
			
			
			
						parent
						
							b64c0d4d61
						
					
				
				
					commit
					3bbaf84d65
				
			| @@ -507,6 +507,15 @@ class Func(Expression): | ||||
|         template = template or self.extra.get('template', self.template) | ||||
|         return template % self.extra, params | ||||
|  | ||||
|     def as_sqlite(self, *args, **kwargs): | ||||
|         sql, params = self.as_sql(*args, **kwargs) | ||||
|         try: | ||||
|             if self.output_field.get_internal_type() == 'DecimalField': | ||||
|                 sql = 'CAST(%s AS NUMERIC)' % sql | ||||
|         except FieldError: | ||||
|             pass | ||||
|         return sql, params | ||||
|  | ||||
|     def copy(self): | ||||
|         copy = super(Func, self).copy() | ||||
|         copy.source_expressions = self.source_expressions[:] | ||||
|   | ||||
| @@ -349,6 +349,20 @@ class AggregationTests(TestCase): | ||||
|             {'c__max': 3} | ||||
|         ) | ||||
|  | ||||
|     def test_decimal_aggregate_annotation_filter(self): | ||||
|         """ | ||||
|         Filtering on an aggregate annotation with Decimal values should work. | ||||
|         Requires special handling on SQLite (#18247). | ||||
|         """ | ||||
|         self.assertEqual( | ||||
|             len(Author.objects.annotate(sum=Sum('book_contact_set__price')).filter(sum__gt=Decimal(40))), | ||||
|             1 | ||||
|         ) | ||||
|         self.assertEqual( | ||||
|             len(Author.objects.annotate(sum=Sum('book_contact_set__price')).filter(sum__lte=Decimal(40))), | ||||
|             4 | ||||
|         ) | ||||
|  | ||||
|     def test_field_error(self): | ||||
|         # Bad field requests in aggregates are caught and reported | ||||
|         self.assertRaises( | ||||
|   | ||||
		Reference in New Issue
	
	Block a user