#35836: ORM can produce invalid SQL when subclassing Query
-------------------------------------+-------------------------------------
Reporter: Ben Pearman | Type: Bug
Status: new | Component: Database
| layer (models, ORM)
Version: 5.0 | Severity: Normal
Keywords: | Triage Stage:
| Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
We have observed a bug in the ORM where invalid SQL can be produced.
A reproduction can be seen here:
https://github.com/benpearman/django-orm-bug
And specifically:
https://github.com/benpearman/django-orm-bug/blob/master/demo/models.py
It is caused with the following steps:
1. Subclassing {{{django.db.models.sql.Query}}} and using it in a Queryset
mixin
2. Creating a queryset with an {{{exclude()}}} expression which includes a
subquery. EG {{{Classroom.objects.exclude(student_set__id=student_A.id)}}}
3. Then before calling {{{super().get_compiler}}} from our subclassed
Query:
- Clone the query
- Adding a simple expression via {{{cloned_query.add_q}}} eg
{{{cloned_query.add_q(Q(school_id=1))}}}
- Passing the cloned query into {{{super().get_compiler}}}
4. Then evaluate the queryset, which produces invalid SQL and raises
{{{django.db.utils.OperationalError}}}
Note the issue happens when get_compiler is invoked for the subquery, not
on the main query itself.
This was working for us in Django 3.2, but not for Django 4.1
git bisect shows the breakage was introduced by this commit:
https://github.com/django/django/commit/14c8504a37afad96ab93cf82f47b13bcc4d00621
--
Ticket URL: <https://code.djangoproject.com/ticket/35836>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/010701928830caea-8533521c-6529-4141-85ea-578298338bbb-000000%40eu-central-1.amazonses.com.