mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #24752 -- query crash when reusing Case expressions
Case expressions weren't copied deep enough (self.cases list was reused resulting in an error).
This commit is contained in:
		
				
					committed by
					
						 Tim Graham
						Tim Graham
					
				
			
			
				
	
			
			
			
						parent
						
							9096e2b5f7
						
					
				
				
					commit
					7b05d2fdae
				
			| @@ -780,6 +780,11 @@ class Case(Expression): | ||||
|         c.default = c.default.resolve_expression(query, allow_joins, reuse, summarize, for_save) | ||||
|         return c | ||||
|  | ||||
|     def copy(self): | ||||
|         c = super(Case, self).copy() | ||||
|         c.cases = c.cases[:] | ||||
|         return c | ||||
|  | ||||
|     def as_sql(self, compiler, connection, template=None, extra=None): | ||||
|         connection.ops.check_expression_support(self) | ||||
|         if not self.cases: | ||||
|   | ||||
| @@ -10,3 +10,6 @@ Bugfixes | ||||
| ======== | ||||
|  | ||||
| * Fixed check for template engine alias uniqueness (:ticket:`24685`). | ||||
|  | ||||
| * Fixed crash when reusing the same ``Case`` instance in a query | ||||
|   (:ticket:`24752`). | ||||
|   | ||||
| @@ -274,6 +274,18 @@ class CaseExpressionTests(TestCase): | ||||
|             transform=attrgetter('integer', 'integer2') | ||||
|         ) | ||||
|  | ||||
|     def test_case_reuse(self): | ||||
|         SOME_CASE = Case( | ||||
|             When(pk=0, then=Value('0')), | ||||
|             default=Value('1'), | ||||
|             output_field=models.CharField(), | ||||
|         ) | ||||
|         self.assertQuerysetEqual( | ||||
|             CaseTestModel.objects.annotate(somecase=SOME_CASE).order_by('pk'), | ||||
|             CaseTestModel.objects.annotate(somecase=SOME_CASE).order_by('pk').values_list('pk', 'somecase'), | ||||
|             lambda x: (x.pk, x.somecase) | ||||
|         ) | ||||
|  | ||||
|     def test_aggregate(self): | ||||
|         self.assertEqual( | ||||
|             CaseTestModel.objects.aggregate( | ||||
|   | ||||
		Reference in New Issue
	
	Block a user