diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py index b1d67e6653..e8bd921083 100644 --- a/django/db/models/expressions.py +++ b/django/db/models/expressions.py @@ -977,7 +977,6 @@ class Subquery(Expression): template = template or template_params.get('template', self.template) sql = template % template_params - sql = connection.ops.unification_cast_sql(self.output_field) % sql return sql, sql_params def _prepare(self, output_field): diff --git a/docs/releases/1.11.2.txt b/docs/releases/1.11.2.txt index 4dcfda7cc7..718dc386bb 100644 --- a/docs/releases/1.11.2.txt +++ b/docs/releases/1.11.2.txt @@ -39,3 +39,6 @@ Bugfixes * Fixed ``MultipleObjectMixin.paginate_queryset()`` crash on Python 2 if the ``InvalidPage`` message contains non-ASCII (:ticket:`28204`). + +* Prevented ``Subquery`` from adding an unnecessary ``CAST`` which resulted in + invalid SQL (:ticket:`28199`). diff --git a/tests/expressions/models.py b/tests/expressions/models.py index 6dc956c8fe..b1a737d0b9 100644 --- a/tests/expressions/models.py +++ b/tests/expressions/models.py @@ -1,9 +1,10 @@ """ Tests for F() query expression syntax. """ - from __future__ import unicode_literals +import uuid + from django.db import models from django.utils.encoding import python_2_unicode_compatible @@ -88,9 +89,14 @@ class SimulationRun(models.Model): return "%s (%s to %s)" % (self.midpoint, self.start, self.end) +class UUIDPK(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4) + + @python_2_unicode_compatible class UUID(models.Model): uuid = models.UUIDField(null=True) + uuid_fk = models.ForeignKey(UUIDPK, models.CASCADE, null=True) def __str__(self): return "%s" % self.uuid diff --git a/tests/expressions/tests.py b/tests/expressions/tests.py index 6e5cf58295..253a9c0429 100644 --- a/tests/expressions/tests.py +++ b/tests/expressions/tests.py @@ -25,7 +25,8 @@ from django.test.utils import Approximate from django.utils import six from .models import ( - UUID, Company, Employee, Experiment, Number, Result, SimulationRun, Time, + UUID, UUIDPK, Company, Employee, Experiment, Number, Result, SimulationRun, + Time, ) @@ -480,6 +481,12 @@ class BasicExpressionsTests(TestCase): subquery_test2 = Company.objects.filter(pk=Subquery(small_companies.filter(num_employees=3))) self.assertCountEqual(subquery_test2, [self.foobar_ltd]) + def test_uuid_pk_subquery(self): + u = UUIDPK.objects.create() + UUID.objects.create(uuid_fk=u) + qs = UUIDPK.objects.filter(id__in=Subquery(UUID.objects.values('uuid_fk__id'))) + self.assertCountEqual(qs, [u]) + def test_nested_subquery(self): inner = Company.objects.filter(point_of_contact=OuterRef('pk')) outer = Employee.objects.annotate(is_point_of_contact=Exists(inner))