Fixed #26522 -- Fixed a nondeterministic AssertionError in QuerySet combining.
Thanks Andrew Brown for the test case.
This commit is contained in:
parent
dacdcec767
commit
9bbb6e2d25
1
AUTHORS
1
AUTHORS
|
@ -110,6 +110,7 @@ answer newbie questions, and generally made Django that much better:
|
||||||
berto
|
berto
|
||||||
Bill Fenner <fenner@gmail.com>
|
Bill Fenner <fenner@gmail.com>
|
||||||
Bjørn Stabell <bjorn@exoweb.net>
|
Bjørn Stabell <bjorn@exoweb.net>
|
||||||
|
Bo Marchman <bo.marchman@gmail.com>
|
||||||
Bojan Mihelac <bmihelac@mihelac.org>
|
Bojan Mihelac <bmihelac@mihelac.org>
|
||||||
Bouke Haarsma <bouke@haarsma.eu>
|
Bouke Haarsma <bouke@haarsma.eu>
|
||||||
Božidar Benko <bbenko@gmail.com>
|
Božidar Benko <bbenko@gmail.com>
|
||||||
|
|
|
@ -126,7 +126,7 @@ class Query:
|
||||||
# types they are. The key is the alias of the joined table (possibly
|
# types they are. The key is the alias of the joined table (possibly
|
||||||
# the table name) and the value is a Join-like object (see
|
# the table name) and the value is a Join-like object (see
|
||||||
# sql.datastructures.Join for more information).
|
# sql.datastructures.Join for more information).
|
||||||
self.alias_map = {}
|
self.alias_map = OrderedDict()
|
||||||
# Sometimes the query contains references to aliases in outer queries (as
|
# Sometimes the query contains references to aliases in outer queries (as
|
||||||
# a result of split_exclude). Correct alias quoting needs to know these
|
# a result of split_exclude). Correct alias quoting needs to know these
|
||||||
# aliases too.
|
# aliases too.
|
||||||
|
|
|
@ -663,6 +663,11 @@ class Classroom(models.Model):
|
||||||
students = models.ManyToManyField(Student, related_name='classroom')
|
students = models.ManyToManyField(Student, related_name='classroom')
|
||||||
|
|
||||||
|
|
||||||
|
class Teacher(models.Model):
|
||||||
|
schools = models.ManyToManyField(School)
|
||||||
|
friends = models.ManyToManyField('self')
|
||||||
|
|
||||||
|
|
||||||
class Ticket23605AParent(models.Model):
|
class Ticket23605AParent(models.Model):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -24,8 +24,9 @@ from .models import (
|
||||||
ProxyCategory, ProxyObjectA, ProxyObjectB, Ranking, Related,
|
ProxyCategory, ProxyObjectA, ProxyObjectB, Ranking, Related,
|
||||||
RelatedIndividual, RelatedObject, Report, ReservedName, Responsibility,
|
RelatedIndividual, RelatedObject, Report, ReservedName, Responsibility,
|
||||||
School, SharedConnection, SimpleCategory, SingleObject, SpecialCategory,
|
School, SharedConnection, SimpleCategory, SingleObject, SpecialCategory,
|
||||||
Staff, StaffUser, Student, Tag, Task, Ticket21203Child, Ticket21203Parent,
|
Staff, StaffUser, Student, Tag, Task, Teacher, Ticket21203Child,
|
||||||
Ticket23605A, Ticket23605B, Ticket23605C, TvChef, Valid, X,
|
Ticket21203Parent, Ticket23605A, Ticket23605B, Ticket23605C, TvChef, Valid,
|
||||||
|
X,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1382,6 +1383,18 @@ class Queries4Tests(TestCase):
|
||||||
self.assertEqual(len(combined), 1)
|
self.assertEqual(len(combined), 1)
|
||||||
self.assertEqual(combined[0].name, 'a1')
|
self.assertEqual(combined[0].name, 'a1')
|
||||||
|
|
||||||
|
def test_join_reuse_order(self):
|
||||||
|
# Join aliases are reused in order. This shouldn't raise AssertionError
|
||||||
|
# because change_map contains a circular reference (#26522).
|
||||||
|
s1 = School.objects.create()
|
||||||
|
s2 = School.objects.create()
|
||||||
|
s3 = School.objects.create()
|
||||||
|
t1 = Teacher.objects.create()
|
||||||
|
otherteachers = Teacher.objects.exclude(pk=t1.pk).exclude(friends=t1)
|
||||||
|
qs1 = otherteachers.filter(schools=s1).filter(schools=s2)
|
||||||
|
qs2 = otherteachers.filter(schools=s1).filter(schools=s3)
|
||||||
|
self.assertQuerysetEqual(qs1 | qs2, [])
|
||||||
|
|
||||||
def test_ticket7095(self):
|
def test_ticket7095(self):
|
||||||
# Updates that are filtered on the model being updated are somewhat
|
# Updates that are filtered on the model being updated are somewhat
|
||||||
# tricky in MySQL.
|
# tricky in MySQL.
|
||||||
|
|
Loading…
Reference in New Issue