[1.11.x] Fixed #28689 -- Fixed unquoted table names in Subquery SQL when using OuterRef.

Regression in f48bc7c3dbd204eefb3c19016b1e4906ac26bee3.

Backport of 81e357a7e19f35235cc998459a10213532727d4e from master
This commit is contained in:
Mariusz Felisiak 2017-10-25 21:52:38 +02:00
parent e98ae4fe6b
commit 11f6d43566
4 changed files with 10 additions and 1 deletions

View File

@ -939,7 +939,7 @@ class Subquery(Expression):
)
# Add table alias to the parent query's aliases to prevent
# quoting.
if hasattr(resolved, 'alias'):
if hasattr(resolved, 'alias') and resolved.alias != resolved.target.model._meta.db_table:
clone.queryset.query.external_aliases.add(resolved.alias)
return resolved
return child

View File

@ -16,3 +16,6 @@ Bugfixes
* Made ``QuerySet.reverse()`` affect ``nulls_first`` and ``nulls_last``
(:ticket:`28722`).
* Fixed unquoted table names in ``Subquery`` SQL when using ``OuterRef``
(:ticket:`28689`).

View File

@ -56,6 +56,7 @@ class Experiment(models.Model):
end = models.DateTimeField()
class Meta:
db_table = 'expressions_ExPeRiMeNt'
ordering = ('name',)
def duration(self):

View File

@ -533,6 +533,11 @@ class BasicExpressionsTests(TestCase):
outer = Company.objects.filter(pk__in=Subquery(inner.values('pk')))
self.assertFalse(outer.exists())
def test_outerref_mixed_case_table_name(self):
inner = Result.objects.filter(result_time__gte=OuterRef('experiment__assigned'))
outer = Result.objects.filter(pk__in=Subquery(inner.values('pk')))
self.assertFalse(outer.exists())
class IterableLookupInnerExpressionsTests(TestCase):
@classmethod