mirror of
https://github.com/django/django.git
synced 2025-10-24 06:06:09 +00:00
Fixed #23605 -- Fixed nested subquery regression
Added relabeled_clone() method to sql.Query to fix the problem. It manifested itself in rare cases where at least double nested subquery's filter condition might target non-existing alias. Thanks to Trac alias ris for reporting the problem.
This commit is contained in:
committed by
Tim Graham
parent
21e21c7bc2
commit
5c481db295
@@ -28,7 +28,8 @@ from .models import (
|
||||
JobResponsibilities, BaseA, FK1, Identifier, Program, Channel, Page, Paragraph,
|
||||
Chapter, Book, MyObject, Order, OrderItem, SharedConnection, Task, Staff,
|
||||
StaffUser, CategoryRelationship, Ticket21203Parent, Ticket21203Child, Person,
|
||||
Company, Employment, CustomPk, CustomPkTag, Classroom, School, Student)
|
||||
Company, Employment, CustomPk, CustomPkTag, Classroom, School, Student,
|
||||
Ticket23605A, Ticket23605B, Ticket23605C)
|
||||
|
||||
|
||||
class BaseQuerysetTest(TestCase):
|
||||
@@ -3615,3 +3616,39 @@ class Ticket22429Tests(TestCase):
|
||||
|
||||
queryset = Student.objects.filter(~Q(classroom__school=F('school')))
|
||||
self.assertQuerysetEqual(queryset, [st2], lambda x: x)
|
||||
|
||||
|
||||
class Ticket23605Tests(TestCase):
|
||||
def test_ticket_23605(self):
|
||||
# Test filtering on a complicated q-object from ticket's report.
|
||||
# The query structure is such that we have multiple nested subqueries.
|
||||
# The original problem was that the inner queries weren't relabeled
|
||||
# correctly.
|
||||
a1 = Ticket23605A.objects.create()
|
||||
a2 = Ticket23605A.objects.create()
|
||||
c1 = Ticket23605C.objects.create(field_c0=10000.0)
|
||||
Ticket23605B.objects.create(
|
||||
field_b0=10000.0, field_b1=True,
|
||||
modelc_fk=c1, modela_fk=a1)
|
||||
complex_q = Q(pk__in=Ticket23605A.objects.filter(
|
||||
Q(
|
||||
# True for a1 as field_b0 = 10000, field_c0=10000
|
||||
# False for a2 as no ticket23605b found
|
||||
ticket23605b__field_b0__gte=1000000 /
|
||||
F("ticket23605b__modelc_fk__field_c0")
|
||||
) &
|
||||
# True for a1 (field_b1=True)
|
||||
Q(ticket23605b__field_b1=True) &
|
||||
~Q(ticket23605b__pk__in=Ticket23605B.objects.filter(
|
||||
~(
|
||||
# Same filters as above commented filters, but
|
||||
# double-negated (one for Q() above, one for
|
||||
# parentheses). So, again a1 match, a2 not.
|
||||
Q(field_b1=True) &
|
||||
Q(field_b0__gte=1000000 / F("modelc_fk__field_c0"))
|
||||
)
|
||||
))).filter(ticket23605b__field_b1=True))
|
||||
qs1 = Ticket23605A.objects.filter(complex_q)
|
||||
self.assertQuerysetEqual(qs1, [a1], lambda x: x)
|
||||
qs2 = Ticket23605A.objects.exclude(complex_q)
|
||||
self.assertQuerysetEqual(qs2, [a2], lambda x: x)
|
||||
|
||||
Reference in New Issue
Block a user