summaryrefslogtreecommitdiff
path: root/tests/queries
diff options
context:
space:
mode:
authorÖmer Faruk Abacı <omerfabaci@gmail.com>2021-11-30 16:50:13 +0300
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2021-12-08 21:16:24 +0100
commit81739a45b5ae8f534910aaabc7e9b457eaa34163 (patch)
tree3b0f260fabf48232ff8a8bc5e0a814f460e59e48 /tests/queries
parentf04b44bad40369ec2df74b16adb4d3f09350e4b2 (diff)
downloaddjango-81739a45b5ae8f534910aaabc7e9b457eaa34163.tar.gz
Fixed #33319 -- Fixed crash when combining with the | operator querysets with aliases that conflict.
Diffstat (limited to 'tests/queries')
-rw-r--r--tests/queries/models.py3
-rw-r--r--tests/queries/tests.py22
2 files changed, 23 insertions, 2 deletions
diff --git a/tests/queries/models.py b/tests/queries/models.py
index c3322c224e..8e7ee1625c 100644
--- a/tests/queries/models.py
+++ b/tests/queries/models.py
@@ -613,13 +613,14 @@ class OrderItem(models.Model):
class BaseUser(models.Model):
- pass
+ annotation = models.ForeignKey(Annotation, models.CASCADE, null=True, blank=True)
class Task(models.Model):
title = models.CharField(max_length=10)
owner = models.ForeignKey(BaseUser, models.CASCADE, related_name='owner')
creator = models.ForeignKey(BaseUser, models.CASCADE, related_name='creator')
+ note = models.ForeignKey(Note, on_delete=models.CASCADE, null=True, blank=True)
def __str__(self):
return self.title
diff --git a/tests/queries/tests.py b/tests/queries/tests.py
index ca982b9c6a..f146bc89fd 100644
--- a/tests/queries/tests.py
+++ b/tests/queries/tests.py
@@ -15,7 +15,7 @@ from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature
from django.test.utils import CaptureQueriesContext
from .models import (
- FK1, Annotation, Article, Author, BaseA, Book, CategoryItem,
+ FK1, Annotation, Article, Author, BaseA, BaseUser, Book, CategoryItem,
CategoryRelationship, Celebrity, Channel, Chapter, Child, ChildObjectA,
Classroom, CommonMixedCaseForeignKeys, Company, Cover, CustomPk,
CustomPkTag, DateTimePK, Detail, DumbCategory, Eaten, Employment,
@@ -2094,6 +2094,15 @@ class QuerySetBitwiseOperationTests(TestCase):
cls.room_2 = Classroom.objects.create(school=cls.school, has_blackboard=True, name='Room 2')
cls.room_3 = Classroom.objects.create(school=cls.school, has_blackboard=True, name='Room 3')
cls.room_4 = Classroom.objects.create(school=cls.school, has_blackboard=False, name='Room 4')
+ tag = Tag.objects.create()
+ cls.annotation_1 = Annotation.objects.create(tag=tag)
+ annotation_2 = Annotation.objects.create(tag=tag)
+ note = cls.annotation_1.notes.create(tag=tag)
+ cls.base_user_1 = BaseUser.objects.create(annotation=cls.annotation_1)
+ cls.base_user_2 = BaseUser.objects.create(annotation=annotation_2)
+ cls.task = Task.objects.create(
+ owner=cls.base_user_2, creator=cls.base_user_2, note=note,
+ )
@skipUnlessDBFeature('allow_sliced_subqueries_with_in')
def test_or_with_rhs_slice(self):
@@ -2130,6 +2139,17 @@ class QuerySetBitwiseOperationTests(TestCase):
nested_combined = School.objects.filter(pk__in=combined.values('pk'))
self.assertSequenceEqual(nested_combined, [self.school])
+ def test_conflicting_aliases_during_combine(self):
+ qs1 = self.annotation_1.baseuser_set.all()
+ qs2 = BaseUser.objects.filter(
+ Q(owner__note__in=self.annotation_1.notes.all()) |
+ Q(creator__note__in=self.annotation_1.notes.all())
+ )
+ self.assertSequenceEqual(qs1, [self.base_user_1])
+ self.assertSequenceEqual(qs2, [self.base_user_2])
+ self.assertCountEqual(qs2 | qs1, qs1 | qs2)
+ self.assertCountEqual(qs2 | qs1, [self.base_user_1, self.base_user_2])
+
class CloneTests(TestCase):